diff --git a/senic/devicepluginsenic.cpp b/senic/devicepluginsenic.cpp index 2cd3af7c..b4d9cf21 100644 --- a/senic/devicepluginsenic.cpp +++ b/senic/devicepluginsenic.cpp @@ -37,6 +37,7 @@ void DevicePluginSenic::init() connect(this, &DevicePluginSenic::configValueChanged, this, &DevicePluginSenic::onPluginConfigurationChanged); } + Device::DeviceError DevicePluginSenic::discoverDevices(const DeviceClassId &deviceClassId, const ParamList ¶ms) { Q_UNUSED(params) @@ -56,6 +57,7 @@ Device::DeviceError DevicePluginSenic::discoverDevices(const DeviceClassId &devi return Device::DeviceErrorAsync; } + Device::DeviceSetupStatus DevicePluginSenic::setupDevice(Device *device) { if (!m_reconnectTimer) { @@ -70,11 +72,13 @@ Device::DeviceSetupStatus DevicePluginSenic::setupDevice(Device *device) BluetoothLowEnergyDevice *bluetoothDevice = hardwareManager()->bluetoothLowEnergyManager()->registerDevice(deviceInfo, QLowEnergyController::RandomAddress); - Nuimo *nuimo = new Nuimo(device, bluetoothDevice, this); + Nuimo *nuimo = new Nuimo(bluetoothDevice, this); connect(nuimo, &Nuimo::buttonPressed, this, &DevicePluginSenic::onButtonPressed); connect(nuimo, &Nuimo::buttonReleased, this, &DevicePluginSenic::onButtonReleased); connect(nuimo, &Nuimo::swipeDetected, this, &DevicePluginSenic::onSwipeDetected); connect(nuimo, &Nuimo::rotationValueChanged, this, &DevicePluginSenic::onRotationValueChanged); + connect(nuimo, &Nuimo::connectedChanged, this, &DevicePluginSenic::onConnectedChanged); + connect(nuimo, &Nuimo::deviceInformationChanged, this, &DevicePluginSenic::onDeviceInformationChanged); m_nuimos.insert(nuimo, device); nuimo->bluetoothDevice()->connectDevice(); @@ -82,6 +86,7 @@ Device::DeviceSetupStatus DevicePluginSenic::setupDevice(Device *device) return Device::DeviceSetupStatusSuccess; } + Device::DeviceError DevicePluginSenic::executeAction(Device *device, const Action &action) { QPointer nuimo = m_nuimos.key(device); @@ -127,6 +132,7 @@ Device::DeviceError DevicePluginSenic::executeAction(Device *device, const Actio return Device::DeviceErrorActionTypeNotFound; } + void DevicePluginSenic::deviceRemoved(Device *device) { if (!m_nuimos.values().contains(device)) @@ -156,9 +162,10 @@ void DevicePluginSenic::onReconnectTimeout() void DevicePluginSenic::onBluetoothDiscoveryFinished() { BluetoothDiscoveryReply *reply = static_cast(sender()); + reply->deleteLater(); + if (reply->error() != BluetoothDiscoveryReply::BluetoothDiscoveryReplyErrorNoError) { qCWarning(dcSenic()) << "Bluetooth discovery error:" << reply->error(); - reply->deleteLater(); emit devicesDiscovered(nuimoDeviceClassId, QList()); return; } @@ -180,11 +187,17 @@ void DevicePluginSenic::onBluetoothDiscoveryFinished() deviceDescriptors.append(descriptor); } } - - reply->deleteLater(); emit devicesDiscovered(nuimoDeviceClassId, deviceDescriptors); } +void DevicePluginSenic::onConnectedChanged(bool connected) +{ + Nuimo *nuimo = static_cast(sender()); + Device *device = m_nuimos.value(nuimo); + + device->setStateValue(nuimoConnectedStateTypeId, connected); +} + void DevicePluginSenic::onButtonPressed() { @@ -200,9 +213,10 @@ void DevicePluginSenic::onButtonPressed() void DevicePluginSenic::onButtonReleased() { - // TODO: user timer for detekt long pressed (if needed) + // ENHANCEMENT: user timer to detekt long press events } + void DevicePluginSenic::onSwipeDetected(const Nuimo::SwipeDirection &direction) { Nuimo *nuimo = static_cast(sender()); @@ -241,6 +255,7 @@ void DevicePluginSenic::onSwipeDetected(const Nuimo::SwipeDirection &direction) } } + void DevicePluginSenic::onRotationValueChanged(const uint &value) { Nuimo *nuimo = static_cast(sender()); @@ -248,6 +263,18 @@ void DevicePluginSenic::onRotationValueChanged(const uint &value) device->setStateValue(nuimoRotationStateTypeId, value); } + +void DevicePluginSenic::onDeviceInformationChanged(const QString &firmwareRevision, const QString &hardwareRevision, const QString &softwareRevision) +{ + Nuimo *nuimo = static_cast(sender()); + Device *device = m_nuimos.value(nuimo); + + device->setStateValue(nuimoFirmwareRevisionStateTypeId, firmwareRevision); + device->setStateValue(nuimoHardwareRevisionStateTypeId, hardwareRevision); + device->setStateValue(nuimoSoftwareRevisionStateTypeId, softwareRevision); +} + + void DevicePluginSenic::onPluginConfigurationChanged(const ParamTypeId ¶mTypeId, const QVariant &value) { qCDebug(dcSenic()) << "Plugin configuration changed"; @@ -258,3 +285,16 @@ void DevicePluginSenic::onPluginConfigurationChanged(const ParamTypeId ¶mTyp m_autoSymbolMode = value.toBool(); } } + +void DevicePluginSenic::onBatteryValueChanged(const uint &percentage) +{ + Nuimo *nuimo = static_cast(sender()); + Device *device = m_nuimos.value(nuimo); + + device->setStateValue(nuimoBatteryLevelStateTypeId, percentage); + if (percentage < 20) { + device->setStateValue(nuimoBatteryCriticalStateTypeId, true); + } else { + device->setStateValue(nuimoBatteryCriticalStateTypeId, false); + } +} diff --git a/senic/devicepluginsenic.h b/senic/devicepluginsenic.h index a6593d8b..2302a555 100644 --- a/senic/devicepluginsenic.h +++ b/senic/devicepluginsenic.h @@ -56,11 +56,13 @@ private slots: void onReconnectTimeout(); void onBluetoothDiscoveryFinished(); + void onConnectedChanged(bool connected); + void onBatteryValueChanged(const uint &percentage); void onButtonPressed(); void onButtonReleased(); void onSwipeDetected(const Nuimo::SwipeDirection &direction); void onRotationValueChanged(const uint &value); - + void onDeviceInformationChanged(const QString &firmwareRevision, const QString &hardwareRevision, const QString &softwareRevision); }; #endif // DEVICEPLUGINSENIC_H diff --git a/senic/nuimo.cpp b/senic/nuimo.cpp index 441935b9..6c2dabda 100644 --- a/senic/nuimo.cpp +++ b/senic/nuimo.cpp @@ -35,19 +35,14 @@ static QBluetoothUuid inputRotationCharacteristicUuid = QBluetoothUuid(QUuid(" static QBluetoothUuid inputButtonCharacteristicUuid = QBluetoothUuid(QUuid("f29b1529-cb19-40f3-be5c-7241ecb82fd2")); -Nuimo::Nuimo(Device *device, BluetoothLowEnergyDevice *bluetoothDevice, QObject *parent) : +Nuimo::Nuimo(BluetoothLowEnergyDevice *bluetoothDevice, QObject *parent) : QObject(parent), - m_device(device), m_bluetoothDevice(bluetoothDevice) { connect(m_bluetoothDevice, &BluetoothLowEnergyDevice::connectedChanged, this, &Nuimo::onConnectedChanged); connect(m_bluetoothDevice, &BluetoothLowEnergyDevice::servicesDiscoveryFinished, this, &Nuimo::onServiceDiscoveryFinished); } -Device *Nuimo::device() -{ - return m_device; -} BluetoothLowEnergyDevice *Nuimo::bluetoothDevice() { @@ -269,23 +264,12 @@ void Nuimo::printService(QLowEnergyService *service) } } -void Nuimo::setBatteryValue(const QByteArray &data) -{ - int batteryPercentage = data.toHex().toUInt(0, 16); - qCDebug(dcSenic()) << "Battery:" << batteryPercentage << "%"; - device()->setStateValue(nuimoBatteryLevelStateTypeId, batteryPercentage); - if (batteryPercentage < 20) { - device()->setStateValue(nuimoBatteryCriticalStateTypeId, true); - } else { - device()->setStateValue(nuimoBatteryCriticalStateTypeId, false); - } -} void Nuimo::onConnectedChanged(const bool &connected) { qCDebug(dcSenic()) << m_bluetoothDevice->name() << m_bluetoothDevice->address().toString() << (connected ? "connected" : "disconnected"); - m_device->setStateValue(nuimoConnectedStateTypeId, connected); + emit connectedChanged(connected); if (!connected) { // Clean up services @@ -399,11 +383,11 @@ void Nuimo::onDeviceInfoServiceStateChanged(const QLowEnergyService::ServiceStat qCDebug(dcSenic()) << "Device info service discovered."; printService(m_deviceInfoService); + QString firmware = QString::fromUtf8(m_deviceInfoService->characteristic(QBluetoothUuid::FirmwareRevisionString).value()); + QString hardware = QString::fromUtf8(m_deviceInfoService->characteristic(QBluetoothUuid::HardwareRevisionString).value()); + QString software = QString::fromUtf8(m_deviceInfoService->characteristic(QBluetoothUuid::SoftwareRevisionString).value()); - device()->setStateValue(nuimoFirmwareRevisionStateTypeId, QString::fromUtf8(m_deviceInfoService->characteristic(QBluetoothUuid::FirmwareRevisionString).value())); - device()->setStateValue(nuimoHardwareRevisionStateTypeId, QString::fromUtf8(m_deviceInfoService->characteristic(QBluetoothUuid::HardwareRevisionString).value())); - device()->setStateValue(nuimoSoftwareRevisionStateTypeId, QString::fromUtf8(m_deviceInfoService->characteristic(QBluetoothUuid::SoftwareRevisionString).value())); - + emit deviceInformationChanged(firmware, hardware, software); } void Nuimo::onBatteryServiceStateChanged(const QLowEnergyService::ServiceState &state) @@ -426,13 +410,15 @@ void Nuimo::onBatteryServiceStateChanged(const QLowEnergyService::ServiceState & QLowEnergyDescriptor notificationDescriptor = m_batteryCharacteristic.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration); m_batteryService->writeDescriptor(notificationDescriptor, QByteArray::fromHex("0100")); - setBatteryValue(m_batteryCharacteristic.value()); + uint batteryPercentage = m_batteryCharacteristic.value().toHex().toUInt(nullptr, 16); + emit batteryValueChanged(batteryPercentage); } void Nuimo::onBatteryCharacteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) { if (characteristic.uuid() == m_batteryCharacteristic.uuid()) { - setBatteryValue(value); + uint batteryPercentage = value.toHex().toUInt(nullptr, 16); + emit batteryValueChanged(batteryPercentage); } } @@ -482,7 +468,7 @@ void Nuimo::onInputServiceStateChanged(const QLowEnergyService::ServiceState &st void Nuimo::onInputCharacteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) { if (characteristic.uuid() == m_inputButtonCharacteristic.uuid()) { - bool pressed = (bool)value.toHex().toUInt(0, 16); + bool pressed = (bool)value.toHex().toUInt(nullptr, 16); qCDebug(dcSenic()) << "Button:" << (pressed ? "pressed": "released"); if (pressed) { emit buttonPressed(); @@ -493,7 +479,7 @@ void Nuimo::onInputCharacteristicChanged(const QLowEnergyCharacteristic &charact } if (characteristic.uuid() == m_inputSwipeCharacteristic.uuid()) { - quint8 swipe = (quint8)value.toHex().toUInt(0, 16); + quint8 swipe = (quint8)value.toHex().toUInt(nullptr, 16); switch (swipe) { case 0: qCDebug(dcSenic()) << "Swipe: Left"; diff --git a/senic/nuimo.h b/senic/nuimo.h index fca27c8d..8bec379e 100644 --- a/senic/nuimo.h +++ b/senic/nuimo.h @@ -27,7 +27,6 @@ #include #include "typeutils.h" -#include "devices/device.h" #include "hardware/bluetoothlowenergy/bluetoothlowenergydevice.h" class Nuimo : public QObject @@ -57,15 +56,13 @@ public: MatrixTypeLight }; - explicit Nuimo(Device *device, BluetoothLowEnergyDevice *bluetoothDevice, QObject *parent = nullptr); + explicit Nuimo(BluetoothLowEnergyDevice *bluetoothDevice, QObject *parent = nullptr); - Device *device(); BluetoothLowEnergyDevice *bluetoothDevice(); void showImage(const MatrixType &matrixType); private: - Device *m_device = nullptr; BluetoothLowEnergyDevice *m_bluetoothDevice = nullptr; QLowEnergyService *m_deviceInfoService = nullptr; @@ -83,19 +80,16 @@ private: uint m_rotationValue; void showMatrix(const QByteArray &matrix, const int &seconds); - void printService(QLowEnergyService *service); - // Set states - void setBatteryValue(const QByteArray &data); - signals: - void availableChanged(); + void connectedChanged(bool connected); void buttonPressed(); void buttonReleased(); - void batteryValueChaged(const uint &percentage); + void batteryValueChanged(const uint &percentage); void swipeDetected(const SwipeDirection &direction); void rotationValueChanged(const uint &value); + void deviceInformationChanged(const QString &firmwareRevision, const QString &hardwareRevision, const QString &softwareRevision); private slots: void onConnectedChanged(const bool &connected);