int subsurface_fill_device_list(GtkListStore *store) { int i = 0; int index = -1; GtkTreeIter iter; GDir *dev; const char *name; char *buffer; gsize length; dev = g_dir_open("/dev", 0, NULL); while (dev && (name = g_dir_read_name(dev)) != NULL) { if (strstr(name, "USB")) { int len = strlen(name) + 6; char *devicename = malloc(len); snprintf(devicename, len, "/dev/%s", name); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, devicename, -1); if (is_default_dive_computer_device(devicename)) index = i; i++; } } if (dev) g_dir_close(dev); if (g_file_get_contents("/proc/mounts", &buffer, &length, NULL) && length > 0) { char *ptr = strstr(buffer, "UEMISSDA"); if (ptr) { char *end = ptr, *start = ptr; while (start > buffer && *start != ' ') start--; if (*start == ' ') start++; while (*end != ' ' && *end != '\0') end++; *end = '\0'; name = strdup(start); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, name, -1); if (is_default_dive_computer_device(name)) index = i; i++; free((void *)name); } g_free(buffer); } if (i == 0) { /* if we can't find anything, use the default */ gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, "/dev/ttyUSB0", -1); if (is_default_dive_computer_device("/dev/ttyUSB0")) index = i; } return index; }
int subsurface_fill_device_list(GtkListStore *store) { int i = 0; int index = -1; GtkTreeIter iter; GDir *dev; const char *name; dev = g_dir_open("/dev", 0, NULL); while (dev && (name = g_dir_read_name(dev)) != NULL) { if (strstr(name, "usbserial")) { int len = strlen(name) + 6; char *devicename = malloc(len); snprintf(devicename, len, "/dev/%s", name); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, devicename, -1); if (is_default_dive_computer_device(devicename)) index = i; i++; } } if (dev) g_dir_close(dev); dev = g_dir_open("/Volumes", 0, NULL); while (dev && (name = g_dir_read_name(dev)) != NULL) { if (strstr(name, "UEMISSDA")) { int len = strlen(name) + 10; char *devicename = malloc(len); snprintf(devicename, len, "/Volumes/%s", name); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, devicename, -1); if (is_default_dive_computer_device(devicename)) index = i; i++; } } if (dev) g_dir_close(dev); if (i == 0) { /* if we can't find anything, use the default */ gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, "/dev/tty.SLAB_USBtoUART", -1); if (is_default_dive_computer_device("/dev/tty.SLAB_USBtoUART")) index = i; } return index; }
void set_default_dive_computer_device(const char *name) { QSettings s; if (!name || !*name) return; if (is_default_dive_computer_device(name)) return; if (default_dive_computer_device) free((void *)default_dive_computer_device); default_dive_computer_device = strdup(name); s.beginGroup("DiveComputer"); s.setValue("dive_computer_device", name); s.endGroup(); }
int enumerate_devices (device_callback_t callback, void *userdata) { int index = -1; DIR *dp = NULL; struct dirent *ep = NULL; size_t i; const char *dirname = "/dev"; const char *patterns[] = { "ttyUSB*", "ttyS*", "ttyACM*", "rfcomm*", NULL }; dp = opendir (dirname); if (dp == NULL) { return -1; } while ((ep = readdir (dp)) != NULL) { for (i = 0; patterns[i] != NULL; ++i) { if (fnmatch (patterns[i], ep->d_name, 0) == 0) { char filename[1024]; int n = snprintf (filename, sizeof (filename), "%s/%s", dirname, ep->d_name); if (n >= sizeof (filename)) { closedir (dp); return -1; } callback (filename, userdata); if (is_default_dive_computer_device(filename)) index = i; break; } } } // TODO: list UEMIS mount point from /proc/mounts closedir (dp); return index; }
int subsurface_fill_device_list(GtkListStore *store) { const int bufdef = 512; const char *dlabels[] = {"UEMISSDA", NULL}; const char *devdef = "COM1"; GtkTreeIter iter; int index = -1, nentries = 0, ret, i; char bufname[bufdef], bufval[bufdef], *p; DWORD nvalues, bufval_len, bufname_len; HKEY key; /* add serial ports */ ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_READ, &key); if (ret == ERROR_SUCCESS) { ret = RegQueryInfoKeyA(key, NULL, NULL, NULL, NULL, NULL, NULL, &nvalues, NULL, NULL, NULL, NULL); if (ret == ERROR_SUCCESS) for (i = 0; i < nvalues; i++) { memset(bufval, 0, bufdef); memset(bufname, 0, bufdef); bufname_len = bufdef; bufval_len = bufdef; ret = RegEnumValueA(key, i, bufname, &bufname_len, NULL, NULL, bufval, &bufval_len); if (ret == ERROR_SUCCESS) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, bufval, -1); if (is_default_dive_computer_device(bufval)) index = nentries; nentries++; } } } /* add drive letters that match labels */ memset(bufname, 0, bufdef); bufname_len = bufdef; if (GetLogicalDriveStringsA(bufname_len, bufname)) { p = bufname; while (*p) { memset(bufval, 0, bufdef); if (GetVolumeInformationA(p, bufval, bufdef, NULL, NULL, NULL, NULL, 0)) { for (i = 0; dlabels[i] != NULL; i++) if (!strcmp(bufval, dlabels[i])) { char name[80]; snprintf(name, sizeof(name), "%s (%s)", p, dlabels[i]); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, name, -1); if (is_default_dive_computer_device(p)) index = nentries; nentries++; } } p = &p[strlen(p) + 1]; } } /* if we can't find anything, use the default */ if (!nentries) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, devdef, -1); if (is_default_dive_computer_device(devdef)) index = 0; } return index; }
int enumerate_devices(device_callback_t callback, void *userdata, unsigned int transport) { int index = -1, entries = 0; DIR *dp = NULL; struct dirent *ep = NULL; size_t i; if (transport & DC_TRANSPORT_SERIAL) { // on Mac we always support FTDI now callback("FTDI", userdata); const char *dirname = "/dev"; const char *patterns[] = { "tty.*", "usbserial", NULL }; dp = opendir(dirname); if (dp == NULL) { return -1; } while ((ep = readdir(dp)) != NULL) { for (i = 0; patterns[i] != NULL; ++i) { if (fnmatch(patterns[i], ep->d_name, 0) == 0) { char filename[1024]; int n = snprintf(filename, sizeof(filename), "%s/%s", dirname, ep->d_name); if (n >= (int)sizeof(filename)) { closedir(dp); return -1; } callback(filename, userdata); if (is_default_dive_computer_device(filename)) index = entries; entries++; break; } } } closedir(dp); } if (transport & DC_TRANSPORT_USBSTORAGE) { const char *dirname = "/Volumes"; int num_uemis = 0; dp = opendir(dirname); if (dp == NULL) { return -1; } while ((ep = readdir(dp)) != NULL) { if (fnmatch("UEMISSDA", ep->d_name, 0) == 0 || fnmatch("GARMIN", ep->d_name, 0) == 0) { char filename[1024]; int n = snprintf(filename, sizeof(filename), "%s/%s", dirname, ep->d_name); if (n >= (int)sizeof(filename)) { closedir(dp); return -1; } callback(filename, userdata); if (is_default_dive_computer_device(filename)) index = entries; entries++; num_uemis++; break; } } closedir(dp); if (num_uemis == 1 && entries == 1) /* if we find exactly one entry and that's a Uemis, select it */ index = 0; } return index; }
int enumerate_devices(device_callback_t callback, void *userdata, int dc_type) { int index = -1, entries = 0; DIR *dp = NULL; struct dirent *ep = NULL; size_t i; FILE *file; char *line = NULL; char *fname; size_t len; if (dc_type != DC_TYPE_UEMIS) { const char *dirname = "/dev"; const char *patterns[] = { "ttyUSB*", "ttyS*", "ttyACM*", "rfcomm*", NULL }; dp = opendir(dirname); if (dp == NULL) { return -1; } while ((ep = readdir(dp)) != NULL) { for (i = 0; patterns[i] != NULL; ++i) { if (fnmatch(patterns[i], ep->d_name, 0) == 0) { char filename[1024]; int n = snprintf(filename, sizeof(filename), "%s/%s", dirname, ep->d_name); if (n >= sizeof(filename)) { closedir(dp); return -1; } callback(filename, userdata); if (is_default_dive_computer_device(filename)) index = entries; entries++; break; } } } closedir(dp); } if (dc_type != DC_TYPE_SERIAL) { int num_uemis = 0; file = fopen("/proc/mounts", "r"); if (file == NULL) return index; while ((getline(&line, &len, file)) != -1) { char *ptr = strstr(line, "UEMISSDA"); if (ptr) { char *end = ptr, *start = ptr; while (start > line && *start != ' ') start--; if (*start == ' ') start++; while (*end != ' ' && *end != '\0') end++; *end = '\0'; fname = strdup(start); callback(fname, userdata); if (is_default_dive_computer_device(fname)) index = entries; entries++; num_uemis++; free((void *)fname); } } free(line); fclose(file); if (num_uemis == 1 && entries == 1) /* if we found only one and it's a mounted Uemis, pick it */ index = 0; } return index; }
int enumerate_devices(device_callback_t callback, void *userdata, int dc_type) { int index = -1, entries = 0; DIR *dp = NULL; struct dirent *ep = NULL; size_t i; if (dc_type != DC_TYPE_UEMIS) { const char *dirname = "/dev"; const char *patterns[] = { "tty.*", "usbserial", NULL }; dp = opendir(dirname); if (dp == NULL) { return -1; } while ((ep = readdir(dp)) != NULL) { for (i = 0; patterns[i] != NULL; ++i) { if (fnmatch(patterns[i], ep->d_name, 0) == 0) { char filename[1024]; int n = snprintf(filename, sizeof(filename), "%s/%s", dirname, ep->d_name); if (n >= sizeof(filename)) { closedir(dp); return -1; } callback(filename, userdata); if (is_default_dive_computer_device(filename)) index = entries; entries++; break; } } } closedir(dp); } if (dc_type != DC_TYPE_SERIAL) { const char *dirname = "/Volumes"; int num_uemis = 0; dp = opendir(dirname); if (dp == NULL) { return -1; } while ((ep = readdir(dp)) != NULL) { if (fnmatch("UEMISSDA", ep->d_name, 0) == 0) { char filename[1024]; int n = snprintf(filename, sizeof(filename), "%s/%s", dirname, ep->d_name); if (n >= sizeof(filename)) { closedir(dp); return -1; } callback(filename, userdata); if (is_default_dive_computer_device(filename)) index = entries; entries++; num_uemis++; break; } } closedir(dp); if (num_uemis == 1 && entries == 1) /* if we find exactly one entry and that's a Uemis, select it */ index = 0; } return index; }
int enumerate_devices(device_callback_t callback, void *userdata, int dc_type) { int index = -1; DWORD i; if (dc_type != DC_TYPE_UEMIS) { // Open the registry key. HKEY hKey; LONG rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_QUERY_VALUE, &hKey); if (rc != ERROR_SUCCESS) { return -1; } // Get the number of values. DWORD count = 0; rc = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &count, NULL, NULL, NULL, NULL); if (rc != ERROR_SUCCESS) { RegCloseKey(hKey); return -1; } for (i = 0; i < count; ++i) { // Get the value name, data and type. char name[512], data[512]; DWORD name_len = sizeof(name); DWORD data_len = sizeof(data); DWORD type = 0; rc = RegEnumValue(hKey, i, name, &name_len, NULL, &type, (LPBYTE)data, &data_len); if (rc != ERROR_SUCCESS) { RegCloseKey(hKey); return -1; } // Ignore non-string values. if (type != REG_SZ) continue; // Prevent a possible buffer overflow. if (data_len >= sizeof(data)) { RegCloseKey(hKey); return -1; } // Null terminate the string. data[data_len] = 0; callback(data, userdata); index++; if (is_default_dive_computer_device(name)) index = i; } RegCloseKey(hKey); } if (dc_type != DC_TYPE_SERIAL) { int i; int count_drives = 0; const int bufdef = 512; const char *dlabels[] = {"UEMISSDA", NULL}; char bufname[bufdef], bufval[bufdef], *p; DWORD bufname_len; /* add drive letters that match labels */ memset(bufname, 0, bufdef); bufname_len = bufdef; if (GetLogicalDriveStringsA(bufname_len, bufname)) { p = bufname; while (*p) { memset(bufval, 0, bufdef); if (GetVolumeInformationA(p, bufval, bufdef, NULL, NULL, NULL, NULL, 0)) { for (i = 0; dlabels[i] != NULL; i++) if (!strcmp(bufval, dlabels[i])) { char data[512]; snprintf(data, sizeof(data), "%s (%s)", p, dlabels[i]); callback(data, userdata); if (is_default_dive_computer_device(p)) index = count_drives; count_drives++; } } p = &p[strlen(p) + 1]; } if (count_drives == 1) /* we found exactly one Uemis "drive" */ index = 0; /* make it the selected "device" */ } } return index; }