summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2020-05-14 12:15:24 -0700
committerGravatar Lubomir I. Ivanov <neolit123@gmail.com>2020-05-15 02:49:46 +0300
commit658089d763c1e9e953f5c06b01d028613408138b (patch)
tree658c0c14547e36a940f2b0a927c626b3505d939b
parent62e95fdc8656a0c8fdb181c3fe0a48e043650a05 (diff)
downloadsubsurface-658089d763c1e9e953f5c06b01d028613408138b.tar.gz
core/bt: match DC descriptor in lower case
This fixes a rather subtle bug. In btdiscovery.cpp we are detecting dive computers based on their BT name and are setting up product+vendor as the key for that lookup. QMap always uses case sensitive comparisons and a tiny inconsistency snuck into our code. libdivecomputer names for the Aqualung dive computers i200C / i300C / i550C end in an upper case C (as matches the official branding), but in btdiscovery.cpp we have those names with lower case c. And therefore didn't recognize these dive computers. Obviously this is easy to fix by fixing those three strings, but I decided that it was silly to set ourselves up for similar oversights in the future. So instead I switched the matching of the descriptor to simply be allways all lower case. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--CHANGELOG.md1
-rw-r--r--core/btdiscovery.cpp8
-rw-r--r--core/downloadfromdcthread.cpp9
-rw-r--r--desktop-widgets/configuredivecomputerdialog.cpp2
-rw-r--r--desktop-widgets/downloadfromdivecomputer.cpp4
5 files changed, 13 insertions, 11 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a2b898fff..7e6315761 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,4 @@
+Mobile: fix failure to recognize several Aqualung BLE dive computers
Mobile: show dive tags on dive details page
Desktop: update SAC fields and other statistics when editing cylinders
Desktop: Reconnect the variations checkbox in planner
diff --git a/core/btdiscovery.cpp b/core/btdiscovery.cpp
index b70330410..298c0408c 100644
--- a/core/btdiscovery.cpp
+++ b/core/btdiscovery.cpp
@@ -83,16 +83,16 @@ static dc_descriptor_t *getDeviceType(QString btName)
// number. The model code matches the hex model (so "FQ" is 0x4651,
// where 'F' is 46h and 'Q' is 51h in ASCII).
vendor = "Aqualung";
- product = "i200c";
+ product = "i200C";
} else if (btName.contains(QRegularExpression("^FH\\d{6}$"))) {
vendor = "Aqualung";
- product = "i300c";
+ product = "i300C";
} else if (btName.contains(QRegularExpression("^FQ\\d{6}$"))) {
vendor = "Aqualung";
product = "i770R";
} else if (btName.contains(QRegularExpression("^FR\\d{6}$"))) {
vendor = "Aqualung";
- product = "i550c";
+ product = "i550C";
} else if (btName.contains(QRegularExpression("^ER\\d{6}$"))) {
vendor = "Oceanic";
product = "Pro Plus X";
@@ -111,7 +111,7 @@ static dc_descriptor_t *getDeviceType(QString btName)
// check if we found a known dive computer
if (!vendor.isEmpty() && !product.isEmpty()) {
- dc_descriptor_t *lookup = descriptorLookup.value(vendor + product);
+ dc_descriptor_t *lookup = descriptorLookup.value(vendor.toLower() + product.toLower());
if (!lookup)
qWarning("known dive computer %s not found in descriptorLookup", qPrintable(QString(vendor + product)));
return lookup;
diff --git a/core/downloadfromdcthread.cpp b/core/downloadfromdcthread.cpp
index 8a3365842..d8a65c809 100644
--- a/core/downloadfromdcthread.cpp
+++ b/core/downloadfromdcthread.cpp
@@ -68,7 +68,7 @@ DownloadThread::DownloadThread() : downloadTable({ 0 }),
void DownloadThread::run()
{
auto internalData = m_data->internalData();
- internalData->descriptor = descriptorLookup[m_data->vendor() + m_data->product()];
+ internalData->descriptor = descriptorLookup[m_data->vendor().toLower() + m_data->product().toLower()];
internalData->download_table = &downloadTable;
internalData->sites = &diveSiteTable;
internalData->btname = strdup(m_data->devBluetoothName().toUtf8());
@@ -127,7 +127,7 @@ void fill_computer_list()
if (!productList[vendor].contains(product))
productList[vendor].append(product);
- descriptorLookup[QString(vendor) + QString(product)] = descriptor;
+ descriptorLookup[QString(vendor).toLower() + QString(product).toLower()] = descriptor;
}
dc_iterator_free(iterator);
Q_FOREACH (QString vendor, vendorList) {
@@ -157,7 +157,8 @@ void fill_computer_list()
if (!productList["Uemis"].contains("Zurich"))
productList["Uemis"].push_back("Zurich");
- descriptorLookup["UemisZurich"] = (dc_descriptor_t *)mydescriptor;
+ // note: keys in the descriptorLookup are always lowercase
+ descriptorLookup["uemiszurich"] = (dc_descriptor_t *)mydescriptor;
#endif
std::sort(vendorList.begin(), vendorList.end());
@@ -192,7 +193,7 @@ void show_computer_list()
Q_FOREACH (QString vendor, vendorList) {
QString msg = vendor + ": ";
Q_FOREACH (QString product, productList[vendor]) {
- dc_descriptor_t *descriptor = descriptorLookup[vendor + product];
+ dc_descriptor_t *descriptor = descriptorLookup[vendor.toLower() + product.toLower()];
unsigned int transport = dc_descriptor_get_transports(descriptor) & transportMask;
QString transportString = getTransportString(transport);
msg += product + " (" + transportString + "), ";
diff --git a/desktop-widgets/configuredivecomputerdialog.cpp b/desktop-widgets/configuredivecomputerdialog.cpp
index 2315f47ea..6fd855648 100644
--- a/desktop-widgets/configuredivecomputerdialog.cpp
+++ b/desktop-widgets/configuredivecomputerdialog.cpp
@@ -908,7 +908,7 @@ void ConfigureDiveComputerDialog::getDeviceData()
device_data.vendor = copy_qstring(selected_vendor);
device_data.product = copy_qstring(selected_product);
- device_data.descriptor = descriptorLookup.value(selected_vendor + selected_product);
+ device_data.descriptor = descriptorLookup.value(selected_vendor.toLower() + selected_product.toLower());
device_data.deviceid = device_data.diveid = 0;
qPrefDiveComputer::set_device(device_data.devname);
diff --git a/desktop-widgets/downloadfromdivecomputer.cpp b/desktop-widgets/downloadfromdivecomputer.cpp
index cf3aad492..3c84683af 100644
--- a/desktop-widgets/downloadfromdivecomputer.cpp
+++ b/desktop-widgets/downloadfromdivecomputer.cpp
@@ -318,7 +318,7 @@ void DownloadFromDCWidget::on_vendor_currentIndexChanged(const QString &vendor)
productModel.setStringList(productList[vendor]);
ui.product->setCurrentIndex(0);
- descriptor = descriptorLookup.value(ui.vendor->currentText() + ui.product->currentText());
+ descriptor = descriptorLookup.value(ui.vendor->currentText().toLower() + ui.product->currentText().toLower());
transport = dc_descriptor_get_transports(descriptor);
fill_device_list(transport);
}
@@ -542,7 +542,7 @@ void DownloadFromDCWidget::updateDeviceEnabled()
{
// Set up the DC descriptor
dc_descriptor_t *descriptor = NULL;
- descriptor = descriptorLookup.value(ui.vendor->currentText() + ui.product->currentText());
+ descriptor = descriptorLookup.value(ui.vendor->currentText().toLower() + ui.product->currentText().toLower());
// 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 | DC_TRANSPORT_USBSTORAGE)) {