aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2018-10-06 11:43:48 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2018-10-06 19:38:28 -0700
commitcd553444108ed7cd11a977f64ac0b742c1141117 (patch)
treed6ab9a1c227a8ad90a18b8c75e31b62ee1866533
parent88f4c06b993daa1d669aad71f90d92c4ebdb4c9c (diff)
downloadsubsurface-cd553444108ed7cd11a977f64ac0b742c1141117.tar.gz
qt-ble: add support for libdivecomputer 'set_timeout()' function
Because some BLE operations can be very slow (device and service discovery etc), we have some rather excessive default timeout for BLE (currently set to 12 seconds). But once we actually have started doing IO, that long timeout can be a big performance problem, when the libdivecomputer backend has support for retry and packet loss. For that reason, libdivecomputer has a 'set_timeout()' function that allows the divecomputer backend to say how quickly it expects the dive computer to answer before the backend will start resending packets. Let's just implement that for the actual IO side of BLE too. The default timeout value remains the general BLE timeout, and this only affects the actual IO phase, but it improves things enormously for the case where there is packet loss at that point. For example, on the Aqualung i770R, the timeout for packet loss ends up now being just one second rather than the full 12 seconds of default BLE timeout. Which gets the retry going much faster. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--core/qt-ble.cpp14
-rw-r--r--core/qt-ble.h3
-rw-r--r--core/qtserialbluetooth.cpp2
3 files changed, 17 insertions, 2 deletions
diff --git a/core/qt-ble.cpp b/core/qt-ble.cpp
index 0ecad50c3..ba75c8472 100644
--- a/core/qt-ble.cpp
+++ b/core/qt-ble.cpp
@@ -131,6 +131,7 @@ BLEObject::BLEObject(QLowEnergyController *c, dc_user_device_t *d)
device = d;
debugCounter = 0;
isCharacteristicWritten = false;
+ timeout = BLE_TIMEOUT;
}
BLEObject::~BLEObject()
@@ -203,7 +204,7 @@ dc_status_t BLEObject::read(void *data, size_t size, size_t *actual)
qDebug() << QTime::currentTime() << "packet WAIT";
- WAITFOR(!receivedPackets.isEmpty(), BLE_TIMEOUT);
+ WAITFOR(!receivedPackets.isEmpty(), timeout);
if (receivedPackets.isEmpty())
return DC_STATUS_IO;
}
@@ -516,6 +517,17 @@ static void checkThreshold()
}
}
+/*
+ * NOTE! The 'set_timeout()' function only affects the timeout
+ * for qt_ble_read(), not for the various general BLE operations.
+ */
+dc_status_t qt_ble_set_timeout(void *io, int timeout)
+{
+ BLEObject *ble = (BLEObject *) io;
+ ble->set_timeout(timeout);
+ return DC_STATUS_SUCCESS;
+}
+
dc_status_t qt_ble_read(void *io, void* data, size_t size, size_t *actual)
{
checkThreshold();
diff --git a/core/qt-ble.h b/core/qt-ble.h
index eb028f9b9..f9600ad19 100644
--- a/core/qt-ble.h
+++ b/core/qt-ble.h
@@ -20,6 +20,7 @@ class BLEObject : public QObject
public:
BLEObject(QLowEnergyController *c, dc_user_device_t *);
~BLEObject();
+ inline void set_timeout(int value) { timeout = value; }
dc_status_t write(const void* data, size_t size, size_t *actual);
dc_status_t read(void* data, size_t size, size_t *actual);
@@ -45,6 +46,7 @@ private:
dc_user_device_t *device;
unsigned int hw_credit = 0;
unsigned int desc_written = 0;
+ int timeout;
QList<QUuid> hwAllCharacteristics = {
"{00000001-0000-1000-8000-008025000000}", // HW_OSTC_BLE_DATA_RX
@@ -57,6 +59,7 @@ private:
extern "C" {
dc_status_t qt_ble_open(void **io, dc_context_t *context, const char *devaddr, dc_user_device_t *user_device);
+dc_status_t qt_ble_set_timeout(void *io, int timeout);
dc_status_t qt_ble_read(void *io, void* data, size_t size, size_t *actual);
dc_status_t qt_ble_write(void *io, const void* data, size_t size, size_t *actual);
dc_status_t qt_ble_close(void *io);
diff --git a/core/qtserialbluetooth.cpp b/core/qtserialbluetooth.cpp
index 14ddacf2b..be1cda686 100644
--- a/core/qtserialbluetooth.cpp
+++ b/core/qtserialbluetooth.cpp
@@ -410,7 +410,7 @@ ble_packet_open(dc_iostream_t **iostream, dc_context_t *context, const char* dev
void *io = NULL;
static const dc_custom_cbs_t callbacks = {
- NULL, /* set_timeout */
+ qt_ble_set_timeout, /* set_timeout */
NULL, /* set_latency */
NULL, /* set_break */
NULL, /* set_dtr */