From ca248e3667f52f951bdd60d923b25a6b8fb4296d Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 16 May 2017 15:11:57 +0200 Subject: Make it more obvious that another active BTLE connection prevents connect Task-number: QTBUG-55150 Change-Id: I223e2b2015e210162e59fb994b9352e790b036d4 Reviewed-by: Oliver Wolff Reviewed-by: Christian Kandeler --- src/bluetooth/bluez/bluez_data_p.h | 4 ++++ src/bluetooth/bluez/hcimanager.cpp | 44 ++++++++++++++++++++++++++++++++++++++ src/bluetooth/bluez/hcimanager_p.h | 4 ++++ 3 files changed, 52 insertions(+) (limited to 'src/bluetooth/bluez') diff --git a/src/bluetooth/bluez/bluez_data_p.h b/src/bluetooth/bluez/bluez_data_p.h index 8c2dc43e..25edc661 100644 --- a/src/bluetooth/bluez/bluez_data_p.h +++ b/src/bluetooth/bluez/bluez_data_p.h @@ -99,6 +99,10 @@ struct bt_security { #define BDADDR_LE_PUBLIC 0x01 #define BDADDR_LE_RANDOM 0x02 +#define SCO_LINK 0x00 +#define ACL_LINK 0x01 +#define ESCO_LINK 0x02 +#define LE_LINK 0x80 // based on hcitool.c -> no fixed constant available /* Byte order conversions */ #if __BYTE_ORDER == __LITTLE_ENDIAN diff --git a/src/bluetooth/bluez/hcimanager.cpp b/src/bluetooth/bluez/hcimanager.cpp index 93bf941b..c524117c 100644 --- a/src/bluetooth/bluez/hcimanager.cpp +++ b/src/bluetooth/bluez/hcimanager.cpp @@ -288,6 +288,50 @@ QBluetoothAddress HciManager::addressForConnectionHandle(quint16 handle) const return QBluetoothAddress(); } +QVector HciManager::activeLowEnergyConnections() const +{ + if (!isValid()) + return QVector(); + + hci_conn_info *info; + hci_conn_list_req *infoList; + + const int maxNoOfConnections = 20; + infoList = (hci_conn_list_req *) + malloc(sizeof(hci_conn_list_req) + maxNoOfConnections * sizeof(hci_conn_info)); + + if (!infoList) + return QVector(); + + QScopedPointer p(infoList); + p->conn_num = maxNoOfConnections; + p->dev_id = hciDev; + info = p->conn_info; + + if (ioctl(hciSocket, HCIGETCONNLIST, (void *) infoList) < 0) { + qCWarning(QT_BT_BLUEZ) << "Cannot retrieve connection list"; + return QVector(); + } + + QVector activeLowEnergyHandles; + for (int i = 0; i < infoList->conn_num; i++) { + switch (info[i].type) { + case SCO_LINK: + case ACL_LINK: + case ESCO_LINK: + continue; + case LE_LINK: + activeLowEnergyHandles.append(info[i].handle); + break; + default: + qCWarning(QT_BT_BLUEZ) << "Unknown active connection type:" << hex << info[i].type; + break; + } + } + + return activeLowEnergyHandles; +} + quint16 forceIntervalIntoRange(double connectionInterval) { return qMin(qMax(7.5, connectionInterval), 4000) / 1.25; diff --git a/src/bluetooth/bluez/hcimanager_p.h b/src/bluetooth/bluez/hcimanager_p.h index 3bae92e5..3127a747 100644 --- a/src/bluetooth/bluez/hcimanager_p.h +++ b/src/bluetooth/bluez/hcimanager_p.h @@ -55,6 +55,7 @@ #include #include #include +#include #include "bluez/bluez_data_p.h" QT_BEGIN_NAMESPACE @@ -82,6 +83,9 @@ public: void stopEvents(); QBluetoothAddress addressForConnectionHandle(quint16 handle) const; + // active connections + QVector activeLowEnergyConnections() const; + bool sendConnectionUpdateCommand(quint16 handle, const QLowEnergyConnectionParameters ¶ms); bool sendConnectionParameterUpdateRequest(quint16 handle, const QLowEnergyConnectionParameters ¶ms); -- cgit v1.2.3