summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/btdiscovery.cpp41
-rw-r--r--core/btdiscovery.h4
-rw-r--r--core/downloadfromdcthread.cpp59
-rw-r--r--core/downloadfromdcthread.h4
-rw-r--r--mobile-widgets/qml/DownloadFromDiveComputer.qml7
5 files changed, 108 insertions, 7 deletions
diff --git a/core/btdiscovery.cpp b/core/btdiscovery.cpp
index 3159c3d30..5a93174a6 100644
--- a/core/btdiscovery.cpp
+++ b/core/btdiscovery.cpp
@@ -2,10 +2,36 @@
#include "btdiscovery.h"
#include "downloadfromdcthread.h"
+#include "core/libdivecomputer.h"
#include <QDebug>
+extern QMap<QString, dc_descriptor_t *> descriptorLookup;
+
BTDiscovery *BTDiscovery::m_instance = NULL;
+static dc_descriptor_t *getDeviceType(QString btName)
+// central function to convert a BT name to a Subsurface known vendor/model pair
+{
+ QString vendor, product;
+
+ if (btName.startsWith("OSTC")) {
+ vendor = "Heinrichs Weikamp";
+ if (btName.mid(4,2) == "3#") product = "OSTC 3";
+ else if (btName.mid(4,2) == "3+") product = "OSTC 3+";
+ else if (btName.mid(4,2) == "s#") product = "OSTC Sport";
+ else if (btName.mid(4,2) == "4-") product = "OSTC 4";
+ else if (btName.mid(4,2) == "2-") product = "OSTC 2N";
+ // all OSTCs are HW_FAMILY_OSTC_3, so when we do not know,
+ // just try this
+ else product = "OSTC 3"; // all OSTCs are HW_FAMILY_OSTC_3
+ }
+
+ if (!vendor.isEmpty() && !product.isEmpty())
+ return(descriptorLookup[vendor + product]);
+
+ return(NULL);
+}
+
BTDiscovery::BTDiscovery(QObject *parent)
{
Q_UNUSED(parent)
@@ -68,11 +94,13 @@ void BTDiscovery::btDeviceDiscovered(const QBluetoothDeviceInfo &device)
btPairedDevices.append(this_d);
struct btVendorProduct btVP;
- QString newDevice = device.name();
+ QString newDevice;
+ dc_descriptor_t *newDC = getDeviceType(device.name());
+ if (newDC)
+ newDevice = dc_descriptor_get_product(newDC);
+ else
+ newDevice = device.name();
- // all the HW OSTC BT computers show up as "OSTC" + some other text, depending on model
- if (newDevice.startsWith("OSTC"))
- newDevice = "OSTC 3";
QList<QBluetoothUuid> serviceUuids = device.serviceUuids();
foreach (QBluetoothUuid id, serviceUuids) {
addBtUuid(id);
@@ -80,11 +108,12 @@ void BTDiscovery::btDeviceDiscovered(const QBluetoothDeviceInfo &device)
}
qDebug() << "Found new device:" << newDevice << device.address();
QString vendor;
- foreach (vendor, productList.keys()) {
+ if (newDC) foreach (vendor, productList.keys()) {
if (productList[vendor].contains(newDevice)) {
qDebug() << "this could be a " + vendor + " " +
(newDevice == "OSTC 3" ? "OSTC family" : newDevice);
btVP.btdi = device;
+ btVP.dcDescriptor = newDC;
btVP.vendorIdx = vendorList.indexOf(vendor);
btVP.productIdx = productList[vendor].indexOf(newDevice);
qDebug() << "adding new btDCs entry (detected DC)" << newDevice << btVP.vendorIdx << btVP.productIdx << btVP.btdi.address();;
@@ -95,6 +124,7 @@ void BTDiscovery::btDeviceDiscovered(const QBluetoothDeviceInfo &device)
productList[QObject::tr("Paired Bluetooth Devices")].append(this_d.name + " (" + this_d.address.toString() + ")");
btVP.btdi = device;
+ btVP.dcDescriptor = newDC;
btVP.vendorIdx = vendorList.indexOf(QObject::tr("Paired Bluetooth Devices"));
btVP.productIdx = productList[QObject::tr("Paired Bluetooth Devices")].indexOf(this_d.name);
qDebug() << "adding new btDCs entry (all paired)" << newDevice << btVP.vendorIdx << btVP.productIdx << btVP.btdi.address();
@@ -174,4 +204,5 @@ bool BTDiscovery::checkException(const char* method, const QAndroidJniObject *ob
return result;
}
#endif // Q_OS_ANDROID
+
#endif // BT_SUPPORT
diff --git a/core/btdiscovery.h b/core/btdiscovery.h
index 1951b6672..301c4195d 100644
--- a/core/btdiscovery.h
+++ b/core/btdiscovery.h
@@ -9,13 +9,17 @@
#include <QBluetoothLocalDevice>
#include <QBluetoothDeviceDiscoveryAgent>
#include <QBluetoothUuid>
+#include "core/libdivecomputer.h"
struct btVendorProduct {
QBluetoothDeviceInfo btdi;
+ dc_descriptor_t *dcDescriptor;
int vendorIdx;
int productIdx;
};
+static dc_descriptor_t *getDeviceType(QString btName);
+
#endif
#if defined(Q_OS_ANDROID)
#include <QAndroidJniObject>
diff --git a/core/downloadfromdcthread.cpp b/core/downloadfromdcthread.cpp
index 64933b5bc..a98ab17b2 100644
--- a/core/downloadfromdcthread.cpp
+++ b/core/downloadfromdcthread.cpp
@@ -249,7 +249,7 @@ int DCDeviceData::getDetectedVendorIndex(const QString &currentText)
QList<btVendorProduct> btAllDevices = BTDiscovery::instance()->getBtAllDevices();
// Pick the vendor of the first confirmed find of a DC (if any), but
- // only return a true vendow, and not our virtual one
+ // only return a true vendor, and not our virtual one
if (!btDCs.isEmpty() && currentText != QObject::tr("Paired Bluetooth Devices")) {
qDebug() << "getDetectedVendorIndex" << currentText << btDCs.first().vendorIdx;
return btDCs.first().vendorIdx;
@@ -311,7 +311,62 @@ QString DCDeviceData::getDetectedDeviceAddress(const QString &currentVendorText,
qDebug() << "getDetectedDeviceAddress" << btAddr;
return btAddr;
}
-
+#endif
return QString();
+}
+
+QString DCDeviceData::getDeviceDescriptorVendor(const QString &currentVendorText,
+ const QString &currentProductText)
+{
+#if defined(BT_SUPPORT)
+ QList<btVendorProduct> btDCs = BTDiscovery::instance()->getBtDcs();
+ QList<btVendorProduct> btAllDevices = BTDiscovery::instance()->getBtAllDevices();
+
+ // Pull the vendor from the first found dive computer that is been
+ // detected as a possible real dive computer (and not some other paired
+ // BT device
+ if (currentVendorText != QObject::tr("Paired Bluetooth Devices") && !btDCs.isEmpty()) {
+ QString dcVendor = dc_descriptor_get_vendor(btDCs.first().dcDescriptor);
+ qDebug() << "getDeviceDescriptorVendor" << dcVendor;
+ return dcVendor;
+ }
+
+ // if the above fails, pull vendor from the selected paired device
+ // unsure being a dive computer
+ if (currentVendorText == QObject::tr("Paired Bluetooth Devices")) {
+ int i = productList[currentVendorText].indexOf(currentProductText);
+ QString dcVendor = dc_descriptor_get_vendor(btAllDevices[i].dcDescriptor);
+ qDebug() << "getDeviceDescriptorVendor" << dcVendor;
+ return dcVendor;
+ }
+#endif
+ return NULL;
+}
+
+QString DCDeviceData::getDeviceDescriptorProduct(const QString &currentVendorText,
+ const QString &currentProductText)
+{
+#if defined(BT_SUPPORT)
+ QList<btVendorProduct> btDCs = BTDiscovery::instance()->getBtDcs();
+ QList<btVendorProduct> btAllDevices = BTDiscovery::instance()->getBtAllDevices();
+
+ // Pull the product from the first found dive computer that is been
+ // detected as a possible real dive computer (and not some other paired
+ // BT device
+ if (currentVendorText != QObject::tr("Paired Bluetooth Devices") && !btDCs.isEmpty()) {
+ QString dcProduct = dc_descriptor_get_product(btDCs.first().dcDescriptor);
+ qDebug() << "getDeviceDescriptorProduct" << dcProduct;
+ return dcProduct;
+ }
+
+ // if the above fails, pull product from the selected paired device
+ // unsure being a dive computer
+ if (currentVendorText == QObject::tr("Paired Bluetooth Devices")) {
+ int i = productList[currentVendorText].indexOf(currentProductText);
+ QString dcProduct = dc_descriptor_get_product(btAllDevices[i].dcDescriptor);
+ qDebug() << "getDeviceDescriptorProduct" << dcProduct;
+ return dcProduct;
+ }
#endif
+ return NULL;
}
diff --git a/core/downloadfromdcthread.h b/core/downloadfromdcthread.h
index f606a7a74..912c33258 100644
--- a/core/downloadfromdcthread.h
+++ b/core/downloadfromdcthread.h
@@ -50,6 +50,10 @@ public:
const QString &currentProductText);
Q_INVOKABLE QString getDetectedDeviceAddress(const QString &currentVendorText,
const QString &currentProductText);
+ Q_INVOKABLE QString getDeviceDescriptorVendor(const QString &currentVendorText,
+ const QString &currentProductText);
+ Q_INVOKABLE QString getDeviceDescriptorProduct(const QString &currentVendorText,
+ const QString &currentProductText);
public slots:
void setVendor(const QString& vendor);
diff --git a/mobile-widgets/qml/DownloadFromDiveComputer.qml b/mobile-widgets/qml/DownloadFromDiveComputer.qml
index 80aaaa251..66504c866 100644
--- a/mobile-widgets/qml/DownloadFromDiveComputer.qml
+++ b/mobile-widgets/qml/DownloadFromDiveComputer.qml
@@ -93,6 +93,13 @@ Kirigami.Page {
comboProduct.currentText)
if (addr !== "")
downloadThread.deviceData.devName = addr
+ var vendor = downloadThread.deviceData.getDeviceDescriptorVendor(comboVendor.currentText,
+ comboProduct.currentText)
+ downloadThread.deviceData.vendor = vendor;
+
+ var product = downloadThread.deviceData.getDeviceDescriptorProduct(comboVendor.currentText,
+ comboProduct.currentText)
+ downloadThread.deviceData.product = product;
}
manager.appendTextToLog("DCDownloadThread started for " + downloadThread.deviceData.devName)
downloadThread.start()