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>
This commit is contained in:
Linus Torvalds 2018-08-27 10:32:14 -07:00 committed by Dirk Hohndel
parent bb067b6ee4
commit 270e9eccad
13 changed files with 40 additions and 33 deletions

View file

@ -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? */

View file

@ -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;

View file

@ -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)

View file

@ -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.

View file

@ -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;

View file

@ -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

View file

@ -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);

View file

@ -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)

View file

@ -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;

View file

@ -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)

View file

@ -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();

View file

@ -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);
}

View file

@ -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;