Skip to content

Commit 658089d

Browse files
dirkhhneolit123
authored andcommitted
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 <[email protected]>
1 parent 62e95fd commit 658089d

File tree

5 files changed

+13
-11
lines changed

5 files changed

+13
-11
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
Mobile: fix failure to recognize several Aqualung BLE dive computers
12
Mobile: show dive tags on dive details page
23
Desktop: update SAC fields and other statistics when editing cylinders
34
Desktop: Reconnect the variations checkbox in planner

core/btdiscovery.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,16 @@ static dc_descriptor_t *getDeviceType(QString btName)
8383
// number. The model code matches the hex model (so "FQ" is 0x4651,
8484
// where 'F' is 46h and 'Q' is 51h in ASCII).
8585
vendor = "Aqualung";
86-
product = "i200c";
86+
product = "i200C";
8787
} else if (btName.contains(QRegularExpression("^FH\\d{6}$"))) {
8888
vendor = "Aqualung";
89-
product = "i300c";
89+
product = "i300C";
9090
} else if (btName.contains(QRegularExpression("^FQ\\d{6}$"))) {
9191
vendor = "Aqualung";
9292
product = "i770R";
9393
} else if (btName.contains(QRegularExpression("^FR\\d{6}$"))) {
9494
vendor = "Aqualung";
95-
product = "i550c";
95+
product = "i550C";
9696
} else if (btName.contains(QRegularExpression("^ER\\d{6}$"))) {
9797
vendor = "Oceanic";
9898
product = "Pro Plus X";
@@ -111,7 +111,7 @@ static dc_descriptor_t *getDeviceType(QString btName)
111111

112112
// check if we found a known dive computer
113113
if (!vendor.isEmpty() && !product.isEmpty()) {
114-
dc_descriptor_t *lookup = descriptorLookup.value(vendor + product);
114+
dc_descriptor_t *lookup = descriptorLookup.value(vendor.toLower() + product.toLower());
115115
if (!lookup)
116116
qWarning("known dive computer %s not found in descriptorLookup", qPrintable(QString(vendor + product)));
117117
return lookup;

core/downloadfromdcthread.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ DownloadThread::DownloadThread() : downloadTable({ 0 }),
6868
void DownloadThread::run()
6969
{
7070
auto internalData = m_data->internalData();
71-
internalData->descriptor = descriptorLookup[m_data->vendor() + m_data->product()];
71+
internalData->descriptor = descriptorLookup[m_data->vendor().toLower() + m_data->product().toLower()];
7272
internalData->download_table = &downloadTable;
7373
internalData->sites = &diveSiteTable;
7474
internalData->btname = strdup(m_data->devBluetoothName().toUtf8());
@@ -127,7 +127,7 @@ void fill_computer_list()
127127
if (!productList[vendor].contains(product))
128128
productList[vendor].append(product);
129129

130-
descriptorLookup[QString(vendor) + QString(product)] = descriptor;
130+
descriptorLookup[QString(vendor).toLower() + QString(product).toLower()] = descriptor;
131131
}
132132
dc_iterator_free(iterator);
133133
Q_FOREACH (QString vendor, vendorList) {
@@ -157,7 +157,8 @@ void fill_computer_list()
157157
if (!productList["Uemis"].contains("Zurich"))
158158
productList["Uemis"].push_back("Zurich");
159159

160-
descriptorLookup["UemisZurich"] = (dc_descriptor_t *)mydescriptor;
160+
// note: keys in the descriptorLookup are always lowercase
161+
descriptorLookup["uemiszurich"] = (dc_descriptor_t *)mydescriptor;
161162
#endif
162163

163164
std::sort(vendorList.begin(), vendorList.end());
@@ -192,7 +193,7 @@ void show_computer_list()
192193
Q_FOREACH (QString vendor, vendorList) {
193194
QString msg = vendor + ": ";
194195
Q_FOREACH (QString product, productList[vendor]) {
195-
dc_descriptor_t *descriptor = descriptorLookup[vendor + product];
196+
dc_descriptor_t *descriptor = descriptorLookup[vendor.toLower() + product.toLower()];
196197
unsigned int transport = dc_descriptor_get_transports(descriptor) & transportMask;
197198
QString transportString = getTransportString(transport);
198199
msg += product + " (" + transportString + "), ";

desktop-widgets/configuredivecomputerdialog.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -908,7 +908,7 @@ void ConfigureDiveComputerDialog::getDeviceData()
908908
device_data.vendor = copy_qstring(selected_vendor);
909909
device_data.product = copy_qstring(selected_product);
910910

911-
device_data.descriptor = descriptorLookup.value(selected_vendor + selected_product);
911+
device_data.descriptor = descriptorLookup.value(selected_vendor.toLower() + selected_product.toLower());
912912
device_data.deviceid = device_data.diveid = 0;
913913

914914
qPrefDiveComputer::set_device(device_data.devname);

desktop-widgets/downloadfromdivecomputer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ void DownloadFromDCWidget::on_vendor_currentIndexChanged(const QString &vendor)
318318
productModel.setStringList(productList[vendor]);
319319
ui.product->setCurrentIndex(0);
320320

321-
descriptor = descriptorLookup.value(ui.vendor->currentText() + ui.product->currentText());
321+
descriptor = descriptorLookup.value(ui.vendor->currentText().toLower() + ui.product->currentText().toLower());
322322
transport = dc_descriptor_get_transports(descriptor);
323323
fill_device_list(transport);
324324
}
@@ -542,7 +542,7 @@ void DownloadFromDCWidget::updateDeviceEnabled()
542542
{
543543
// Set up the DC descriptor
544544
dc_descriptor_t *descriptor = NULL;
545-
descriptor = descriptorLookup.value(ui.vendor->currentText() + ui.product->currentText());
545+
descriptor = descriptorLookup.value(ui.vendor->currentText().toLower() + ui.product->currentText().toLower());
546546

547547
// call dc_descriptor_get_transport to see if the dc_transport_t is DC_TRANSPORT_SERIAL
548548
if (dc_descriptor_get_transports(descriptor) & (DC_TRANSPORT_SERIAL | DC_TRANSPORT_USBSTORAGE)) {

0 commit comments

Comments
 (0)