summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2018-08-27 10:32:14 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2018-08-27 22:10:38 -0700
commit270e9eccad8644352f5ae07df8b6acb55b115361 (patch)
tree0b6aaee8221fc2c12d9b084e42179e1a2d9633f0
parentbb067b6ee4828fc2444395d4cfda80831c4721bb (diff)
downloadsubsurface-270e9eccad8644352f5ae07df8b6acb55b115361.tar.gz
Make device enumeration use the device transport data
This removes some special-case code for Uemis, replacing it with simply passing in the device transport information. This makes device enumeration work for the Garmin Descent (if it is listed by libdivecomputer as a USB storage device, that is). I don't actually do any of the libdivecomputer parsing yet, and only have a stub for the Garmin Descent, but now the directory selection works with that stub. The actual download obviously does not. [Dirk Hohndel: removed obsolete FIXME from code] Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--core/android.cpp2
-rw-r--r--core/display.h8
-rw-r--r--core/downloadfromdcthread.cpp6
-rw-r--r--core/downloadfromdcthread.h1
-rw-r--r--core/ios.cpp2
-rw-r--r--core/libdivecomputer.h5
-rw-r--r--core/macos.c6
-rw-r--r--core/unix.c6
-rw-r--r--core/windows.c6
-rw-r--r--desktop-widgets/configuredivecomputerdialog.cpp10
-rw-r--r--desktop-widgets/configuredivecomputerdialog.h2
-rw-r--r--desktop-widgets/downloadfromdivecomputer.cpp17
-rw-r--r--desktop-widgets/downloadfromdivecomputer.h2
13 files changed, 40 insertions, 33 deletions
diff --git a/core/android.cpp b/core/android.cpp
index 1a9e76e06..08b34dc73 100644
--- a/core/android.cpp
+++ b/core/android.cpp
@@ -81,7 +81,7 @@ const char *system_default_filename(void)
return path;
}
-int enumerate_devices(device_callback_t callback, void *userdata, int dc_type)
+int enumerate_devices(device_callback_t callback, void *userdata, unsigned int transport)
{
/* FIXME: we need to enumerate in some other way on android */
/* qtserialport maybee? */
diff --git a/core/display.h b/core/display.h
index b5b6a3938..67feee854 100644
--- a/core/display.h
+++ b/core/display.h
@@ -2,6 +2,8 @@
#ifndef DISPLAY_H
#define DISPLAY_H
+#include "libdivecomputer.h"
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -44,11 +46,7 @@ extern int is_default_dive_computer(const char *, const char *);
typedef void (*device_callback_t)(const char *name, void *userdata);
-#define DC_TYPE_SERIAL 1
-#define DC_TYPE_UEMIS 2
-#define DC_TYPE_OTHER 3
-
-int enumerate_devices(device_callback_t callback, void *userdata, int dc_type);
+int enumerate_devices(device_callback_t callback, void *userdata, unsigned int transport);
extern const char *default_dive_computer_vendor;
extern const char *default_dive_computer_product;
diff --git a/core/downloadfromdcthread.cpp b/core/downloadfromdcthread.cpp
index da8c09f54..6f957579c 100644
--- a/core/downloadfromdcthread.cpp
+++ b/core/downloadfromdcthread.cpp
@@ -158,6 +158,7 @@ void fill_computer_list()
mydescriptor->product = "Zurich";
mydescriptor->type = DC_FAMILY_NULL;
mydescriptor->model = 0;
+ mydescriptor->transports = DC_TRANSPORT_USBSTORAGE;
if (!vendorList.contains("Uemis"))
vendorList.append("Uemis");
@@ -171,14 +172,15 @@ void fill_computer_list()
qSort(vendorList);
}
-#define NUMTRANSPORTS 6
+#define NUMTRANSPORTS 7
static QString transportStringTable[NUMTRANSPORTS] = {
QStringLiteral("SERIAL"),
QStringLiteral("USB"),
QStringLiteral("USBHID"),
QStringLiteral("IRDA"),
QStringLiteral("BT"),
- QStringLiteral("BLE")
+ QStringLiteral("BLE"),
+ QStringLiteral("USBSTORAGE"),
};
static QString getTransportString(unsigned int transport)
diff --git a/core/downloadfromdcthread.h b/core/downloadfromdcthread.h
index 185f62aa4..265fb499e 100644
--- a/core/downloadfromdcthread.h
+++ b/core/downloadfromdcthread.h
@@ -78,6 +78,7 @@ struct mydescriptor {
const char *product;
dc_family_t type;
unsigned int model;
+ unsigned int transports;
};
/* This fills the vendor list QStringList and related members.
diff --git a/core/ios.cpp b/core/ios.cpp
index b951f4901..614107d2b 100644
--- a/core/ios.cpp
+++ b/core/ios.cpp
@@ -68,7 +68,7 @@ const char *system_default_filename(void)
return path;
}
-int enumerate_devices(device_callback_t, void *, int)
+int enumerate_devices(device_callback_t, void *, unsigned int)
{
// we can't read from devices on iOS
return -1;
diff --git a/core/libdivecomputer.h b/core/libdivecomputer.h
index b1714f2a1..050834195 100644
--- a/core/libdivecomputer.h
+++ b/core/libdivecomputer.h
@@ -12,6 +12,11 @@
#include <libdivecomputer/device.h>
#include <libdivecomputer/parser.h>
+// Even if we have an old libdivecomputer, Uemis uses this
+#ifndef DC_TRANSPORT_USBSTORAGE
+#define DC_TRANSPORT_USBSTORAGE (1 << 6)
+#endif
+
#include "dive.h"
#ifdef __cplusplus
diff --git a/core/macos.c b/core/macos.c
index e9ab7b8a8..05353b5ba 100644
--- a/core/macos.c
+++ b/core/macos.c
@@ -97,13 +97,13 @@ const char *system_default_filename(void)
return path;
}
-int enumerate_devices(device_callback_t callback, void *userdata, int dc_type)
+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 (dc_type != DC_TYPE_UEMIS) {
+ if (transport & DC_TRANSPORT_SERIAL) {
const char *dirname = "/dev";
const char *patterns[] = {
"tty.*",
@@ -135,7 +135,7 @@ int enumerate_devices(device_callback_t callback, void *userdata, int dc_type)
}
closedir(dp);
}
- if (dc_type != DC_TYPE_SERIAL) {
+ if (transport & DC_TRANSPORT_USBSTORAGE) {
const char *dirname = "/Volumes";
int num_uemis = 0;
dp = opendir(dirname);
diff --git a/core/unix.c b/core/unix.c
index 48fd3f467..1d92a1ad3 100644
--- a/core/unix.c
+++ b/core/unix.c
@@ -100,7 +100,7 @@ const char *system_default_filename(void)
return path;
}
-int enumerate_devices(device_callback_t callback, void *userdata, int dc_type)
+int enumerate_devices(device_callback_t callback, void *userdata, unsigned int transport)
{
int index = -1, entries = 0;
DIR *dp = NULL;
@@ -110,7 +110,7 @@ int enumerate_devices(device_callback_t callback, void *userdata, int dc_type)
char *line = NULL;
char *fname;
size_t len;
- if (dc_type != DC_TYPE_UEMIS) {
+ if (transport & DC_TRANSPORT_SERIAL) {
const char *dirname = "/dev";
#ifdef __OpenBSD__
const char *patterns[] = {
@@ -153,7 +153,7 @@ int enumerate_devices(device_callback_t callback, void *userdata, int dc_type)
closedir(dp);
}
#ifdef __linux__
- if (dc_type != DC_TYPE_SERIAL) {
+ if (transport & DC_TRANSPORT_USBSTORAGE) {
int num_uemis = 0;
file = fopen("/proc/mounts", "r");
if (file == NULL)
diff --git a/core/windows.c b/core/windows.c
index cb031e261..6feb3f740 100644
--- a/core/windows.c
+++ b/core/windows.c
@@ -117,11 +117,11 @@ const char *system_default_filename(void)
return path;
}
-int enumerate_devices(device_callback_t callback, void *userdata, int dc_type)
+int enumerate_devices(device_callback_t callback, void *userdata, unsigned int transport)
{
int index = -1;
DWORD i;
- if (dc_type != DC_TYPE_UEMIS) {
+ if (transport & DC_TRANSPORT_SERIAL) {
// Open the registry key.
HKEY hKey;
LONG rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_QUERY_VALUE, &hKey);
@@ -169,7 +169,7 @@ int enumerate_devices(device_callback_t callback, void *userdata, int dc_type)
RegCloseKey(hKey);
}
- if (dc_type != DC_TYPE_SERIAL) {
+ if (transport & DC_TRANSPORT_USBSTORAGE) {
int i;
int count_drives = 0;
const int bufdef = 512;
diff --git a/desktop-widgets/configuredivecomputerdialog.cpp b/desktop-widgets/configuredivecomputerdialog.cpp
index ed6c2d712..c23dfb8ab 100644
--- a/desktop-widgets/configuredivecomputerdialog.cpp
+++ b/desktop-widgets/configuredivecomputerdialog.cpp
@@ -398,11 +398,11 @@ static void fillDeviceList(const char *name, void *data)
comboBox->addItem(name);
}
-void ConfigureDiveComputerDialog::fill_device_list(int dc_type)
+void ConfigureDiveComputerDialog::fill_device_list(unsigned int transport)
{
int deviceIndex;
ui.device->clear();
- deviceIndex = enumerate_devices(fillDeviceList, ui.device, dc_type);
+ deviceIndex = enumerate_devices(fillDeviceList, ui.device, transport);
if (deviceIndex >= 0)
ui.device->setCurrentIndex(deviceIndex);
}
@@ -1445,12 +1445,12 @@ void ConfigureDiveComputerDialog::on_DiveComputerList_currentRowChanged(int curr
return;
}
- int dcType = DC_TYPE_SERIAL;
+ unsigned int transport = DC_TRANSPORT_SERIAL;
if (selected_vendor == QString("Uemis"))
- dcType = DC_TYPE_UEMIS;
- fill_device_list(dcType);
+ transport = DC_TRANSPORT_USBSTORAGE;
+ fill_device_list(transport);
}
void ConfigureDiveComputerDialog::checkLogFile(int state)
diff --git a/desktop-widgets/configuredivecomputerdialog.h b/desktop-widgets/configuredivecomputerdialog.h
index f8e3ea143..ba4e3361d 100644
--- a/desktop-widgets/configuredivecomputerdialog.h
+++ b/desktop-widgets/configuredivecomputerdialog.h
@@ -102,7 +102,7 @@ private:
device_data_t device_data;
void getDeviceData();
- void fill_device_list(int dc_type);
+ void fill_device_list(unsigned int transport);
DeviceDetails *deviceDetails;
void populateDeviceDetails();
diff --git a/desktop-widgets/downloadfromdivecomputer.cpp b/desktop-widgets/downloadfromdivecomputer.cpp
index b52efc636..c0e081251 100644
--- a/desktop-widgets/downloadfromdivecomputer.cpp
+++ b/desktop-widgets/downloadfromdivecomputer.cpp
@@ -143,7 +143,7 @@ void DownloadFromDCWidget::updateState(states state)
return;
if (state == INITIAL) {
- fill_device_list(DC_TYPE_OTHER);
+ fill_device_list(~0);
ui.progressBar->hide();
markChildrenAsEnabled();
timer->stop();
@@ -231,13 +231,14 @@ void DownloadFromDCWidget::updateState(states state)
void DownloadFromDCWidget::on_vendor_currentIndexChanged(const QString &vendor)
{
- int dcType = DC_TYPE_SERIAL;
+ unsigned int transport;
+ dc_descriptor_t *descriptor;
productModel.setStringList(productList[vendor]);
ui.product->setCurrentIndex(0);
- if (vendor == QString("Uemis"))
- dcType = DC_TYPE_UEMIS;
- fill_device_list(dcType);
+ descriptor = descriptorLookup.value(ui.vendor->currentText() + ui.product->currentText());
+ transport = dc_descriptor_get_transports(descriptor);
+ fill_device_list(transport);
}
void DownloadFromDCWidget::on_product_currentIndexChanged(const QString &)
@@ -475,7 +476,7 @@ void DownloadFromDCWidget::updateDeviceEnabled()
descriptor = descriptorLookup.value(ui.vendor->currentText() + ui.product->currentText());
// call dc_descriptor_get_transport to see if the dc_transport_t is DC_TRANSPORT_SERIAL
- if (dc_descriptor_get_transports(descriptor) & DC_TRANSPORT_SERIAL) {
+ if (dc_descriptor_get_transports(descriptor) & (DC_TRANSPORT_SERIAL | DC_TRANSPORT_USBSTORAGE)) {
// if the dc_transport_t is DC_TRANSPORT_SERIAL, then enable the device node box.
ui.device->setEnabled(true);
} else {
@@ -567,11 +568,11 @@ static void fillDeviceList(const char *name, void *data)
comboBox->addItem(name);
}
-void DownloadFromDCWidget::fill_device_list(int dc_type)
+void DownloadFromDCWidget::fill_device_list(unsigned int transport)
{
int deviceIndex;
ui.device->clear();
- deviceIndex = enumerate_devices(fillDeviceList, ui.device, dc_type);
+ deviceIndex = enumerate_devices(fillDeviceList, ui.device, transport);
if (deviceIndex >= 0)
ui.device->setCurrentIndex(deviceIndex);
}
diff --git a/desktop-widgets/downloadfromdivecomputer.h b/desktop-widgets/downloadfromdivecomputer.h
index ec3ac266e..b357f186f 100644
--- a/desktop-widgets/downloadfromdivecomputer.h
+++ b/desktop-widgets/downloadfromdivecomputer.h
@@ -68,7 +68,7 @@ private:
int previousLast;
- void fill_device_list(int dc_type);
+ void fill_device_list(unsigned int transport);
QTimer *timer;
bool dumpWarningShown;
OstcFirmwareCheck *ostcFirmwareCheck;