From 270e9eccad8644352f5ae07df8b6acb55b115361 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Mon, 27 Aug 2018 10:32:14 -0700 Subject: [PATCH] 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 Signed-off-by: Dirk Hohndel --- core/android.cpp | 2 +- core/display.h | 8 +++----- core/downloadfromdcthread.cpp | 6 ++++-- core/downloadfromdcthread.h | 1 + core/ios.cpp | 2 +- core/libdivecomputer.h | 5 +++++ core/macos.c | 6 +++--- core/unix.c | 6 +++--- core/windows.c | 6 +++--- desktop-widgets/configuredivecomputerdialog.cpp | 10 +++++----- desktop-widgets/configuredivecomputerdialog.h | 2 +- desktop-widgets/downloadfromdivecomputer.cpp | 17 +++++++++-------- desktop-widgets/downloadfromdivecomputer.h | 2 +- 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 #include +// 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;