summaryrefslogtreecommitdiffstats
path: root/tradeshow/iot-sensortag/bluetoothdevice.cpp
diff options
context:
space:
mode:
authorKari Hautamäki <kari.hautamaki@qt.io>2017-02-16 08:33:49 +0200
committerMaurice Kalinowski <maurice.kalinowski@qt.io>2017-02-28 13:16:09 +0000
commit35c1c07cd676b9c9afb23ad7266a67d5b6aef03a (patch)
treed43445955be5f1799ca9bb9db2c6e2cfd7915370 /tradeshow/iot-sensortag/bluetoothdevice.cpp
parentdec3883a1d0d7d24c797cf517fa7fad85b24a1f2 (diff)
iot-sensortag: Allow reconnect after a failed connection attempt
A disconnected sensor tag can be tried to be reconnected by clicking on the chart area or starting rescan from the Sensor settings menu. During a (re)connection process a progress indicator is shown to the user. The user has a possibility to disconnect (and reconnect) a currently connect SensorDataProvider A new state, 'NotFound' is added in SensorTagDataProvider to distinguish between states when a Sensor Tag has not been discovered at all, and when it has already been discovered but is has been disconnected. Change-Id: I54eea72d8c92a67a5ccbb3bc192ac8f33ada1c39 Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
Diffstat (limited to 'tradeshow/iot-sensortag/bluetoothdevice.cpp')
-rw-r--r--tradeshow/iot-sensortag/bluetoothdevice.cpp59
1 files changed, 41 insertions, 18 deletions
diff --git a/tradeshow/iot-sensortag/bluetoothdevice.cpp b/tradeshow/iot-sensortag/bluetoothdevice.cpp
index bc1fc0a..667e7a2 100644
--- a/tradeshow/iot-sensortag/bluetoothdevice.cpp
+++ b/tradeshow/iot-sensortag/bluetoothdevice.cpp
@@ -84,6 +84,17 @@ BluetoothDevice::BluetoothDevice()
{
m_lastMilliseconds = QDateTime::currentMSecsSinceEpoch();
statusUpdated("Device created");
+
+ m_serviceDetailsTimer = new QTimer(this);
+ m_serviceDetailsTimer->setInterval(5000);
+ m_serviceDetailsTimer->setSingleShot(true);
+ connect(m_serviceDetailsTimer, &QTimer::timeout, [=]() {
+ qCDebug(boot2QtDemos) << "Service details timer timeout. No more services details found";
+ if (isDeviceReady())
+ setState(Connected);
+ else
+ setState(Disconnected);
+ });
}
BluetoothDevice::BluetoothDevice(const QBluetoothDeviceInfo &d)
@@ -94,8 +105,12 @@ BluetoothDevice::BluetoothDevice(const QBluetoothDeviceInfo &d)
BluetoothDevice::~BluetoothDevice()
{
- delete m_controller;
+ if (m_controller) {
+ m_controller->disconnect();
+ delete m_controller;
+ }
}
+
QString BluetoothDevice::getAddress() const
{
#if defined(Q_OS_DARWIN)
@@ -114,6 +129,7 @@ QString BluetoothDevice::getName() const
void BluetoothDevice::scanServices()
{
+ setState(Scanning);
if (!m_controller) {
statusUpdated("(Connecting to device...)");
// Connecting signals and slots for connecting to LE services.
@@ -131,6 +147,8 @@ void BluetoothDevice::scanServices()
m_controller->setRemoteAddressType(QLowEnergyController::PublicAddress);
m_controller->connectToDevice();
+ } else {
+ deviceConnected();
}
}
@@ -209,6 +227,8 @@ void BluetoothDevice::serviceScanDone()
if (!m_motionService)
qCDebug(boot2QtDemos) << "Motion service not found.";
+
+ m_serviceDetailsTimer->start();
}
void BluetoothDevice::temperatureDetailsDiscovered(QLowEnergyService::ServiceState newstate)
@@ -247,8 +267,7 @@ void BluetoothDevice::temperatureDetailsDiscovered(QLowEnergyService::ServiceSta
}
m_temperatureMeasurementStarted = true;
- if (isDeviceReady())
- setState(DeviceState::Connected);
+ m_serviceDetailsTimer->start();
}
}
@@ -287,8 +306,7 @@ void BluetoothDevice::barometerDetailsDiscovered(QLowEnergyService::ServiceState
}
m_barometerMeasurementStarted = true;
- if (isDeviceReady())
- setState(DeviceState::Connected);
+ m_serviceDetailsTimer->start();
}
}
@@ -328,8 +346,7 @@ void BluetoothDevice::humidityDetailsDiscovered(QLowEnergyService::ServiceState
}
m_humidityMeasurementStarted = true;
- if (isDeviceReady())
- setState(DeviceState::Connected);
+ m_serviceDetailsTimer->start();
}
}
@@ -369,8 +386,7 @@ void BluetoothDevice::lightIntensityDetailsDiscovered(QLowEnergyService::Service
}
m_lightIntensityMeasurementStarted = true;
- if (isDeviceReady())
- setState(DeviceState::Connected);
+ m_serviceDetailsTimer->start();
}
}
@@ -412,8 +428,7 @@ void BluetoothDevice::motionDetailsDiscovered(QLowEnergyService::ServiceState ne
m_motionService->writeCharacteristic(characteristic, QByteArray::fromHex(SENSORTAG_RAPID_TIMER_TIMEOUT_STR), QLowEnergyService::WriteWithResponse);
}
m_motionMeasurementStarted = true;
- if (isDeviceReady())
- setState(DeviceState::Connected);
+ m_serviceDetailsTimer->start();
}
}
@@ -461,10 +476,14 @@ double BluetoothDevice::convertIrTemperatureAPIReadingToCelsius(quint16 rawReadi
bool BluetoothDevice::isDeviceReady() const
{
- return m_temperatureMeasurementStarted
- && m_humidityMeasurementStarted
- && m_lightIntensityMeasurementStarted
- && m_motionMeasurementStarted;
+ if (m_temperatureMeasurementStarted
+ || m_barometerMeasurementStarted
+ || m_humidityMeasurementStarted
+ || m_lightIntensityMeasurementStarted
+ || m_motionMeasurementStarted) {
+ return true;
+ }
+ return false;
}
void BluetoothDevice::irTemperatureReceived(const QByteArray &value)
@@ -552,9 +571,13 @@ void BluetoothDevice::motionReceived(const QByteArray &value)
void BluetoothDevice::deviceConnected()
{
- setState(DeviceState::Scanning);
- statusUpdated("(Discovering services...)");
- m_controller->discoverServices();
+ if (isDeviceReady()) {
+ setState(Connected);
+ } else {
+ setState(DeviceState::Scanning);
+ statusUpdated("(Discovering services...)");
+ m_controller->discoverServices();
+ }
}
void BluetoothDevice::errorReceived(QLowEnergyController::Error /*error*/)