diff options
author | Alex Blasche <alexander.blasche@digia.com> | 2014-02-24 16:26:42 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-02-26 08:28:06 +0100 |
commit | 6de4ff7b44d32d2f0fea277d856ce4d3fe321c7e (patch) | |
tree | 9a270f66ba1305df3336433ec429bfc61334c264 | |
parent | dde5ae2f015a78a9002b98ef665a77429b7fc697 (diff) |
Optimize the gatttool interaction code.
Change-Id: Icd22be7e320e21d643dbda6f1ff1cdd1133ab04b
Reviewed-by: Nedim Hadzic <nedimhadzija@gmail.com>
Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
-rw-r--r-- | src/bluetooth/qlowenergyserviceinfo_bluez.cpp | 176 |
1 files changed, 86 insertions, 90 deletions
diff --git a/src/bluetooth/qlowenergyserviceinfo_bluez.cpp b/src/bluetooth/qlowenergyserviceinfo_bluez.cpp index 82eabd1d..85a8c2b2 100644 --- a/src/bluetooth/qlowenergyserviceinfo_bluez.cpp +++ b/src/bluetooth/qlowenergyserviceinfo_bluez.cpp @@ -84,11 +84,10 @@ void QLowEnergyServiceInfoPrivate::registerServiceWatcher() process = process->instance(); if (!process->isConnected()) { connect(process, SIGNAL(replySend(const QString &)), this, SLOT(replyReceived(const QString &))); - QString command; + QString command = QStringLiteral("gatttool -i ") + adapterAddress.toString() + QStringLiteral(" -b ") + deviceInfo.address().toString() + QStringLiteral(" -I"); if (randomAddress) - command = QStringLiteral("gatttool -i ") + adapterAddress.toString() + QStringLiteral(" -b ") + deviceInfo.address().toString() +QStringLiteral(" -I -t random"); - else - command = QStringLiteral("gatttool -i ") + adapterAddress.toString() + QStringLiteral(" -b ") + deviceInfo.address().toString() + QStringLiteral(" -I"); + command += QStringLiteral(" -t random"); + #ifdef QT_LOWENERGYSERVICE_DEBUG qDebug() << "[REGISTER] uuid inside: " << uuid << command; #endif @@ -105,10 +104,6 @@ void QLowEnergyServiceInfoPrivate::unregisterServiceWatcher() { if (connected) { process = process->instance(); - //process->executeCommand(QStringLiteral("disconnect")); - //process->executeCommand(QStringLiteral("\n")); - //process->executeCommand(QStringLiteral("exit")); - //process->executeCommand(QStringLiteral("\n")); process->endProcess(); connected = false; m_step = 0; @@ -153,14 +148,16 @@ void QLowEnergyServiceInfoPrivate::replyReceived(const QString &reply) break; case 2: if (reply.contains(QStringLiteral("attr")) && reply.contains(QStringLiteral("uuid"))){ - QStringList chars = reply.split(QStringLiteral("\n")); - for (int i = 1; i<chars.size(); i++){ - if (chars.at(i).contains(QStringLiteral("attr")) && chars.at(i).contains(QStringLiteral("uuid"))){ - QStringList l = chars.at(i).split(QRegularExpression(QStringLiteral("\\W+")), QString::SkipEmptyParts); - QString checkUuid = l.at(8) + QStringLiteral("-") + l.at(9) + QStringLiteral("-") + l.at(10) + QStringLiteral("-") + l.at(11) + QStringLiteral("-") + l.at(12); - if ( checkUuid == uuid.toString().remove(QLatin1Char('{')).remove(QLatin1Char('}'))) { - startingHandle = l.at(2); - endingHandle = l.at(6); + const QStringList handles = reply.split(QStringLiteral("\n")); + foreach (const QString &handle, handles) { + if (handle.contains(QStringLiteral("attr")) && handle.contains(QStringLiteral("uuid"))) { + const QStringList handleDetails = handle.split(QRegularExpression(QStringLiteral("[\\s+|,]")), + QString::SkipEmptyParts); + Q_ASSERT(handleDetails.count() == 9); + const QBluetoothUuid foundUuid(handleDetails.at(8)); + if (foundUuid == uuid) { + startingHandle = handleDetails.at(2); + endingHandle = handleDetails.at(6); stepSet = true; } } @@ -170,44 +167,43 @@ void QLowEnergyServiceInfoPrivate::replyReceived(const QString &reply) } break; case 3: - stepSet = false; if (reply.contains(QStringLiteral("char")) && reply.contains(QStringLiteral("uuid"))) { - QStringList chars = reply.split(QStringLiteral("\n")); - for (int i = 1; i<chars.size(); i++){ - - if (chars.at(i).contains(QStringLiteral("char")) && chars.at(i).contains(QStringLiteral("uuid"))){ - QStringList l = chars.at(i).split(QRegularExpression(QStringLiteral("\\W+")), QString::SkipEmptyParts); + const QStringList handles = reply.split(QStringLiteral("\n")); + foreach (const QString& handle, handles) { + if (handle.contains(QStringLiteral("char")) && handle.contains(QStringLiteral("uuid"))) { + const QStringList handleDetails = handle.split(QRegularExpression(QStringLiteral("[\\s+|,]")), + QString::SkipEmptyParts); #ifdef QT_LOWENERGYSERVICE_DEBUG - qDebug() <<l; + qDebug() << handleDetails; #endif - QString charHandle = l.at(8); - if ( charHandle.toUShort(0,0) >= startingHandle.toUShort(0,0) && charHandle.toUShort(0,0) <= endingHandle.toUShort(0,0)) { - QString u(QStringLiteral("%1-%2-%3-%4-%5")); - u = u.arg(l.at(10)).arg(l.at(11)).arg(l.at(12)).arg(l.at(13)).arg(l.at(14)); - QBluetoothUuid charUuid(u); - QVariantMap map = QVariantMap(); - - QLowEnergyCharacteristicInfo chars(charUuid); - chars.d_ptr->handle = charHandle; - chars.d_ptr->startingHandle = l.at(1); - QString perm = l.at(4); - chars.d_ptr->permission = perm.toUShort(0,0); + Q_ASSERT(handleDetails.count() == 11); + const QString charHandle = handleDetails.at(8); + ushort charHandleId = charHandle.toUShort(0, 0); + if ( charHandleId >= startingHandle.toUShort(0,0) && + charHandleId <= endingHandle.toUShort(0,0)) + { + const QBluetoothUuid charUuid(handleDetails.at(10)); + QVariantMap map; + + QLowEnergyCharacteristicInfo charInfo(charUuid); + charInfo.d_ptr->handle = charHandle; + charInfo.d_ptr->startingHandle = handleDetails.at(1); + charInfo.d_ptr->permission = handleDetails.at(4).toUShort(0,0); map[QStringLiteral("uuid")] = charUuid.toString(); map[QStringLiteral("handle")] = charHandle; - map[QStringLiteral("permission")] = chars.d_ptr->permission; - chars.d_ptr->properties = map; - if ((chars.d_ptr->permission & QLowEnergyCharacteristicInfo::Read) == 0) { + map[QStringLiteral("permission")] = charInfo.d_ptr->permission; + charInfo.d_ptr->properties = map; + if (!(charInfo.d_ptr->permission & QLowEnergyCharacteristicInfo::Read)) { #ifdef QT_LOWENERGYSERVICE_DEBUG - qDebug() << "GATT characteristic: Read not permitted: " << chars.d_ptr->uuid; + qDebug() << "GATT characteristic: Read not permitted: " << charInfo.d_ptr->uuid; #endif - } - else + } else { m_readCounter++; - characteristicList.append(chars); + } + characteristicList.append(charInfo); stepSet = true; } } - } #ifdef QT_LOWENERGYSERVICE_DEBUG qDebug() << "COUNTER : " << m_readCounter; @@ -217,33 +213,33 @@ void QLowEnergyServiceInfoPrivate::replyReceived(const QString &reply) } break; case 4: - stepSet = false; if (reply.contains(QStringLiteral("handle")) && reply.contains(QStringLiteral("value"))) { - QStringList chars = reply.split(QStringLiteral("\n")); - for (int i = 1; i<chars.size(); i++){ - - if (chars.at(i).contains(QStringLiteral("handle")) && chars.at(i).contains(QStringLiteral("value"))){ - QStringList l = chars.at(i).split(QRegularExpression(QStringLiteral("\\W+")), QString::SkipEmptyParts); + const QStringList handles = reply.split(QStringLiteral("\n")); + foreach (const QString handle, handles) { + if (handle.contains(QStringLiteral("handle")) && handle.contains(QStringLiteral("value"))) { + const QStringList handleDetails = handle.split(QRegularExpression(QStringLiteral("\\W+")), QString::SkipEmptyParts); if (!characteristicList.isEmpty()) { for (int j = 0; j < (characteristicList.size()-1); j++) { - QLowEnergyCharacteristicInfo chars((QLowEnergyCharacteristicInfo)characteristicList.at(j)); + QLowEnergyCharacteristicInfo chars = characteristicList.at(j); + QLowEnergyCharacteristicInfo charsNext = characteristicList.at(j+1); + const QString handleId = handleDetails.at(1); + ushort h = handleId.toUShort(0, 0); #ifdef QT_LOWENERGYSERVICE_DEBUG - qDebug() << l.at(1) << l.at(1).toUShort(0,0)<< chars.handle() << chars.handle().toUShort(0,0); + qDebug() << handleId << h << chars.handle() << chars.handle().toUShort(0,0); #endif - QLowEnergyCharacteristicInfo charsNext = (QLowEnergyCharacteristicInfo)characteristicList.at(j+1); - if (l.at(1).toUShort(0,0) > chars.handle().toUShort(0,0) && l.at(1).toUShort(0,0) < charsNext.handle().toUShort(0,0)) { - chars.d_ptr->notificationHandle = l.at(1); + if (h > chars.handle().toUShort(0,0) && h < charsNext.handle().toUShort(0,0)) { + chars.d_ptr->notificationHandle = handleId; chars.d_ptr->notification = true; - QString notUuid = QStringLiteral("0x2902"); - QBluetoothUuid descUuid(notUuid.toUShort(0,0)); - QLowEnergyDescriptorInfo descriptor(descUuid, l.at(1)); - QString val = QStringLiteral(""); - for (int k = 0; k < l.size(); k++) - val = val + l.at(k); + QBluetoothUuid descUuid((ushort)0x2902); + QLowEnergyDescriptorInfo descriptor(descUuid, handleId); + QString val; + //TODO why do we start parsing value from k = 0? Shouldn't it be k = 2 + for (int k = 3; k < handleDetails.size(); k++) + val = val + handleDetails.at(k); descriptor.d_ptr->m_value = val.toUtf8(); - QVariantMap map = QVariantMap(); + QVariantMap map; map[QStringLiteral("uuid")] = descUuid.toString(); - map[QStringLiteral("handle")] = l.at(1); + map[QStringLiteral("handle")] = handleId; map[QStringLiteral("value")] = val.toUtf8(); characteristicList[j].d_ptr->descriptorsList.append(descriptor); #ifdef QT_LOWENERGYSERVICE_DEBUG @@ -251,11 +247,8 @@ void QLowEnergyServiceInfoPrivate::replyReceived(const QString &reply) #endif } } - } - } - } #ifdef QT_LOWENERGYSERVICE_DEBUG qDebug() << "COUNTER : " << m_readCounter; @@ -275,21 +268,23 @@ void QLowEnergyServiceInfoPrivate::replyReceived(const QString &reply) case 5: // This part is for reading characteristic values if (reply.contains(QStringLiteral("handle")) && reply.contains(QStringLiteral("value"))) { - QStringList chars = reply.split(QStringLiteral("\n")); - for (int i = 1; i<chars.size(); i++){ - - if (chars.at(i).contains(QStringLiteral("handle")) && chars.at(i).contains(QStringLiteral("value"))){ - QStringList l = chars.at(i).split(QRegularExpression(QStringLiteral("\\W+")), QString::SkipEmptyParts); + const QStringList handles = reply.split(QStringLiteral("\n")); + foreach (const QString &handle, handles) { + if (handle.contains(QStringLiteral("handle")) && + handle.contains(QStringLiteral("value"))) + { + const QStringList handleDetails = handle.split(QRegularExpression(QStringLiteral("\\W+")), QString::SkipEmptyParts); if (!characteristicList.isEmpty()) { for (int j = 0; j < characteristicList.size(); j++) { - QLowEnergyCharacteristicInfo chars((QLowEnergyCharacteristicInfo)characteristicList.at(j)); + const QLowEnergyCharacteristicInfo chars = characteristicList.at(j); + const QString handleId = handleDetails.at(1); #ifdef QT_LOWENERGYSERVICE_DEBUG - qDebug() << l.at(1) << l.at(1).toUShort(0,0)<< chars.handle() << chars.handle().toUShort(0,0); + qDebug() << handleId << handleId.toUShort(0,0) << chars.handle() << chars.handle().toUShort(0,0); #endif - if (((QString)l.at(1)).toUShort(0,0) == chars.handle().toUShort(0,0)) { - QString value = QStringLiteral(""); - for ( int k = 3; k < l.size(); k++) - value = value + l.at(k); + if (handleId.toUShort(0,0) == chars.handle().toUShort(0,0)) { + QString value; + for ( int k = 3; k < handleDetails.size(); k++) + value = value + handleDetails.at(k); characteristicList[j].d_ptr->value = value.toUtf8(); #ifdef QT_LOWENERGYSERVICE_DEBUG qDebug() << "Characteristic value set." << chars.d_ptr->handle << value; @@ -297,11 +292,8 @@ void QLowEnergyServiceInfoPrivate::replyReceived(const QString &reply) m_valueCounter++; } } - } - } - } if (m_valueCounter == m_readCounter) { m_step++; @@ -332,20 +324,19 @@ void QLowEnergyServiceInfoPrivate::connectToTerminal() void QLowEnergyServiceInfoPrivate::setHandles() { - QString command = QStringLiteral("primary "); #ifdef QT_LOWENERGYSERVICE_DEBUG - qDebug() << "Setting handles: " << command; + qDebug() << "Setting handles: primary"; #endif - process->executeCommand(command); + process->executeCommand(QStringLiteral("primary")); process->executeCommand(QStringLiteral("\n")); m_step++; } void QLowEnergyServiceInfoPrivate::setCharacteristics() { - QString command = QStringLiteral("characteristics ") + startingHandle + QStringLiteral(" ") + endingHandle; + const QString command = QStringLiteral("characteristics ") + startingHandle + QStringLiteral(" ") + endingHandle; #ifdef QT_LOWENERGYSERVICE_DEBUG - qDebug() << "Setting characteristics: " <<command; + qDebug() << "Setting characteristics: " << command; #endif process->executeCommand(command); process->executeCommand(QStringLiteral("\n")); @@ -354,8 +345,10 @@ void QLowEnergyServiceInfoPrivate::setCharacteristics() void QLowEnergyServiceInfoPrivate::setNotifications() { - QString command = QStringLiteral("char-read-uuid 2902"); - process->executeCommand(command); +#ifdef QT_LOWENERGYSERVICE_DEBUG + qDebug() << "Setting notifications: char-read-uuid 2902"; +#endif + process->executeCommand(QStringLiteral("char-read-uuid 2902")); process->executeCommand(QStringLiteral("\n")); m_step++; } @@ -363,9 +356,12 @@ void QLowEnergyServiceInfoPrivate::setNotifications() void QLowEnergyServiceInfoPrivate::readCharacteristicValue() { for (int i = 0; i < characteristicList.size(); i++) { - if ((characteristicList.at(i).d_ptr->permission & QLowEnergyCharacteristicInfo::Read) != 0) { - QString uuidHandle = characteristicList.at(i).uuid().toString().remove(QLatin1Char('{')).remove(QLatin1Char('}')); - QString command = QStringLiteral("char-read-uuid ") + uuidHandle; + if ((characteristicList.at(i).d_ptr->permission & QLowEnergyCharacteristicInfo::Read)) { + const QString uuidHandle = characteristicList.at(i).uuid().toString().remove(QLatin1Char('{')).remove(QLatin1Char('}')); +#ifdef QT_LOWENERGYSERVICE_DEBUG + qDebug() << "FFFFFF Setting notifications: char-read-uuid " << uuidHandle ; +#endif + const QString command = QStringLiteral("char-read-uuid ") + uuidHandle; process->executeCommand(command); process->executeCommand(QStringLiteral("\n")); } @@ -375,7 +371,7 @@ void QLowEnergyServiceInfoPrivate::readCharacteristicValue() void QLowEnergyServiceInfoPrivate::readDescriptors() { - QString command = QStringLiteral("char-desc ") + startingHandle + QStringLiteral(" ") + endingHandle; + const QString command = QStringLiteral("char-desc ") + startingHandle + QStringLiteral(" ") + endingHandle; process->executeCommand(command); process->executeCommand(QStringLiteral("\n")); |