summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gatoconnectionparameters.cpp35
-rw-r--r--gatoconnectionparameters.h12
-rw-r--r--gatosocket.cpp19
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 &params)
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 &params)
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;