summaryrefslogtreecommitdiffstats
path: root/examples/bluetooth/heartrate-game/devicehandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/bluetooth/heartrate-game/devicehandler.cpp')
-rw-r--r--examples/bluetooth/heartrate-game/devicehandler.cpp136
1 files changed, 47 insertions, 89 deletions
diff --git a/examples/bluetooth/heartrate-game/devicehandler.cpp b/examples/bluetooth/heartrate-game/devicehandler.cpp
index 83a4fbbe..c264d771 100644
--- a/examples/bluetooth/heartrate-game/devicehandler.cpp
+++ b/examples/bluetooth/heartrate-game/devicehandler.cpp
@@ -1,73 +1,23 @@
-/***************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the examples of the QtBluetooth module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#include "heartrate-global.h"
#include "devicehandler.h"
#include "deviceinfo.h"
+#include "heartrate-global.h"
+
#include <QtEndian>
#include <QRandomGenerator>
DeviceHandler::DeviceHandler(QObject *parent) :
- BluetoothBaseClass(parent),
- m_foundHeartRateService(false),
- m_measuring(false),
- m_currentValue(0),
- m_min(0), m_max(0), m_sum(0), m_avg(0), m_calories(0)
+ BluetoothBaseClass(parent)
{
-#ifdef SIMULATOR
- m_demoTimer.setSingleShot(false);
- m_demoTimer.setInterval(2000);
- connect(&m_demoTimer, &QTimer::timeout, this, &DeviceHandler::updateDemoHR);
- m_demoTimer.start();
- updateDemoHR();
-#endif
+ if (simulator) {
+ m_demoTimer.setSingleShot(false);
+ m_demoTimer.setInterval(2000);
+ connect(&m_demoTimer, &QTimer::timeout, this, &DeviceHandler::updateDemoHR);
+ m_demoTimer.start();
+ updateDemoHR();
+ }
}
void DeviceHandler::setAddressType(AddressType type)
@@ -95,10 +45,11 @@ void DeviceHandler::setDevice(DeviceInfo *device)
clearMessages();
m_currentDevice = device;
-#ifdef SIMULATOR
- setInfo(tr("Demo device connected."));
- return;
-#endif
+ if (simulator) {
+ setInfo(tr("Demo device connected."));
+ setIcon(IconBluetooth);
+ return;
+ }
// Disconnect and delete old connection
if (m_control) {
@@ -121,17 +72,20 @@ void DeviceHandler::setDevice(DeviceInfo *device)
connect(m_control, &QLowEnergyController::discoveryFinished,
this, &DeviceHandler::serviceScanDone);
- connect(m_control, static_cast<void (QLowEnergyController::*)(QLowEnergyController::Error)>(&QLowEnergyController::error),
- this, [this](QLowEnergyController::Error error) {
- Q_UNUSED(error);
- setError("Cannot connect to remote device.");
- });
+ connect(m_control, &QLowEnergyController::errorOccurred, this,
+ [this](QLowEnergyController::Error error) {
+ Q_UNUSED(error);
+ setError("Cannot connect to remote device.");
+ setIcon(IconError);
+ });
connect(m_control, &QLowEnergyController::connected, this, [this]() {
setInfo("Controller connected. Search services...");
+ setIcon(IconProgress);
m_control->discoverServices();
});
connect(m_control, &QLowEnergyController::disconnected, this, [this]() {
setError("LowEnergy controller disconnected");
+ setIcon(IconError);
});
// Connect
@@ -164,8 +118,9 @@ void DeviceHandler::stopMeasurement()
//! [Filter HeartRate service 1]
void DeviceHandler::serviceDiscovered(const QBluetoothUuid &gatt)
{
- if (gatt == QBluetoothUuid(QBluetoothUuid::HeartRate)) {
+ if (gatt == QBluetoothUuid(QBluetoothUuid::ServiceClassUuid::HeartRate)) {
setInfo("Heart Rate service discovered. Waiting for service scan to be done...");
+ setIcon(IconProgress);
m_foundHeartRateService = true;
}
}
@@ -174,6 +129,7 @@ void DeviceHandler::serviceDiscovered(const QBluetoothUuid &gatt)
void DeviceHandler::serviceScanDone()
{
setInfo("Service scan done.");
+ setIcon(IconBluetooth);
// Delete old service if available
if (m_service) {
@@ -184,7 +140,7 @@ void DeviceHandler::serviceScanDone()
//! [Filter HeartRate service 2]
// If heartRateService found, create new service
if (m_foundHeartRateService)
- m_service = m_control->createServiceObject(QBluetoothUuid(QBluetoothUuid::HeartRate), this);
+ m_service = m_control->createServiceObject(QBluetoothUuid(QBluetoothUuid::ServiceClassUuid::HeartRate), this);
if (m_service) {
connect(m_service, &QLowEnergyService::stateChanged, this, &DeviceHandler::serviceStateChanged);
@@ -193,6 +149,7 @@ void DeviceHandler::serviceScanDone()
m_service->discoverDetails();
} else {
setError("Heart Rate Service not found.");
+ setIcon(IconError);
}
//! [Filter HeartRate service 2]
}
@@ -202,20 +159,24 @@ void DeviceHandler::serviceScanDone()
void DeviceHandler::serviceStateChanged(QLowEnergyService::ServiceState s)
{
switch (s) {
- case QLowEnergyService::DiscoveringServices:
+ case QLowEnergyService::RemoteServiceDiscovering:
setInfo(tr("Discovering services..."));
+ setIcon(IconProgress);
break;
- case QLowEnergyService::ServiceDiscovered:
+ case QLowEnergyService::RemoteServiceDiscovered:
{
setInfo(tr("Service discovered."));
+ setIcon(IconBluetooth);
- const QLowEnergyCharacteristic hrChar = m_service->characteristic(QBluetoothUuid(QBluetoothUuid::HeartRateMeasurement));
+ const QLowEnergyCharacteristic hrChar =
+ m_service->characteristic(QBluetoothUuid(QBluetoothUuid::CharacteristicType::HeartRateMeasurement));
if (!hrChar.isValid()) {
setError("HR Data not found.");
+ setIcon(IconError);
break;
}
- m_notificationDesc = hrChar.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration);
+ m_notificationDesc = hrChar.descriptor(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
if (m_notificationDesc.isValid())
m_service->writeDescriptor(m_notificationDesc, QByteArray::fromHex("0100"));
@@ -234,7 +195,7 @@ void DeviceHandler::serviceStateChanged(QLowEnergyService::ServiceState s)
void DeviceHandler::updateHeartRateValue(const QLowEnergyCharacteristic &c, const QByteArray &value)
{
// ignore any other characteristic change -> shouldn't really happen though
- if (c.uuid() != QBluetoothUuid(QBluetoothUuid::HeartRateMeasurement))
+ if (c.uuid() != QBluetoothUuid(QBluetoothUuid::CharacteristicType::HeartRateMeasurement))
return;
auto data = reinterpret_cast<const quint8 *>(value.constData());
@@ -251,21 +212,18 @@ void DeviceHandler::updateHeartRateValue(const QLowEnergyCharacteristic &c, cons
}
//! [Reading value]
-#ifdef SIMULATOR
void DeviceHandler::updateDemoHR()
{
int randomValue = 0;
- if (m_currentValue < 30) { // Initial value
+ if (m_currentValue < 30) // Initial value
randomValue = 55 + QRandomGenerator::global()->bounded(30);
- } else if (!m_measuring) { // Value when relax
+ else if (!m_measuring) // Value when relax
randomValue = qBound(55, m_currentValue - 2 + QRandomGenerator::global()->bounded(5), 75);
- } else { // Measuring
+ else // Measuring
randomValue = m_currentValue + QRandomGenerator::global()->bounded(10) - 2;
- }
addMeasurement(randomValue);
}
-#endif
void DeviceHandler::confirmedDescriptorWrite(const QLowEnergyDescriptor &d, const QByteArray &value)
{
@@ -301,12 +259,11 @@ bool DeviceHandler::measuring() const
bool DeviceHandler::alive() const
{
-#ifdef SIMULATOR
- return true;
-#endif
+ if (simulator)
+ return true;
if (m_service)
- return m_service->state() == QLowEnergyService::ServiceDiscovered;
+ return m_service->state() == QLowEnergyService::RemoteServiceDiscovered;
return false;
}
@@ -355,7 +312,8 @@ void DeviceHandler::addMeasurement(int value)
m_max = qMax(value, m_max);
m_sum += value;
m_avg = (double)m_sum / m_measurements.size();
- m_calories = ((-55.0969 + (0.6309 * m_avg) + (0.1988 * 94) + (0.2017 * 24)) / 4.184) * 60 * time()/3600;
+ m_calories = ((-55.0969 + (0.6309 * m_avg) + (0.1988 * 94) + (0.2017 * 24)) / 4.184)
+ * 60 * time() / 3600;
}
emit statsChanged();