From cc73478e1ff48a6e469d3856c552e7a5e3d5023d Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Tue, 14 Feb 2017 11:06:55 +0100 Subject: iot-sensortag: Rework service discovery MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of iterating over the list of the controller's services after discovery is finished, handle the found services one by one when the according serviceDiscovered signal is emitted. Change-Id: I84d879059222189fb106e085bd9f2e4d3cb44bb5 Reviewed-by: Kari Hautamäki --- tradeshow/iot-sensortag/bluetoothapiconstants.h | 7 ++ tradeshow/iot-sensortag/bluetoothdevice.cpp | 119 +++++++++++------------- 2 files changed, 60 insertions(+), 66 deletions(-) diff --git a/tradeshow/iot-sensortag/bluetoothapiconstants.h b/tradeshow/iot-sensortag/bluetoothapiconstants.h index b29d73b..57d0849 100644 --- a/tradeshow/iot-sensortag/bluetoothapiconstants.h +++ b/tradeshow/iot-sensortag/bluetoothapiconstants.h @@ -52,6 +52,13 @@ // NOTE! This file should only contain defines, no implementation +// These service UUIDs come from the Texas Intruments SensorTag Bluetooth LE API specification +#define IRTEMPERATURESENSOR_SERVICE_UUID "f00aa00-0451-4000-b000-000000000000" +#define BAROMETER_SERVICE_UUID "f000aa40-0451-4000-b000-000000000000" +#define HUMIDITYSENSOR_SERVICE_UUID "f000aa20-0451-4000-b000-000000000000" +#define LIGHTSENSOR_SERVICE_UUID "f000aa70-0451-4000-b000-000000000000" +#define MOTIONSENSOR_SERVICE_UUID "f000aa80-0451-4000-b000-000000000000" + /* Timeouts (values between 100ms and 2500ms allowed by API specification. * API values are passed in hex as strings and multiplied by 10 in SensorTag. * These values can be modifed as needed by performance. diff --git a/tradeshow/iot-sensortag/bluetoothdevice.cpp b/tradeshow/iot-sensortag/bluetoothdevice.cpp index 800a8ab..ba9aa55 100644 --- a/tradeshow/iot-sensortag/bluetoothdevice.cpp +++ b/tradeshow/iot-sensortag/bluetoothdevice.cpp @@ -162,93 +162,80 @@ void BluetoothDevice::scanServices() void BluetoothDevice::addLowEnergyService(const QBluetoothUuid &serviceUuid) { -} - -void BluetoothDevice::serviceScanDone() -{ - statusUpdated("(Service scan done!)"); - qCDebug(boot2QtDemos) << "ServiceScan done."; - if (!irTemperatureService) - { - QBluetoothUuid uuid; - for (int i = 0; i < controller->services().count(); i++) { - QBluetoothUuid id = controller->services().at(i); - if (id.toString().contains("f000aa00-0451-4000-b000-000000000000")) { - uuid = id; - break; - } + if (serviceUuid == QBluetoothUuid(QLatin1String(IRTEMPERATURESENSOR_SERVICE_UUID))) { + qCDebug(boot2QtDemos) << "Found infrared temperature service."; + irTemperatureService = controller->createServiceObject(serviceUuid); + if (!irTemperatureService) { + qWarning() << "Could not create infrared temperature service object."; + return; } - - irTemperatureService = controller->createServiceObject(uuid); connect(irTemperatureService, &QLowEnergyService::stateChanged, this, &BluetoothDevice::temperatureDetailsDiscovered); connect(irTemperatureService, &QLowEnergyService::characteristicChanged, this, &BluetoothDevice::characteristicsRead); irTemperatureService->discoverDetails(); - } - if (!baroService) - { - QBluetoothUuid uuid; - for (int i = 0; i < controller->services().count(); i++) { - QBluetoothUuid id = controller->services().at(i); - if (id.toString().contains("f000aa40-0451-4000-b000-000000000000")) { - uuid = id; - break; - } + } else if (serviceUuid == QBluetoothUuid(QLatin1String(BAROMETER_SERVICE_UUID))) { + qCDebug(boot2QtDemos) << "Found barometer service."; + baroService = controller->createServiceObject(serviceUuid); + if (!baroService) { + qWarning() << "Could not create barometer service object."; + return; } - - baroService = controller->createServiceObject(uuid); connect(baroService, &QLowEnergyService::stateChanged, this, &BluetoothDevice::barometerDetailsDiscovered); connect(baroService, &QLowEnergyService::characteristicChanged, this, &BluetoothDevice::characteristicsRead); baroService->discoverDetails(); - } - if (!humidityService) - { - QBluetoothUuid uuid; - for (int i = 0; i < controller->services().count(); i++) { - QBluetoothUuid id = controller->services().at(i); - if (id.toString().contains("f000aa20-0451-4000-b000-000000000000")) { - uuid = id; - break; - } - + } else if (serviceUuid == QBluetoothUuid(QLatin1String(HUMIDITYSENSOR_SERVICE_UUID))) { + qCDebug(boot2QtDemos) << "Found humidity service."; + humidityService = controller->createServiceObject(serviceUuid); + if (!humidityService) { + qWarning() << "Could not create humidity service object."; + return; } - - humidityService = controller->createServiceObject(uuid); connect(humidityService, &QLowEnergyService::stateChanged, this, &BluetoothDevice::humidityDetailsDiscovered); connect(humidityService, &QLowEnergyService::characteristicChanged, this, &BluetoothDevice::characteristicsRead); humidityService->discoverDetails(); - } - if (!lightService) - { - QBluetoothUuid uuid; - for (int i = 0; i < controller->services().count(); i++) { - QBluetoothUuid id = controller->services().at(i); - if (id.toString().contains("f000aa70-0451-4000-b000-000000000000")) { - uuid = id; - break; - } - + } else if (serviceUuid == QBluetoothUuid(QLatin1String(LIGHTSENSOR_SERVICE_UUID))) { + qCDebug(boot2QtDemos) << "Found light service."; + lightService = controller->createServiceObject(serviceUuid); + if (!lightService) { + qWarning() << "Could not create light service object."; + return; } - - lightService = controller->createServiceObject(uuid); connect(lightService, &QLowEnergyService::stateChanged, this, &BluetoothDevice::lightIntensityDetailsDiscovered); connect(lightService, &QLowEnergyService::characteristicChanged, this, &BluetoothDevice::characteristicsRead); lightService->discoverDetails(); - } - if (!motionService) - { - QBluetoothUuid uuid; - for (int i = 0; i < controller->services().count(); i++) { - QBluetoothUuid id = controller->services().at(i); - if (id.toString().contains("f000aa80-0451-4000-b000-000000000000")) { - uuid = id; - break; - } + } else if (serviceUuid == QBluetoothUuid(QLatin1String(MOTIONSENSOR_SERVICE_UUID))) { + qCDebug(boot2QtDemos) << "Found motion service."; + motionService = controller->createServiceObject(serviceUuid); + if (!motionService) { + qWarning() << "Could not create motion service object."; + return; } - motionService = controller->createServiceObject(uuid); connect(motionService, &QLowEnergyService::stateChanged, this, &BluetoothDevice::motionDetailsDiscovered); connect(motionService, &QLowEnergyService::characteristicChanged, this, &BluetoothDevice::characteristicsRead); motionService->discoverDetails(); + } else { + qCDebug(boot2QtDemos) << "Found unhandled service with id" << serviceUuid << "."; } +} + +void BluetoothDevice::serviceScanDone() +{ + statusUpdated("(Service scan done!)"); + qCDebug(boot2QtDemos) << "ServiceScan done."; + if (!irTemperatureService) + qCDebug(boot2QtDemos) << "Infrared temperature service not found."; + + if (!baroService) + qCDebug(boot2QtDemos) << "Barometer service not found."; + + if (!humidityService) + qCDebug(boot2QtDemos) << "Humidity service not found."; + + if (!lightService) + qCDebug(boot2QtDemos) << "Light service not found."; + + if (!motionService) + qCDebug(boot2QtDemos) << "Motion service not found."; + attitudeChangeInterval.restart(); } -- cgit v1.2.3