summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2017-09-17 15:40:16 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2017-09-17 15:40:16 -0700
commitae209a3d9f8ed36e2228834d421ff4a6ac345ad9 (patch)
tree046937d0c944d3b6ad8ff9a8c49ab8bdcc3136d9
parent58b7c6f8ef703009e098351774b8db521cce48e3 (diff)
parent49fe120d9530682cf539d562c4ffcae3e195b9ab (diff)
downloadsubsurface-ae209a3d9f8ed36e2228834d421ff4a6ac345ad9.tar.gz
Merge branch 'macBLE' of github.com:Subsurface-divelog/subsurface
-rw-r--r--CMakeLists.txt3
-rw-r--r--core/btdiscovery.cpp23
-rw-r--r--core/btdiscovery.h3
-rw-r--r--core/libdivecomputer.c1
-rw-r--r--core/qt-ble.cpp21
-rw-r--r--desktop-widgets/btdeviceselectiondialog.cpp38
-rw-r--r--desktop-widgets/downloadfromdivecomputer.cpp37
-rw-r--r--desktop-widgets/downloadfromdivecomputer.ui7
-rwxr-xr-xpackaging/macosx/make-package.sh4
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