diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2017-09-17 15:40:16 -0700 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2017-09-17 15:40:16 -0700 |
commit | ae209a3d9f8ed36e2228834d421ff4a6ac345ad9 (patch) | |
tree | 046937d0c944d3b6ad8ff9a8c49ab8bdcc3136d9 | |
parent | 58b7c6f8ef703009e098351774b8db521cce48e3 (diff) | |
parent | 49fe120d9530682cf539d562c4ffcae3e195b9ab (diff) | |
download | subsurface-ae209a3d9f8ed36e2228834d421ff4a6ac345ad9.tar.gz |
Merge branch 'macBLE' of github.com:Subsurface-divelog/subsurface
-rw-r--r-- | CMakeLists.txt | 3 | ||||
-rw-r--r-- | core/btdiscovery.cpp | 23 | ||||
-rw-r--r-- | core/btdiscovery.h | 3 | ||||
-rw-r--r-- | core/libdivecomputer.c | 1 | ||||
-rw-r--r-- | core/qt-ble.cpp | 21 | ||||
-rw-r--r-- | desktop-widgets/btdeviceselectiondialog.cpp | 38 | ||||
-rw-r--r-- | desktop-widgets/downloadfromdivecomputer.cpp | 37 | ||||
-rw-r--r-- | desktop-widgets/downloadfromdivecomputer.ui | 7 | ||||
-rwxr-xr-x | packaging/macosx/make-package.sh | 4 |
9 files changed, 113 insertions, 24 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b3aff8a6..c7314fbcd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -220,9 +220,8 @@ if (BTSUPPORT AND "${Qt5Core_VERSION}" VERSION_LESS 5.4.0) endif() # Windows Qt doesn't support BLE at all -# Mac hasn't been tested, yet - so far it's disabled # the rest of them need at least 5.6 to be reasonable but really, you want 5.9.1 -if (BTSUPPORT AND (ANDROID OR CMAKE_SYSTEM_NAME STREQUAL "Linux")) +if (BTSUPPORT AND NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") if ("${Qt5Core_VERSION}" VERSION_LESS 5.6.0) message(STATUS "Turning off BLE support as Qt version ${Qt5Core_VERSION} is insufficient for that") else() diff --git a/core/btdiscovery.cpp b/core/btdiscovery.cpp index cab44b4a6..729ee9851 100644 --- a/core/btdiscovery.cpp +++ b/core/btdiscovery.cpp @@ -174,11 +174,10 @@ QString markBLEAddress(const QBluetoothDeviceInfo *device) flags = device->coreConfigurations(); if (flags == QBluetoothDeviceInfo::LowEnergyCoreConfiguration) prefix = "LE:"; -#if defined(Q_OS_IOS) - return prefix + device->deviceUuid().toString(); -#else - return prefix + device->address().toString(); -#endif + if (device->address().isNull()) + return prefix + device->deviceUuid().toString(); + else + return prefix + device->address().toString(); } void BTDiscovery::btDeviceDiscovered(const QBluetoothDeviceInfo &device) @@ -308,4 +307,18 @@ bool BTDiscovery::checkException(const char* method, const QAndroidJniObject *ob } #endif // Q_OS_ANDROID +QHash<QString, QBluetoothDeviceInfo> btDeviceInfo; + +void saveBtDeviceInfo(const char* devaddr, QBluetoothDeviceInfo deviceInfo) +{ + btDeviceInfo[devaddr] = deviceInfo; +} + +QBluetoothDeviceInfo getBtDeviceInfo(const char* devaddr) +{ + if (btDeviceInfo.contains(devaddr)) + return btDeviceInfo[devaddr]; + qDebug() << "need to scan for" << devaddr; + return QBluetoothDeviceInfo(); +} #endif // BT_SUPPORT diff --git a/core/btdiscovery.h b/core/btdiscovery.h index 71df24f24..160890c73 100644 --- a/core/btdiscovery.h +++ b/core/btdiscovery.h @@ -18,6 +18,9 @@ #include <QAndroidJniEnvironment> #endif +void saveBtDeviceInfo(const char* devaddr, QBluetoothDeviceInfo deviceInfo); +QBluetoothDeviceInfo getBtDeviceInfo(const char* devaddr); + class ConnectionListModel : public QAbstractListModel { Q_OBJECT public: diff --git a/core/libdivecomputer.c b/core/libdivecomputer.c index ebffad2bf..e6b600644 100644 --- a/core/libdivecomputer.c +++ b/core/libdivecomputer.c @@ -1121,6 +1121,7 @@ const char *do_libdivecomputer_import(device_data_t *data) /* TODO: Show the logfile to the user on error. */ dc_device_close(data->device); data->device = NULL; + dev_info(data, translate("gettextFromC", "No new dives downloaded from dive computer")); } dc_context_free(data->context); diff --git a/core/qt-ble.cpp b/core/qt-ble.cpp index 9867528c8..92a78ae65 100644 --- a/core/qt-ble.cpp +++ b/core/qt-ble.cpp @@ -16,6 +16,7 @@ #include "libdivecomputer.h" #include "core/qt-ble.h" +#include "core/btdiscovery.h" #if defined(SSRF_CUSTOM_IO) @@ -287,12 +288,11 @@ dc_status_t qt_ble_open(dc_custom_io_t *io, dc_context_t *context, const char *d if (!strncmp(devaddr, "LE:", 3)) devaddr += 3; - QBluetoothAddress remoteDeviceAddress(devaddr); - // HACK ALERT! Qt 5.9 needs this for proper Bluez operation qputenv("QT_DEFAULT_CENTRAL_SERVICES", "1"); - QLowEnergyController *controller = new QLowEnergyController(remoteDeviceAddress); + QBluetoothDeviceInfo remoteDevice = getBtDeviceInfo(devaddr); + QLowEnergyController *controller = QLowEnergyController::createCentral(remoteDevice); qDebug() << "qt_ble_open(" << devaddr << ")"; @@ -382,8 +382,19 @@ dc_status_t qt_ble_open(dc_custom_io_t *io, dc_context_t *context, const char *d qDebug() << "Descriptor:" << d.name() << "uuid:" << d.uuid().toString(); if (!l.isEmpty()) { - d = l.first(); - qDebug() << "now writing \"0x0100\" to the first descriptor"; + bool foundCCC = false; + foreach (d, l) { + if (d.type() == QBluetoothUuid::ClientCharacteristicConfiguration) { + // pick the correct characteristic + foundCCC = true; + break; + } + } + if (!foundCCC) + // if we didn't find a ClientCharacteristicConfiguration, try the first one + d = l.first(); + + qDebug() << "now writing \"0x0100\" to the descriptor" << d.uuid().toString(); ble->preferredService()->writeDescriptor(d, QByteArray::fromHex("0100")); } diff --git a/desktop-widgets/btdeviceselectiondialog.cpp b/desktop-widgets/btdeviceselectiondialog.cpp index 049246703..cf70daa3f 100644 --- a/desktop-widgets/btdeviceselectiondialog.cpp +++ b/desktop-widgets/btdeviceselectiondialog.cpp @@ -3,6 +3,9 @@ #include <QDebug> #include <QMessageBox> #include <QMenu> +#include "core/btdiscovery.h" + +#include <QBluetoothUuid> #include "ui_btdeviceselectiondialog.h" #include "btdeviceselectiondialog.h" @@ -149,7 +152,9 @@ void BtDeviceSelectionDialog::on_save_clicked() // Save the selected device selectedRemoteDeviceInfo = QSharedPointer<QBluetoothDeviceInfo>(new QBluetoothDeviceInfo(remoteDeviceInfo)); - + QString address = remoteDeviceInfo.address().isNull() ? remoteDeviceInfo.deviceUuid().toString() : + remoteDeviceInfo.address().toString(); + saveBtDeviceInfo(address.toUtf8().constData(), remoteDeviceInfo); if (remoteDeviceDiscoveryAgent->isActive()) { // Stop the SDP agent if the clear button is pressed and enable the Scan button remoteDeviceDiscoveryAgent->stop(); @@ -236,8 +241,16 @@ void BtDeviceSelectionDialog::addRemoteDevice(const QBluetoothDeviceInfo &remote if (remoteDeviceInfo.address().isNull()) pairingColor = QColor(Qt::gray); + QString deviceLabel; - QString deviceLabel = tr("%1 (%2) [State: %3]").arg(remoteDeviceInfo.name(), +#if defined(Q_OS_MACOS) || defined(Q_OS_IOS) + if (!remoteDeviceInfo.deviceUuid().isNull()) { + // we have only a Uuid, no address, so show that and reset the pairing color + deviceLabel = QString("%1 (%2)").arg(remoteDeviceInfo.name(),remoteDeviceInfo.deviceUuid().toString()); + pairingColor = QColor(Qt::white); + } else +#endif + deviceLabel = tr("%1 (%2) [State: %3]").arg(remoteDeviceInfo.name(), remoteDeviceInfo.address().toString(), pairingStatusLabel); #endif @@ -255,19 +268,24 @@ void BtDeviceSelectionDialog::itemClicked(QListWidgetItem *item) // By default we assume that the devices are paired QBluetoothDeviceInfo remoteDeviceInfo = item->data(Qt::UserRole).value<QBluetoothDeviceInfo>(); QString statusMessage = tr("The device %1 can be used for connection. You can press the Save button.") - .arg(remoteDeviceInfo.address().toString()); + .arg(remoteDeviceInfo.address().isNull() ? + remoteDeviceInfo.deviceUuid().toString() : + remoteDeviceInfo.address().toString()); bool enableSaveButton = true; #if !defined(Q_OS_WIN) // On other platforms than Windows we can obtain the pairing status so if the devices are not paired we disable the button - QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(remoteDeviceInfo.address()); - - if (pairingStatus == QBluetoothLocalDevice::Unpaired) { - statusMessage = tr("The device %1 must be paired in order to be used. Please use the context menu for pairing options.") - .arg(remoteDeviceInfo.address().toString()); - enableSaveButton = false; + // except on MacOS for those devices that only give us a Uuid and not and address (as we have no pairing status for those, either) + if (!remoteDeviceInfo.address().isNull()) { + QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(remoteDeviceInfo.address()); + + if (pairingStatus == QBluetoothLocalDevice::Unpaired) { + statusMessage = tr("The device %1 must be paired in order to be used. Please use the context menu for pairing options.") + .arg(remoteDeviceInfo.address().toString()); + enableSaveButton = false; + } } - if (remoteDeviceInfo.address().isNull()) { + if (remoteDeviceInfo.address().isNull() && remoteDeviceInfo.deviceUuid().isNull()) { statusMessage = tr("A device needs a non-zero address for a connection."); enableSaveButton = false; } diff --git a/desktop-widgets/downloadfromdivecomputer.cpp b/desktop-widgets/downloadfromdivecomputer.cpp index 74501dcdb..424cf277a 100644 --- a/desktop-widgets/downloadfromdivecomputer.cpp +++ b/desktop-widgets/downloadfromdivecomputer.cpp @@ -112,8 +112,24 @@ void DownloadFromDCWidget::updateProgressBar() } if (!same_string(progress_bar_text , "")) { ui.progressBar->setFormat(progress_bar_text); +#if defined(Q_OS_MAC) + // on mac the progress bar doesn't show its text + ui.progressText->setText(progress_bar_text); +#endif } else { - ui.progressBar->setFormat("%p%"); + if (IS_FP_SAME(progress_bar_fraction, 0.0)) { + ui.progressBar->setFormat(tr("Connecting to dive computer")); +#if defined(Q_OS_MAC) + // on mac the progress bar doesn't show its text + ui.progressText->setText(tr("Connecting to dive computer")); +#endif + } else { + ui.progressBar->setFormat("%p%"); +#if defined(Q_OS_MAC) + // on mac the progress bar doesn't show its text + ui.progressText->setText(QString("%1%").arg(lrint(progress_bar_fraction * 100))); +#endif + } } ui.progressBar->setValue(lrint(progress_bar_fraction * 100)); free(last_text); @@ -131,6 +147,10 @@ void DownloadFromDCWidget::updateState(states state) markChildrenAsEnabled(); timer->stop(); progress_bar_text = ""; +#if defined(Q_OS_MAC) + // on mac we show the text in a label + ui.progressText->setText(progress_bar_text); +#endif } // tries to cancel an on going download @@ -153,6 +173,10 @@ void DownloadFromDCWidget::updateState(states state) ui.progressBar->hide(); markChildrenAsEnabled(); progress_bar_text = ""; +#if defined(Q_OS_MAC) + // on mac we show the text in a label + ui.progressText->setText(progress_bar_text); +#endif } // DOWNLOAD is finally done, but we don't know if there was an error as libdivecomputer doesn't pass @@ -165,10 +189,15 @@ void DownloadFromDCWidget::updateState(states state) markChildrenAsEnabled(); progress_bar_text = ""; } else { - progress_bar_text = ""; + if (downloadTable.nr != 0) + progress_bar_text = ""; ui.progressBar->setValue(100); markChildrenAsEnabled(); } +#if defined(Q_OS_MAC) + // on mac we show the text in a label + ui.progressText->setText(progress_bar_text); +#endif } // DOWNLOAD is started. @@ -188,6 +217,10 @@ void DownloadFromDCWidget::updateState(states state) markChildrenAsEnabled(); progress_bar_text = ""; ui.progressBar->hide(); +#if defined(Q_OS_MAC) + // on mac we show the text in a label + ui.progressText->setText(progress_bar_text); +#endif } // properly updating the widget state diff --git a/desktop-widgets/downloadfromdivecomputer.ui b/desktop-widgets/downloadfromdivecomputer.ui index b1f152034..10d654b46 100644 --- a/desktop-widgets/downloadfromdivecomputer.ui +++ b/desktop-widgets/downloadfromdivecomputer.ui @@ -190,6 +190,13 @@ </widget> </item> <item> + <widget class="QLabel" name="progressText"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> <spacer name="aboveOKCancelSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> diff --git a/packaging/macosx/make-package.sh b/packaging/macosx/make-package.sh index 6aa46fb08..ba717bdb2 100755 --- a/packaging/macosx/make-package.sh +++ b/packaging/macosx/make-package.sh @@ -71,6 +71,10 @@ pushd Subsurface.app/Contents/PlugIns/grantlee ln -s . 5.0 popd +if [ "$1" = "-nodmg" ] ; then + exit 0 +fi + # copy things into staging so we can create a nice DMG rm -rf ./staging mkdir ./staging |