From 6ce95f7bda6a6a7829d25b5b6900f34619691162 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Thu, 19 Sep 2019 20:11:44 +0200 Subject: [PATCH] Update nuimo plugin --- senic/devicepluginsenic.cpp | 131 +++++++++++++++++------------------- senic/devicepluginsenic.h | 8 +-- 2 files changed, 63 insertions(+), 76 deletions(-) diff --git a/senic/devicepluginsenic.cpp b/senic/devicepluginsenic.cpp index a5f5ba56..c03df096 100644 --- a/senic/devicepluginsenic.cpp +++ b/senic/devicepluginsenic.cpp @@ -38,28 +38,50 @@ void DevicePluginSenic::init() } -Device::DeviceError DevicePluginSenic::discoverDevices(const DeviceClassId &deviceClassId, const ParamList ¶ms) +void DevicePluginSenic::discoverDevices(DeviceDiscoveryInfo *info) { - Q_UNUSED(params) - - if (deviceClassId != nuimoDeviceClassId) - return Device::DeviceErrorDeviceClassNotFound; - if (!hardwareManager()->bluetoothLowEnergyManager()->available()) - return Device::DeviceErrorHardwareNotAvailable; + return info->finish(Device::DeviceErrorHardwareNotAvailable, QT_TR_NOOP("Bluetooth is not available on this system.")); if (!hardwareManager()->bluetoothLowEnergyManager()->enabled()) - return Device::DeviceErrorHardwareNotAvailable; + return info->finish(Device::DeviceErrorHardwareNotAvailable, QT_TR_NOOP("Bluetooth is disabled. Please enable Bluetooth and try again.")); BluetoothDiscoveryReply *reply = hardwareManager()->bluetoothLowEnergyManager()->discoverDevices(); - connect(reply, &BluetoothDiscoveryReply::finished, this, &DevicePluginSenic::onBluetoothDiscoveryFinished); + connect(reply, &BluetoothDiscoveryReply::finished, reply, &BluetoothDiscoveryReply::deleteLater); - return Device::DeviceErrorAsync; + connect(reply, &BluetoothDiscoveryReply::finished, info, [this, info, reply](){ + + if (reply->error() != BluetoothDiscoveryReply::BluetoothDiscoveryReplyErrorNoError) { + qCWarning(dcSenic()) << "Bluetooth discovery error:" << reply->error(); + info->finish(Device::DeviceErrorHardwareFailure, QT_TR_NOOP("An error happened during Bluetooth discovery.")); + return; + } + + foreach (const QBluetoothDeviceInfo &deviceInfo, reply->discoveredDevices()) { + if (deviceInfo.name().contains("Nuimo")) { + DeviceDescriptor descriptor(nuimoDeviceClassId, "Nuimo", deviceInfo.name() + " (" + deviceInfo.address().toString() + ")"); + ParamList params; + + foreach (Device *existingDevice, myDevices()) { + if (existingDevice->paramValue(nuimoDeviceMacParamTypeId).toString() == deviceInfo.address().toString()) { + descriptor.setDeviceId(existingDevice->id()); + break; + } + } + params.append(Param(nuimoDeviceMacParamTypeId, deviceInfo.address().toString())); + descriptor.setParams(params); + info->addDeviceDescriptor(descriptor); + } + } + info->finish(Device::DeviceErrorNoError); + }); } -Device::DeviceSetupStatus DevicePluginSenic::setupDevice(Device *device) +void DevicePluginSenic::setupDevice(DeviceSetupInfo *info) { + Device *device = info->device(); + qCDebug(dcSenic()) << "Setup device" << device->name() << device->params(); QBluetoothAddress address = QBluetoothAddress(device->paramValue(nuimoDeviceMacParamTypeId).toString()); @@ -69,7 +91,6 @@ Device::DeviceSetupStatus DevicePluginSenic::setupDevice(Device *device) Nuimo *nuimo = new Nuimo(bluetoothDevice, this); nuimo->setLongPressTime(configValue(senicPluginLongPressTimeParamTypeId).toInt()); - connect(nuimo, &Nuimo::deviceInitializationFinished, this, &DevicePluginSenic::onDeviceInitializationFinished); connect(nuimo, &Nuimo::buttonPressed, this, &DevicePluginSenic::onButtonPressed); connect(nuimo, &Nuimo::buttonLongPressed, this, &DevicePluginSenic::onButtonLongPressed); connect(nuimo, &Nuimo::swipeDetected, this, &DevicePluginSenic::onSwipeDetected); @@ -79,9 +100,27 @@ Device::DeviceSetupStatus DevicePluginSenic::setupDevice(Device *device) connect(nuimo, &Nuimo::batteryValueChanged, this, &DevicePluginSenic::onBatteryValueChanged); m_nuimos.insert(nuimo, device); - nuimo->bluetoothDevice()->connectDevice(); - return Device::DeviceSetupStatusAsync; + connect(nuimo, &Nuimo::deviceInitializationFinished, info, [this, info, nuimo](bool success){ + Device *device = info->device(); + + if (!device->setupComplete()) { + if (success) { + info->finish(Device::DeviceErrorNoError); + } else { + m_nuimos.take(nuimo); + + hardwareManager()->bluetoothLowEnergyManager()->unregisterDevice(nuimo->bluetoothDevice()); + nuimo->deleteLater(); + + info->finish(Device::DeviceErrorHardwareFailure, QT_TR_NOOP("Error connecting to nuimo.")); + } + } + + }); + + + nuimo->bluetoothDevice()->connectDevice(); } void DevicePluginSenic::postSetupDevice(Device *device) @@ -95,14 +134,17 @@ void DevicePluginSenic::postSetupDevice(Device *device) } -Device::DeviceError DevicePluginSenic::executeAction(Device *device, const Action &action) +void DevicePluginSenic::executeAction(DeviceActionInfo *info) { + Device *device = info->device(); + Action action = info->action(); + QPointer nuimo = m_nuimos.key(device); if (nuimo.isNull()) - return Device::DeviceErrorHardwareFailure; + return info->finish(Device::DeviceErrorHardwareFailure); if (!nuimo->bluetoothDevice()->connected()) { - return Device::DeviceErrorHardwareNotAvailable; + return info->finish(Device::DeviceErrorHardwareNotAvailable); } if (action.actionTypeId() == nuimoShowLogoActionTypeId) { @@ -134,10 +176,8 @@ Device::DeviceError DevicePluginSenic::executeAction(Device *device, const Actio if (action.param(nuimoShowLogoActionLogoParamTypeId).value().toString() == "Light") nuimo->showImage(Nuimo::MatrixTypeLight); - return Device::DeviceErrorNoError; + return info->finish(Device::DeviceErrorNoError); } - - return Device::DeviceErrorActionTypeNotFound; } @@ -168,57 +208,6 @@ 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(); - emit devicesDiscovered(nuimoDeviceClassId, QList()); - return; - } - - QList deviceDescriptors; - foreach (const QBluetoothDeviceInfo &deviceInfo, reply->discoveredDevices()) { - if (deviceInfo.name().contains("Nuimo")) { - DeviceDescriptor descriptor(nuimoDeviceClassId, "Nuimo", deviceInfo.name() + " (" + deviceInfo.address().toString() + ")"); - ParamList params; - - foreach (Device *existingDevice, myDevices()) { - if (existingDevice->paramValue(nuimoDeviceMacParamTypeId).toString() == deviceInfo.address().toString()) { - descriptor.setDeviceId(existingDevice->id()); - break; - } - } - params.append(Param(nuimoDeviceMacParamTypeId, deviceInfo.address().toString())); - descriptor.setParams(params); - deviceDescriptors.append(descriptor); - } - } - emit devicesDiscovered(nuimoDeviceClassId, deviceDescriptors); -} - -void DevicePluginSenic::onDeviceInitializationFinished(bool success) -{ - Nuimo *nuimo = static_cast(sender()); - Device *device = m_nuimos.value(nuimo); - if (!device->setupComplete()) { - if (success) { - emit deviceSetupFinished(device, Device::DeviceSetupStatusSuccess); - } else { - m_nuimos.take(nuimo); - - hardwareManager()->bluetoothLowEnergyManager()->unregisterDevice(nuimo->bluetoothDevice()); - nuimo->deleteLater(); - - emit deviceSetupFinished(device, Device::DeviceSetupStatusFailure); - } - } - -} - void DevicePluginSenic::onConnectedChanged(bool connected) { Nuimo *nuimo = static_cast(sender()); diff --git a/senic/devicepluginsenic.h b/senic/devicepluginsenic.h index e823e029..39a745f0 100644 --- a/senic/devicepluginsenic.h +++ b/senic/devicepluginsenic.h @@ -40,10 +40,10 @@ public: explicit DevicePluginSenic(); void init() override; - Device::DeviceError discoverDevices(const DeviceClassId &deviceClassId, const ParamList ¶ms) override; - Device::DeviceSetupStatus setupDevice(Device *device) override; + void discoverDevices(DeviceDiscoveryInfo *info) override; + void setupDevice(DeviceSetupInfo *info) override; void postSetupDevice(Device *device) override; - Device::DeviceError executeAction(Device *device, const Action &action) override; + void executeAction(DeviceActionInfo *info) override; void deviceRemoved(Device *device) override; @@ -55,9 +55,7 @@ private: private slots: void onPluginConfigurationChanged(const ParamTypeId ¶mTypeId, const QVariant &value); void onReconnectTimeout(); - void onBluetoothDiscoveryFinished(); - void onDeviceInitializationFinished(bool success); void onConnectedChanged(bool connected); void onBatteryValueChanged(const uint &percentage); void onButtonPressed();