summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Claudiu Olteanu <olteanu.claudiu@ymail.com>2015-07-06 16:35:13 +0300
committerGravatar Dirk Hohndel <dirk@hohndel.org>2015-07-06 08:36:42 -0700
commitdff4e5f33eee0ba112ddd2265410a5e858d6c98f (patch)
tree87c3e50d860999dc6372bb2a1b25f84f962bbbea
parentb4c4d95ea4d19d63492a5de4abdab31673ab9725 (diff)
downloadsubsurface-dff4e5f33eee0ba112ddd2265410a5e858d6c98f.tar.gz
Add a dialog for remote Bluetooth devices selection
Implement a dialog which can be used for remote Bluetooth devices selection and to control the local Bluetooth device. Functionalities of the widget: - expose information about the local BT device - scan for remote BT devices - pair/unpair with a remote BT device - turn on/off the local BT device - logging - save the selected BT device The selection dialog is created when the bluetoothMode checkbox is enabled. Signed-off-by: Claudiu Olteanu <olteanu.claudiu@ymail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--CMakeLists.txt5
-rw-r--r--libdivecomputer.h1
-rw-r--r--qt-ui/btdeviceselectiondialog.cpp261
-rw-r--r--qt-ui/btdeviceselectiondialog.h46
-rw-r--r--qt-ui/btdeviceselectiondialog.ui214
-rw-r--r--qt-ui/downloadfromdivecomputer.cpp27
-rw-r--r--qt-ui/downloadfromdivecomputer.h3
7 files changed, 553 insertions, 4 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index dce84405c..eac98539f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -161,8 +161,8 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Android")
set(ANDROID_PKG AndroidExtras)
set(ANDROID_LIB Qt5::AndroidExtras)
endif()
-find_package(Qt5 REQUIRED COMPONENTS Core Concurrent Widgets Network ${WEBKIT_PKG} ${PRINTING_PKG} Svg Test LinguistTools ${QT_QUICK_PKG} ${ANDROID_PKG})
-set(QT_LIBRARIES Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network ${WEBKIT_LIB} ${PRINTING_LIB} Qt5::Svg ${QT_QUICK_LIB} ${ANDROID_LIB})
+find_package(Qt5 REQUIRED COMPONENTS Core Concurrent Widgets Network ${WEBKIT_PKG} ${PRINTING_PKG} Svg Test LinguistTools ${QT_QUICK_PKG} ${ANDROID_PKG} Bluetooth)
+set(QT_LIBRARIES Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network ${WEBKIT_LIB} ${PRINTING_LIB} Qt5::Svg ${QT_QUICK_LIB} ${ANDROID_LIB} Qt5::Bluetooth)
set(QT_TEST_LIBRARIES ${QT_LIBRARIES} Qt5::Test)
# Generate the ssrf-config.h every 'make'
@@ -352,6 +352,7 @@ source_group("Subsurface Models" FILES ${SUBSURFACE_MODELS})
set(SUBSURFACE_INTERFACE
qt-ui/updatemanager.cpp
qt-ui/about.cpp
+ qt-ui/btdeviceselectiondialog.cpp
qt-ui/divecomputermanagementdialog.cpp
qt-ui/divelistview.cpp
qt-ui/diveplanner.cpp
diff --git a/libdivecomputer.h b/libdivecomputer.h
index dfb62675f..f5c0cadbe 100644
--- a/libdivecomputer.h
+++ b/libdivecomputer.h
@@ -37,6 +37,7 @@ typedef struct device_data_t
bool create_new_trip;
bool libdc_log;
bool libdc_dump;
+ bool bluetooth_mode;
FILE *libdc_logfile;
struct dive_table *download_table;
} device_data_t;
diff --git a/qt-ui/btdeviceselectiondialog.cpp b/qt-ui/btdeviceselectiondialog.cpp
new file mode 100644
index 000000000..436dca510
--- /dev/null
+++ b/qt-ui/btdeviceselectiondialog.cpp
@@ -0,0 +1,261 @@
+#include <QShortcut>
+#include <QDebug>
+#include <QMessageBox>
+#include <QMenu>
+
+#include "ui_btdeviceselectiondialog.h"
+#include "btdeviceselectiondialog.h"
+
+BtDeviceSelectionDialog::BtDeviceSelectionDialog(QWidget *parent) :
+ QDialog(parent),
+ localDevice(new QBluetoothLocalDevice),
+ ui(new Ui::BtDeviceSelectionDialog)
+{
+ // Check if Bluetooth is available on this device
+ if (!localDevice->isValid()) {
+ QMessageBox::warning(this, tr("Warning"),
+ "This should never happen, please contact the Subsurface developers "
+ "and tell them that the Bluetooth download mode doesn't work.");
+ return;
+ }
+
+ ui->setupUi(this);
+
+ // Quit button callbacks
+ QShortcut *quit = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q), this);
+ connect(quit, SIGNAL(activated()), this, SLOT(reject()));
+ connect(ui->quit, SIGNAL(clicked()), this, SLOT(reject()));
+
+ // Disable the save button because there is no device selected
+ ui->save->setEnabled(false);
+
+ connect(ui->discoveredDevicesList, SIGNAL(itemActivated(QListWidgetItem*)),
+ this, SLOT(itemActivated(QListWidgetItem*)));
+
+ // Set UI information about the local device
+ ui->deviceAddress->setText(localDevice->address().toString());
+ ui->deviceName->setText(localDevice->name());
+
+ connect(localDevice, SIGNAL(hostModeStateChanged(QBluetoothLocalDevice::HostMode)),
+ this, SLOT(hostModeStateChanged(QBluetoothLocalDevice::HostMode)));
+
+ // Initialize the state of the local device and activate/deactive the scan button
+ hostModeStateChanged(localDevice->hostMode());
+
+ // Intialize the discovery agent
+ remoteDeviceDiscoveryAgent = new QBluetoothDeviceDiscoveryAgent();
+
+ connect(remoteDeviceDiscoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
+ this, SLOT(addRemoteDevice(QBluetoothDeviceInfo)));
+ connect(remoteDeviceDiscoveryAgent, SIGNAL(finished()),
+ this, SLOT(remoteDeviceScanFinished()));
+
+ // Add context menu for devices to be able to pair them
+ ui->discoveredDevicesList->setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(ui->discoveredDevicesList, SIGNAL(customContextMenuRequested(QPoint)),
+ this, SLOT(displayPairingMenu(QPoint)));
+ connect(localDevice, SIGNAL(pairingFinished(QBluetoothAddress, QBluetoothLocalDevice::Pairing)),
+ this, SLOT(pairingFinished(QBluetoothAddress, QBluetoothLocalDevice::Pairing)));
+
+ connect(localDevice, SIGNAL(error(QBluetoothLocalDevice::Error)),
+ this, SLOT(error(QBluetoothLocalDevice::Error)));
+}
+
+BtDeviceSelectionDialog::~BtDeviceSelectionDialog()
+{
+ delete ui;
+}
+
+void BtDeviceSelectionDialog::on_changeDeviceState_clicked()
+{
+ if (localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff) {
+ ui->dialogStatus->setText("Trying to turn on the local Bluetooth device...");
+ localDevice->powerOn();
+ } else {
+ ui->dialogStatus->setText("Trying to turn off the local Bluetooth device...");
+ localDevice->setHostMode(QBluetoothLocalDevice::HostPoweredOff);
+ }
+}
+
+void BtDeviceSelectionDialog::on_save_clicked()
+{
+ // Get the selected device. There will be always a selected device if the save button is enabled.
+ QListWidgetItem *currentItem = ui->discoveredDevicesList->currentItem();
+ QBluetoothDeviceInfo remoteDeviceInfo = currentItem->data(Qt::UserRole).value<QBluetoothDeviceInfo>();
+
+ // Save the selected device
+ selectedRemoteDeviceInfo = QSharedPointer<QBluetoothDeviceInfo>(new QBluetoothDeviceInfo(remoteDeviceInfo));
+
+ // Close the device selection dialog and set the result code to Accepted
+ accept();
+}
+
+void BtDeviceSelectionDialog::on_clear_clicked()
+{
+ ui->dialogStatus->setText("Remote devices list was cleaned.");
+ ui->discoveredDevicesList->clear();
+ ui->save->setEnabled(false);
+}
+
+void BtDeviceSelectionDialog::on_scan_clicked()
+{
+ ui->dialogStatus->setText("Scanning for remote devices...");
+ remoteDeviceDiscoveryAgent->start();
+ ui->scan->setEnabled(false);
+}
+
+void BtDeviceSelectionDialog::remoteDeviceScanFinished()
+{
+ ui->dialogStatus->setText("Scanning finished.");
+ ui->scan->setEnabled(true);
+}
+
+void BtDeviceSelectionDialog::hostModeStateChanged(QBluetoothLocalDevice::HostMode mode)
+{
+ bool on = !(mode == QBluetoothLocalDevice::HostPoweredOff);
+
+ ui->dialogStatus->setText(QString("The local Bluetooth device was turned %1.")
+ .arg(on? "ON" : "OFF"));
+ ui->deviceState->setChecked(on);
+ ui->scan->setEnabled(on);
+}
+
+void BtDeviceSelectionDialog::addRemoteDevice(const QBluetoothDeviceInfo &remoteDeviceInfo)
+{
+ QString deviceLable = QString("%1 (%2)").arg(remoteDeviceInfo.name()).arg(remoteDeviceInfo.address().toString());
+ QList<QListWidgetItem *> itemsWithSameSignature = ui->discoveredDevicesList->findItems(deviceLable, Qt::MatchStartsWith);
+
+ // Check if the remote device is already in the list
+ if (itemsWithSameSignature.empty()) {
+ QListWidgetItem *item = new QListWidgetItem(deviceLable);
+ QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(remoteDeviceInfo.address());
+ item->setData(Qt::UserRole, QVariant::fromValue(remoteDeviceInfo));
+
+ if (pairingStatus == QBluetoothLocalDevice::Paired) {
+ item->setText(QString("%1 [State: PAIRED]").arg(item->text()));
+ item->setBackgroundColor(QColor(Qt::gray));
+ } else if (pairingStatus == QBluetoothLocalDevice::AuthorizedPaired) {
+ item->setText(QString("%1 [State: AUTHORIZED_PAIRED]").arg(item->text()));
+ item->setBackgroundColor(QColor(Qt::blue));
+ } else {
+ item->setText(QString("%1 [State: UNPAIRED]").arg(item->text()));
+ item->setTextColor(QColor(Qt::black));
+ }
+
+ ui->discoveredDevicesList->addItem(item);
+ }
+}
+
+void BtDeviceSelectionDialog::itemActivated(QListWidgetItem *item)
+{
+ QBluetoothDeviceInfo remoteDeviceInfo = item->data(Qt::UserRole).value<QBluetoothDeviceInfo>();
+ QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(remoteDeviceInfo.address());
+
+ if (pairingStatus == QBluetoothLocalDevice::Unpaired) {
+ ui->dialogStatus->setText(QString("The device %1 must be paired in order to be used. Please use the context menu for pairing options.")
+ .arg(remoteDeviceInfo.address().toString()));
+ ui->save->setEnabled(false);
+ } else {
+ ui->dialogStatus->setText(QString("The device %1 can be used for connection. You can press the Save button.")
+ .arg(remoteDeviceInfo.address().toString()));
+ ui->save->setEnabled(true);
+ }
+}
+
+void BtDeviceSelectionDialog::displayPairingMenu(const QPoint &pos)
+{
+ QMenu menu(this);
+ QAction *pairAction = menu.addAction("Pair");
+ QAction *removePairAction = menu.addAction("Remove Pairing");
+ QAction *chosenAction = menu.exec(ui->discoveredDevicesList->viewport()->mapToGlobal(pos));
+ QListWidgetItem *currentItem = ui->discoveredDevicesList->currentItem();
+ QBluetoothDeviceInfo currentRemoteDeviceInfo = currentItem->data(Qt::UserRole).value<QBluetoothDeviceInfo>();
+ QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(currentRemoteDeviceInfo.address());
+
+ //TODO: disable the actions
+ if (pairingStatus == QBluetoothLocalDevice::Unpaired) {
+ pairAction->setEnabled(true);
+ removePairAction->setEnabled(false);
+ } else {
+ pairAction->setEnabled(false);
+ removePairAction->setEnabled(true);
+ }
+
+ if (chosenAction == pairAction) {
+ ui->dialogStatus->setText(QString("Trying to pair device %1")
+ .arg(currentRemoteDeviceInfo.address().toString()));
+ localDevice->requestPairing(currentRemoteDeviceInfo.address(), QBluetoothLocalDevice::Paired);
+ } else if (chosenAction == removePairAction) {
+ ui->dialogStatus->setText(QString("Trying to unpair device %1")
+ .arg(currentRemoteDeviceInfo.address().toString()));
+ localDevice->requestPairing(currentRemoteDeviceInfo.address(), QBluetoothLocalDevice::Unpaired);
+ }
+}
+
+void BtDeviceSelectionDialog::pairingFinished(const QBluetoothAddress &address, QBluetoothLocalDevice::Pairing pairing)
+{
+ QString remoteDeviceStringAddress = address.toString();
+ QList<QListWidgetItem *> items = ui->discoveredDevicesList->findItems(remoteDeviceStringAddress, Qt::MatchContains);
+
+ if (pairing == QBluetoothLocalDevice::Paired || pairing == QBluetoothLocalDevice::Paired ) {
+ ui->dialogStatus->setText(QString("Device %1 was paired.")
+ .arg(remoteDeviceStringAddress));
+
+ for (int i = 0; i < items.count(); ++i) {
+ QListWidgetItem *item = items.at(i);
+
+ item->setText(QString("%1 [State: PAIRED]").arg(remoteDeviceStringAddress));
+ item->setBackgroundColor(QColor(Qt::gray));
+ }
+
+ QListWidgetItem *currentItem = ui->discoveredDevicesList->currentItem();
+
+ if (currentItem != NULL && currentItem->text().contains(remoteDeviceStringAddress, Qt::CaseInsensitive)) {
+ ui->dialogStatus->setText(QString("The device %1 can now be used for connection. You can press the Save button.")
+ .arg(remoteDeviceStringAddress));
+ ui->save->setEnabled(true);
+ }
+ } else {
+ ui->dialogStatus->setText(QString("Device %1 was unpaired.")
+ .arg(remoteDeviceStringAddress));
+
+ for (int i = 0; i < items.count(); ++i) {
+ QListWidgetItem *item = items.at(i);
+
+ item->setText(QString("%1 [State: UNPAIRED]").arg(remoteDeviceStringAddress));
+ item->setBackgroundColor(QColor(Qt::white));
+ }
+
+ QListWidgetItem *currentItem = ui->discoveredDevicesList->currentItem();
+
+ if (currentItem != NULL && currentItem->text().contains(remoteDeviceStringAddress, Qt::CaseInsensitive)) {
+ ui->dialogStatus->setText(QString("The device %1 must be paired in order to be used. Please use the context menu for pairing options.")
+ .arg(remoteDeviceStringAddress));
+ ui->save->setEnabled(false);
+ }
+ }
+}
+
+void BtDeviceSelectionDialog::error(QBluetoothLocalDevice::Error error)
+{
+ ui->dialogStatus->setText(QString("Local device error: %1.")
+ .arg((error == QBluetoothLocalDevice::PairingError)? "Pairing error" : "Unknown error"));
+}
+
+QString BtDeviceSelectionDialog::getSelectedDeviceAddress()
+{
+ if (selectedRemoteDeviceInfo) {
+ return selectedRemoteDeviceInfo.data()->address().toString();
+ }
+
+ return QString();
+}
+
+QString BtDeviceSelectionDialog::getSelectedDeviceName()
+{
+ if (selectedRemoteDeviceInfo) {
+ return selectedRemoteDeviceInfo.data()->name();
+ }
+
+ return QString();
+}
diff --git a/qt-ui/btdeviceselectiondialog.h b/qt-ui/btdeviceselectiondialog.h
new file mode 100644
index 000000000..6bcc43f34
--- /dev/null
+++ b/qt-ui/btdeviceselectiondialog.h
@@ -0,0 +1,46 @@
+#ifndef BTDEVICESELECTIONDIALOG_H
+#define BTDEVICESELECTIONDIALOG_H
+
+#include <QDialog>
+#include <QListWidgetItem>
+#include <QPointer>
+#include <QtBluetooth/QBluetoothLocalDevice>
+#include <QtBluetooth/qbluetoothglobal.h>
+#include <QtBluetooth/QBluetoothDeviceDiscoveryAgent>
+
+Q_DECLARE_METATYPE(QBluetoothDeviceInfo)
+
+namespace Ui {
+ class BtDeviceSelectionDialog;
+}
+
+class BtDeviceSelectionDialog : public QDialog {
+ Q_OBJECT
+
+public:
+ explicit BtDeviceSelectionDialog(QWidget *parent = 0);
+ ~BtDeviceSelectionDialog();
+ QString getSelectedDeviceAddress();
+ QString getSelectedDeviceName();
+
+private slots:
+ void on_changeDeviceState_clicked();
+ void on_save_clicked();
+ void on_clear_clicked();
+ void on_scan_clicked();
+ void remoteDeviceScanFinished();
+ void hostModeStateChanged(QBluetoothLocalDevice::HostMode mode);
+ void addRemoteDevice(const QBluetoothDeviceInfo &remoteDeviceInfo);
+ void itemActivated(QListWidgetItem *item);
+ void displayPairingMenu(const QPoint &pos);
+ void pairingFinished(const QBluetoothAddress &address,QBluetoothLocalDevice::Pairing pairing);
+ void error(QBluetoothLocalDevice::Error error);
+
+private:
+ Ui::BtDeviceSelectionDialog *ui;
+ QBluetoothLocalDevice *localDevice;
+ QBluetoothDeviceDiscoveryAgent *remoteDeviceDiscoveryAgent;
+ QSharedPointer<QBluetoothDeviceInfo> selectedRemoteDeviceInfo;
+};
+
+#endif // BTDEVICESELECTIONDIALOG_H
diff --git a/qt-ui/btdeviceselectiondialog.ui b/qt-ui/btdeviceselectiondialog.ui
new file mode 100644
index 000000000..c28bdcbe8
--- /dev/null
+++ b/qt-ui/btdeviceselectiondialog.ui
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>BtDeviceSelectionDialog</class>
+ <widget class="QDialog" name="BtDeviceSelectionDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>735</width>
+ <height>460</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Remote Bluetooth device selection</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="discoveredDevicesLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Discovered devices</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <layout class="QHBoxLayout" name="dialogControls">
+ <item>
+ <widget class="QPushButton" name="save">
+ <property name="text">
+ <string>Save</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="quit">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Quit</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0" rowspan="2">
+ <layout class="QVBoxLayout" name="remoteDevicesSection">
+ <item>
+ <widget class="QListWidget" name="discoveredDevicesList">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="scanningControls">
+ <item>
+ <widget class="QPushButton" name="scan">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Scan</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="clear">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Clear</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1">
+ <widget class="QGroupBox" name="localDeviceDetails">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="title">
+ <string>Local Bluetooth device details</string>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ <layout class="QFormLayout" name="formLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="deviceNameLable">
+ <property name="text">
+ <string>Name: </string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="deviceName">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="deviceAddressLable">
+ <property name="text">
+ <string>Address:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="deviceAddress">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="deviceState">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Bluetooth powered on</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QPushButton" name="changeDeviceState">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>50</weight>
+ <bold>false</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Turn On/Off</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="dialogStatus">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/qt-ui/downloadfromdivecomputer.cpp b/qt-ui/downloadfromdivecomputer.cpp
index f1bb05823..276e4047c 100644
--- a/qt-ui/downloadfromdivecomputer.cpp
+++ b/qt-ui/downloadfromdivecomputer.cpp
@@ -99,6 +99,8 @@ DownloadFromDCWidget::DownloadFromDCWidget(QWidget *parent, Qt::WindowFlags f) :
ui.ok->setEnabled(false);
ui.downloadCancelRetryButton->setEnabled(true);
ui.downloadCancelRetryButton->setText(tr("Download"));
+
+ btDeviceSelectionDialog = 0;
ui.chooseBluetoothDevice->setEnabled(ui.bluetoothMode->isChecked());
connect(ui.bluetoothMode, SIGNAL(stateChanged(int)), this, SLOT(enableBluetoothMode(int)));
connect(ui.chooseBluetoothDevice, SIGNAL(clicked()), this, SLOT(selectRemoteBluetoothDevice()));
@@ -311,7 +313,11 @@ void DownloadFromDCWidget::on_downloadCancelRetryButton_clicked()
data.vendor = strdup(ui.vendor->currentText().toUtf8().data());
data.product = strdup(ui.product->currentText().toUtf8().data());
- if (same_string(data.vendor, "Uemis")) {
+ data.bluetooth_mode = ui.bluetoothMode->isChecked();
+ if (data.bluetooth_mode) {
+ // Get the selected device address
+ data.devname = strdup(btDeviceSelectionDialog->getSelectedDeviceAddress().toUtf8().data());
+ } else if (same_string(data.vendor, "Uemis")) {
char *colon;
char *devname = strdup(ui.device->currentText().toUtf8().data());
@@ -523,7 +529,24 @@ void DownloadFromDCWidget::markChildrenAsEnabled()
void DownloadFromDCWidget::selectRemoteBluetoothDevice()
{
- //TODO add implementation
+ if (!btDeviceSelectionDialog) {
+ btDeviceSelectionDialog = new BtDeviceSelectionDialog(this);
+ connect(btDeviceSelectionDialog, SIGNAL(finished(int)),
+ this, SLOT(bluetoothSelectionDialogIsFinished(int)));
+ }
+
+ btDeviceSelectionDialog->show();
+}
+
+void DownloadFromDCWidget::bluetoothSelectionDialogIsFinished(int result)
+{
+ if (result == QDialog::Accepted) {
+ /* Make the selected Bluetooth device default */
+ ui.device->setCurrentText(btDeviceSelectionDialog->getSelectedDeviceName());
+ } else if (result == QDialog::Rejected){
+ /* Disable Bluetooth download mode */
+ ui.bluetoothMode->setChecked(false);
+ }
}
void DownloadFromDCWidget::enableBluetoothMode(int state)
diff --git a/qt-ui/downloadfromdivecomputer.h b/qt-ui/downloadfromdivecomputer.h
index 0b63d28ed..734e5f7d1 100644
--- a/qt-ui/downloadfromdivecomputer.h
+++ b/qt-ui/downloadfromdivecomputer.h
@@ -10,6 +10,7 @@
#include "libdivecomputer.h"
#include "configuredivecomputerdialog.h"
#include "ui_downloadfromdivecomputer.h"
+#include "btdeviceselectiondialog.h"
class QStringListModel;
@@ -81,6 +82,7 @@ slots:
void pickDumpFile();
void pickLogFile();
void selectRemoteBluetoothDevice();
+ void bluetoothSelectionDialogIsFinished(int result);
private:
void markChildrenAsDisabled();
@@ -106,6 +108,7 @@ private:
bool dumpWarningShown;
OstcFirmwareCheck *ostcFirmwareCheck;
DiveImportedModel *diveImportedModel;
+ BtDeviceSelectionDialog *btDeviceSelectionDialog;
public:
bool preferDownloaded();