Merge branch 'macBLE' of github.com:Subsurface-divelog/subsurface

This commit is contained in:
Dirk Hohndel 2017-09-17 15:40:16 -07:00
commit ae209a3d9f
9 changed files with 112 additions and 23 deletions

View file

@ -220,9 +220,8 @@ if (BTSUPPORT AND "${Qt5Core_VERSION}" VERSION_LESS 5.4.0)
endif() endif()
# Windows Qt doesn't support BLE at all # 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 # 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) if ("${Qt5Core_VERSION}" VERSION_LESS 5.6.0)
message(STATUS "Turning off BLE support as Qt version ${Qt5Core_VERSION} is insufficient for that") message(STATUS "Turning off BLE support as Qt version ${Qt5Core_VERSION} is insufficient for that")
else() else()

View file

@ -174,11 +174,10 @@ QString markBLEAddress(const QBluetoothDeviceInfo *device)
flags = device->coreConfigurations(); flags = device->coreConfigurations();
if (flags == QBluetoothDeviceInfo::LowEnergyCoreConfiguration) if (flags == QBluetoothDeviceInfo::LowEnergyCoreConfiguration)
prefix = "LE:"; prefix = "LE:";
#if defined(Q_OS_IOS) if (device->address().isNull())
return prefix + device->deviceUuid().toString(); return prefix + device->deviceUuid().toString();
#else else
return prefix + device->address().toString(); return prefix + device->address().toString();
#endif
} }
void BTDiscovery::btDeviceDiscovered(const QBluetoothDeviceInfo &device) void BTDiscovery::btDeviceDiscovered(const QBluetoothDeviceInfo &device)
@ -308,4 +307,18 @@ bool BTDiscovery::checkException(const char* method, const QAndroidJniObject *ob
} }
#endif // Q_OS_ANDROID #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 #endif // BT_SUPPORT

View file

@ -18,6 +18,9 @@
#include <QAndroidJniEnvironment> #include <QAndroidJniEnvironment>
#endif #endif
void saveBtDeviceInfo(const char* devaddr, QBluetoothDeviceInfo deviceInfo);
QBluetoothDeviceInfo getBtDeviceInfo(const char* devaddr);
class ConnectionListModel : public QAbstractListModel { class ConnectionListModel : public QAbstractListModel {
Q_OBJECT Q_OBJECT
public: public:

View file

@ -1121,6 +1121,7 @@ const char *do_libdivecomputer_import(device_data_t *data)
/* TODO: Show the logfile to the user on error. */ /* TODO: Show the logfile to the user on error. */
dc_device_close(data->device); dc_device_close(data->device);
data->device = NULL; data->device = NULL;
dev_info(data, translate("gettextFromC", "No new dives downloaded from dive computer"));
} }
dc_context_free(data->context); dc_context_free(data->context);

View file

@ -16,6 +16,7 @@
#include "libdivecomputer.h" #include "libdivecomputer.h"
#include "core/qt-ble.h" #include "core/qt-ble.h"
#include "core/btdiscovery.h"
#if defined(SSRF_CUSTOM_IO) #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)) if (!strncmp(devaddr, "LE:", 3))
devaddr += 3; devaddr += 3;
QBluetoothAddress remoteDeviceAddress(devaddr);
// HACK ALERT! Qt 5.9 needs this for proper Bluez operation // HACK ALERT! Qt 5.9 needs this for proper Bluez operation
qputenv("QT_DEFAULT_CENTRAL_SERVICES", "1"); 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 << ")"; 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(); qDebug() << "Descriptor:" << d.name() << "uuid:" << d.uuid().toString();
if (!l.isEmpty()) { if (!l.isEmpty()) {
d = l.first(); bool foundCCC = false;
qDebug() << "now writing \"0x0100\" to the first descriptor"; 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")); ble->preferredService()->writeDescriptor(d, QByteArray::fromHex("0100"));
} }

View file

@ -3,6 +3,9 @@
#include <QDebug> #include <QDebug>
#include <QMessageBox> #include <QMessageBox>
#include <QMenu> #include <QMenu>
#include "core/btdiscovery.h"
#include <QBluetoothUuid>
#include "ui_btdeviceselectiondialog.h" #include "ui_btdeviceselectiondialog.h"
#include "btdeviceselectiondialog.h" #include "btdeviceselectiondialog.h"
@ -149,7 +152,9 @@ void BtDeviceSelectionDialog::on_save_clicked()
// Save the selected device // Save the selected device
selectedRemoteDeviceInfo = QSharedPointer<QBluetoothDeviceInfo>(new QBluetoothDeviceInfo(remoteDeviceInfo)); 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()) { if (remoteDeviceDiscoveryAgent->isActive()) {
// Stop the SDP agent if the clear button is pressed and enable the Scan button // Stop the SDP agent if the clear button is pressed and enable the Scan button
remoteDeviceDiscoveryAgent->stop(); remoteDeviceDiscoveryAgent->stop();
@ -236,8 +241,16 @@ void BtDeviceSelectionDialog::addRemoteDevice(const QBluetoothDeviceInfo &remote
if (remoteDeviceInfo.address().isNull()) if (remoteDeviceInfo.address().isNull())
pairingColor = QColor(Qt::gray); 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(), remoteDeviceInfo.address().toString(),
pairingStatusLabel); pairingStatusLabel);
#endif #endif
@ -255,19 +268,24 @@ void BtDeviceSelectionDialog::itemClicked(QListWidgetItem *item)
// By default we assume that the devices are paired // By default we assume that the devices are paired
QBluetoothDeviceInfo remoteDeviceInfo = item->data(Qt::UserRole).value<QBluetoothDeviceInfo>(); 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.") 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; bool enableSaveButton = true;
#if !defined(Q_OS_WIN) #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 // 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()); // 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) { 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.") 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()); .arg(remoteDeviceInfo.address().toString());
enableSaveButton = false; 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."); statusMessage = tr("A device needs a non-zero address for a connection.");
enableSaveButton = false; enableSaveButton = false;
} }

View file

@ -112,8 +112,24 @@ void DownloadFromDCWidget::updateProgressBar()
} }
if (!same_string(progress_bar_text , "")) { if (!same_string(progress_bar_text , "")) {
ui.progressBar->setFormat(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 { } 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)); ui.progressBar->setValue(lrint(progress_bar_fraction * 100));
free(last_text); free(last_text);
@ -131,6 +147,10 @@ void DownloadFromDCWidget::updateState(states state)
markChildrenAsEnabled(); markChildrenAsEnabled();
timer->stop(); timer->stop();
progress_bar_text = ""; 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 // tries to cancel an on going download
@ -153,6 +173,10 @@ void DownloadFromDCWidget::updateState(states state)
ui.progressBar->hide(); ui.progressBar->hide();
markChildrenAsEnabled(); markChildrenAsEnabled();
progress_bar_text = ""; 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 // 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(); markChildrenAsEnabled();
progress_bar_text = ""; progress_bar_text = "";
} else { } else {
progress_bar_text = ""; if (downloadTable.nr != 0)
progress_bar_text = "";
ui.progressBar->setValue(100); ui.progressBar->setValue(100);
markChildrenAsEnabled(); 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. // DOWNLOAD is started.
@ -188,6 +217,10 @@ void DownloadFromDCWidget::updateState(states state)
markChildrenAsEnabled(); markChildrenAsEnabled();
progress_bar_text = ""; progress_bar_text = "";
ui.progressBar->hide(); 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 // properly updating the widget state

View file

@ -189,6 +189,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QLabel" name="progressText">
<property name="text">
<string/>
</property>
</widget>
</item>
<item> <item>
<spacer name="aboveOKCancelSpacer"> <spacer name="aboveOKCancelSpacer">
<property name="orientation"> <property name="orientation">

View file

@ -71,6 +71,10 @@ pushd Subsurface.app/Contents/PlugIns/grantlee
ln -s . 5.0 ln -s . 5.0
popd popd
if [ "$1" = "-nodmg" ] ; then
exit 0
fi
# copy things into staging so we can create a nice DMG # copy things into staging so we can create a nice DMG
rm -rf ./staging rm -rf ./staging
mkdir ./staging mkdir ./staging