From 7e152b7a09673ba8d084d17824aa9d51b2786e9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Mon, 18 Jul 2016 10:24:24 +0200 Subject: [PATCH] add plugin files --- .../deviceplugins/senic/devicepluginsenic.cpp | 182 ++++++++++++++++++ .../deviceplugins/senic/devicepluginsenic.h | 63 ++++++ .../senic/devicepluginsenic.json | 99 ++++++++++ plugins/deviceplugins/senic/senic.pro | 13 ++ 4 files changed, 357 insertions(+) create mode 100644 plugins/deviceplugins/senic/devicepluginsenic.cpp create mode 100644 plugins/deviceplugins/senic/devicepluginsenic.h create mode 100644 plugins/deviceplugins/senic/devicepluginsenic.json create mode 100644 plugins/deviceplugins/senic/senic.pro diff --git a/plugins/deviceplugins/senic/devicepluginsenic.cpp b/plugins/deviceplugins/senic/devicepluginsenic.cpp new file mode 100644 index 00000000..7b008460 --- /dev/null +++ b/plugins/deviceplugins/senic/devicepluginsenic.cpp @@ -0,0 +1,182 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * * + * Copyright (C) 2016 Simon Stürz * + * * + * This file is part of guh. * + * * + * Guh is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, version 2 of the License. * + * * + * Guh is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with guh. If not, see . * + * * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*! + \page senic.html + \title Senic - Nuimo + \brief Plugin for Senic Nuimo. + + \ingroup plugins + \ingroup guh-plugins + + + \chapter Plugin properties + Following JSON file contains the definition and the description of all available \l{DeviceClass}{DeviceClasses} + and \l{Vendor}{Vendors} of this \l{DevicePlugin}. + + For more details how to read this JSON file please check out the documentation for \l{The plugin JSON File}. + + \quotefile plugins/deviceplugins/senic/devicepluginsenic.json +*/ + +#ifdef BLUETOOTH_LE + +#include "devicepluginsenic.h" +#include "plugin/device.h" +#include "devicemanager.h" +#include "plugininfo.h" + +DevicePluginSenic::DevicePluginSenic() +{ + +} + +DeviceManager::DeviceError DevicePluginSenic::discoverDevices(const DeviceClassId &deviceClassId, const ParamList ¶ms) +{ + Q_UNUSED(params) + + if (deviceClassId != nuimoDeviceClassId) + return DeviceManager::DeviceErrorDeviceClassNotFound; + + if (!discoverBluetooth()) + return DeviceManager::DeviceErrorHardwareNotAvailable; + + return DeviceManager::DeviceErrorAsync; +} + +DeviceManager::DeviceSetupStatus DevicePluginSenic::setupDevice(Device *device) +{ + QString name = device->paramValue("name").toString(); + QBluetoothAddress address = QBluetoothAddress(device->paramValue("mac address").toString()); + QBluetoothDeviceInfo deviceInfo = QBluetoothDeviceInfo(address, name, 0); + + Nuimo *nuimo = new Nuimo(deviceInfo, QLowEnergyController::RandomAddress, this); + connect(nuimo, &Nuimo::availableChanged, this, &DevicePluginSenic::connectionAvailableChanged); + connect(nuimo, &Nuimo::batteryValueChaged, this, &DevicePluginSenic::onBatteryValueChanged); + connect(nuimo, &Nuimo::buttonPressed, this, &DevicePluginSenic::onButtonPressed); + connect(nuimo, &Nuimo::buttonReleased, this, &DevicePluginSenic::onButtonReleased); + + m_nuimos.insert(nuimo, device); + + nuimo->connectDevice(); + + return DeviceManager::DeviceSetupStatusSuccess; +} + +DeviceManager::HardwareResources DevicePluginSenic::requiredHardware() const +{ + return DeviceManager::HardwareResourceBluetoothLE; +} + +DeviceManager::DeviceError DevicePluginSenic::executeAction(Device *device, const Action &action) +{ + QPointer nuimo = m_nuimos.key(device); + if (nuimo.isNull()) + return DeviceManager::DeviceErrorHardwareFailure; + + // reconnect action does not need available true + if (action.actionTypeId() == connectActionTypeId) { + nuimo->reconnectDevice(); + return DeviceManager::DeviceErrorNoError; + } + + if (action.actionTypeId() == disconnectActionTypeId) { + nuimo->disconnectDevice(); + return DeviceManager::DeviceErrorNoError; + } + + if (action.actionTypeId() == showLogoActionTypeId) { + nuimo->showGuhLogo(); + return DeviceManager::DeviceErrorNoError; + } + + + return DeviceManager::DeviceErrorActionTypeNotFound; +} + +void DevicePluginSenic::bluetoothDiscoveryFinished(const QList &deviceInfos) +{ + QList deviceDescriptors; + foreach (QBluetoothDeviceInfo deviceInfo, deviceInfos) { + if (deviceInfo.name().contains("Nuimo")) { + if (!verifyExistingDevices(deviceInfo)) { + DeviceDescriptor descriptor(nuimoDeviceClassId, "Nuimo", deviceInfo.address().toString()); + ParamList params; + params.append(Param("name", deviceInfo.name())); + params.append(Param("mac address", deviceInfo.address().toString())); + descriptor.setParams(params); + deviceDescriptors.append(descriptor); + } + } + } + + emit devicesDiscovered(nuimoDeviceClassId, deviceDescriptors); +} + +void DevicePluginSenic::deviceRemoved(Device *device) +{ + if (!m_nuimos.values().contains(device)) + return; + + Nuimo *nuimo = m_nuimos.key(device); + m_nuimos.take(nuimo); + delete nuimo; +} + +bool DevicePluginSenic::verifyExistingDevices(const QBluetoothDeviceInfo &deviceInfo) +{ + foreach (Device *device, myDevices()) { + if (device->paramValue("mac address").toString() == deviceInfo.address().toString()) + return true; + } + + return false; +} + +void DevicePluginSenic::connectionAvailableChanged() +{ + Nuimo *nuimo = static_cast(sender()); + Device *device = m_nuimos.value(nuimo); + device->setStateValue(availableStateTypeId, nuimo->isAvailable()); +} + +void DevicePluginSenic::onBatteryValueChanged(const uint &percentage) +{ + Nuimo *nuimo = static_cast(sender()); + Device *device = m_nuimos.value(nuimo); + device->setStateValue(batteryStateTypeId, percentage); +} + +void DevicePluginSenic::onButtonPressed() +{ + Nuimo *nuimo = static_cast(sender()); + Device *device = m_nuimos.value(nuimo); + emitEvent(Event(clickedEventTypeId, device->id())); +} + +void DevicePluginSenic::onButtonReleased() +{ + // TODO: user timer for detekt long pressed (if needed) +} + + +#endif // BLUETOOTH_LE + + diff --git a/plugins/deviceplugins/senic/devicepluginsenic.h b/plugins/deviceplugins/senic/devicepluginsenic.h new file mode 100644 index 00000000..ff3a12a8 --- /dev/null +++ b/plugins/deviceplugins/senic/devicepluginsenic.h @@ -0,0 +1,63 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * * + * Copyright (C) 2016 Simon Stürz * + * * + * This file is part of guh. * + * * + * Guh is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, version 2 of the License. * + * * + * Guh is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with guh. If not, see . * + * * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef DEVICEPLUGINELGATO_H +#define DEVICEPLUGINELGATO_H + +#ifdef BLUETOOTH_LE + +#include "plugin/deviceplugin.h" +#include "bluetooth/bluetoothlowenergydevice.h" + +#include "nuimo.h" + +class DevicePluginSenic : public DevicePlugin +{ + Q_OBJECT + + Q_PLUGIN_METADATA(IID "guru.guh.DevicePlugin" FILE "devicepluginsenic.json") + Q_INTERFACES(DevicePlugin) + +public: + explicit DevicePluginSenic(); + + DeviceManager::DeviceError discoverDevices(const DeviceClassId &deviceClassId, const ParamList ¶ms) override; + DeviceManager::DeviceSetupStatus setupDevice(Device *device) override; + DeviceManager::HardwareResources requiredHardware() const override; + DeviceManager::DeviceError executeAction(Device *device, const Action &action) override; + + void bluetoothDiscoveryFinished(const QList &deviceInfos); + void deviceRemoved(Device *device) override; + +private: + QHash m_nuimos; + bool verifyExistingDevices(const QBluetoothDeviceInfo &deviceInfo); + +private slots: + void connectionAvailableChanged(); + void onBatteryValueChanged(const uint &percentage); + void onButtonPressed(); + void onButtonReleased(); + +}; + +#endif // BLUETOOTH_LE + +#endif // DEVICEPLUGINELGATO_H diff --git a/plugins/deviceplugins/senic/devicepluginsenic.json b/plugins/deviceplugins/senic/devicepluginsenic.json new file mode 100644 index 00000000..745ce161 --- /dev/null +++ b/plugins/deviceplugins/senic/devicepluginsenic.json @@ -0,0 +1,99 @@ +{ + "name": "Senic", + "id": "413e9d77-335f-4ecf-abbc-8f2a8a399c39", + "idName": "Senic", + "vendors": [ + { + "name": "Senic", + "id": "8e6cae9c-706b-49e5-ae86-da52a20dd336", + "deviceClasses": [ + { + "deviceClassId": "315ece51-053e-49f9-831f-b09f9f27fb9f", + "idName": "nuimo", + "name": "Nuimo", + "deviceIcon": "Switch", + "basicTags": [ + "Device", + "Sensor" + ], + "createMethods": ["discovery"], + "paramTypes": [ + { + "name": "name", + "type": "QString", + "index": 0, + "inputType": "TextLine" + }, + { + "name": "mac address", + "type": "QString", + "index": 1, + "inputType": "MacAddress" + } + ], + "stateTypes": [ + { + "id": "5286976a-f5dc-4662-872a-438ac5d491cb", + "idName": "available", + "name": "available", + "index": 0, + "type": "bool", + "defaultValue": false + }, + { + "id": "b5ee2465-7fa1-450b-8073-f115537d3409", + "idName": "battery", + "name": "battery", + "index": 1, + "type": "int", + "minValue": 0, + "maxValue": 100, + "unit": "Percentage", + "defaultValue": 0 + } + ], + "actionTypes": [ + { + "id": "bb1c46fe-5dfb-4fa3-ad89-0ba576ac780e", + "idName": "connect", + "index": 0, + "name": "connect" + }, + { + "id": "11bf3143-34f8-42ab-9750-073040c1a7fc", + "idName": "disconnect", + "index": 1, + "name": "disconnect" + }, + { + "id": "d44ca5b7-f8d6-4413-9d2e-cef89282c039", + "idName": "showLogo", + "index": 2, + "name": "show logo" + } + ], + "eventTypes": [ + { + "id": "5b9e08e8-7a6c-4311-9db6-82547847708c", + "idName": "clicked", + "name": "clicked", + "index": "0" + }, + { + "id": "2be36aa0-e2fe-4192-81c5-cf0bb7f08dd4", + "idName": "swipeLeft", + "name": "Swipe left", + "index": "1" + }, + { + "id": "81fb61ab-6d3d-4c1b-85fe-3dbd5c8dead7", + "idName": "swipeRight", + "name": "Swipe right", + "index": "2" + } + ] + } + ] + } + ] +} diff --git a/plugins/deviceplugins/senic/senic.pro b/plugins/deviceplugins/senic/senic.pro new file mode 100644 index 00000000..61dcbb9e --- /dev/null +++ b/plugins/deviceplugins/senic/senic.pro @@ -0,0 +1,13 @@ +include(../../plugins.pri) + +TARGET = $$qtLibraryTarget(guh_devicepluginsenic) + +SOURCES += \ + devicepluginsenic.cpp \ + nuimo.cpp + +HEADERS += \ + devicepluginsenic.h \ + nuimo.h + +