From 0104d4b1a13cb500a8b117ce745ffd7ca96ee79a Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 9 Jun 2016 00:44:19 +0200 Subject: add additional configurable connection parameters --- gatoconnectionparameters.cpp | 35 +++++++++++++++++++++++++++++++++++ gatoconnectionparameters.h | 12 +++++++++++- gatosocket.cpp | 19 ++++++++++--------- 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/gatoconnectionparameters.cpp b/gatoconnectionparameters.cpp index c8270c8..608b666 100644 --- a/gatoconnectionparameters.cpp +++ b/gatoconnectionparameters.cpp @@ -3,15 +3,20 @@ struct GatoConnectionParametersPrivate : public QSharedData { + int scanInterval; + int scanWindow; int connIntervalMin; int connIntervalMax; int slaveLatency; int supervisionTimeout; + int connectionTimeout; }; GatoConnectionParameters::GatoConnectionParameters() : d(new GatoConnectionParametersPrivate) { + d->scanInterval = 10000; // 10 ms + d->scanWindow = 10000; // 10 ms // Set a connection scan interval between 10 and 320 ms. d->connIntervalMin = 10000; d->connIntervalMax = 320000; @@ -28,6 +33,26 @@ GatoConnectionParameters::~GatoConnectionParameters() { } +int GatoConnectionParameters::scanInterval() const +{ + return d->scanInterval; +} + +void GatoConnectionParameters::setScanInterval(int interval) +{ + d->scanInterval = interval; +} + +int GatoConnectionParameters::scanWindow() const +{ + return d->scanWindow; +} + +void GatoConnectionParameters::setScanWindow(int interval) +{ + d->scanWindow = interval; +} + int GatoConnectionParameters::connectionIntervalMin() const { return d->connIntervalMin; @@ -74,6 +99,16 @@ void GatoConnectionParameters::setSupervisionTimeout(int timeout) d->supervisionTimeout = timeout; } +int GatoConnectionParameters::connectionTimeout() const +{ + return d->connectionTimeout; +} + +void GatoConnectionParameters::setConnectionTimeout(int timeout) +{ + d->connectionTimeout = timeout; +} + GatoConnectionParameters &GatoConnectionParameters::operator=(const GatoConnectionParameters &o) { if (this != &o) diff --git a/gatoconnectionparameters.h b/gatoconnectionparameters.h index 1441020..29945d0 100644 --- a/gatoconnectionparameters.h +++ b/gatoconnectionparameters.h @@ -20,9 +20,16 @@ public: GatoConnectionParameters(const GatoConnectionParameters &o); ~GatoConnectionParameters(); - // Units for all of this: milliseconds // TODO Need to document + // Units: microseconds (µs!) + + int scanInterval() const; + void setScanInterval(int interval); + + int scanWindow() const; + void setScanWindow(int interval); + // Connection interval: generally, lower connection interval increases throughput. // Units: microseconds (µs!) @@ -43,6 +50,9 @@ public: int supervisionTimeout() const; void setSupervisionTimeout(int timeout); + int connectionTimeout() const; + void setConnectionTimeout(int timeout); + GatoConnectionParameters &operator=(const GatoConnectionParameters &o); private: diff --git a/gatosocket.cpp b/gatosocket.cpp index 9c7163b..fbad2f6 100644 --- a/gatosocket.cpp +++ b/gatosocket.cpp @@ -126,7 +126,6 @@ bool GatoSocket::connectTo(const GatoAddress &addr, unsigned short cid) l2addr.l2_bdaddr_type = BDADDR_LE_RANDOM; break; } - qDebug() << "address type" << l2addr.l2_bdaddr_type; #else // The kernel is probably too old to support this, // but BLE might still work (e.g. Nokia N9). @@ -253,22 +252,23 @@ GatoConnectionParameters GatoSocket::connectionParameters() const socklen_t len = sizeof(bt_params); if (::getsockopt(fd, SOL_BLUETOOTH, BT_LE_PARAMS, &bt_params, &len) == 0) { - qDebug() << "sinternal" << bt_params.scan_interval << "swindow" << bt_params.scan_window - << "cinterval" << bt_params.interval_min << bt_params.interval_max - << "latency" << bt_params.latency << "sup timeout" << bt_params.supervision_timeout; - if (bt_params.interval_min == 0 && bt_params.interval_max == 0) { // Sometimes the kernel will give us this when no parameters have been set. // I believe it is a bug, because in truth the kernel default parameters are in use. qDebug() << "Assuming kernel defaults, since the kernel responded with empty interval"; return desiredParams; } + // Kernel uses "multiples of 0.625ms", we use µs + params.setScanInterval(bt_params.scan_interval * 0625); + params.setScanWindow(bt_params.scan_window * 0625); // Kernel uses "multiples of 1.25ms", we use µs, need to convert. params.setConnectionInterval(bt_params.interval_min * 1250, bt_params.interval_max * 1250); // Kernel units already in ms. params.setSlaveLatency(bt_params.latency); // Kernel uses "multiples of 10ms", need to convert params.setSupervisionTimeout(bt_params.supervision_timeout * 10); + // Kernel uses seconds, we use ms + params.setConnectionTimeout(bt_params.conn_timeout * 1000); return params; } else { @@ -289,6 +289,9 @@ bool GatoSocket::setConnectionParameters(const GatoConnectionParameters ¶ms) memset(&bt_params, 0, len); + // Kernel uses "multiples of 0.625ms", we use µs + bt_params.scan_interval = params.scanInterval() / 0625; + bt_params.scan_window = params.scanWindow() / 0625; // Kernel uses "multiples of 1.25ms", we use µs, need to convert bt_params.interval_min = params.connectionIntervalMin() / 1250; bt_params.interval_max = params.connectionIntervalMax() / 1250; @@ -296,10 +299,8 @@ bool GatoSocket::setConnectionParameters(const GatoConnectionParameters ¶ms) bt_params.latency = params.slaveLatency(); // Kernel uses "multiples of 10ms", need to convert bt_params.supervision_timeout = params.supervisionTimeout() / 10; - - qDebug() << "sinternal" << bt_params.scan_interval << "swindow" << bt_params.scan_window - << "cinterval" << bt_params.interval_min << bt_params.interval_max - << "latency" << bt_params.latency << "sup timeout" << bt_params.supervision_timeout; + // Kernel uses seconds, we use ms, need to convert + bt_params.conn_timeout = params.connectionTimeout() / 1000; if (::setsockopt(fd, SOL_BLUETOOTH, BT_LE_PARAMS, &bt_params, len) == 0) { return true; -- cgit v1.2.3