diff --git a/libhive/action.cpp b/libhive/action.cpp new file mode 100644 index 00000000..838bb113 --- /dev/null +++ b/libhive/action.cpp @@ -0,0 +1,32 @@ +#include "action.h" + +Action::Action(const QUuid &id) : + m_id(id) +{ +} + +QUuid Action::id() const +{ + return m_id; +} + +QString Action::name() const +{ + return m_name; +} + +void Action::setName(const QString &name) +{ + m_name = name; +} + +QVariantList Action::params() const +{ + return m_params; +} + +void Action::setParams(const QVariantList ¶ms) +{ + m_params = params; +} + diff --git a/libhive/action.h b/libhive/action.h new file mode 100644 index 00000000..99dd34e0 --- /dev/null +++ b/libhive/action.h @@ -0,0 +1,26 @@ +#ifndef ACTION_H +#define ACTION_H + +#include +#include + +class Action +{ +public: + Action(const QUuid &id); + + QUuid id() const; + + QString name() const; + void setName(const QString &name); + + QVariantList params() const; + void setParams(const QVariantList ¶ms); + +private: + QUuid m_id; + QString m_name; + QVariantList m_params; +}; + +#endif // ACTION_H diff --git a/libhive/actiontype.cpp b/libhive/actiontype.cpp new file mode 100644 index 00000000..2a005ce7 --- /dev/null +++ b/libhive/actiontype.cpp @@ -0,0 +1,21 @@ +#include "actiontype.h" + +ActionType::ActionType(const QUuid &id): + m_id(id) +{ +} + +QUuid ActionType::id() const +{ + return m_id; +} + +QString ActionType::name() const +{ + return m_name; +} + +void ActionType::setName(const QString &name) +{ + m_name = name; +} diff --git a/libhive/actiontype.h b/libhive/actiontype.h new file mode 100644 index 00000000..d4ea9493 --- /dev/null +++ b/libhive/actiontype.h @@ -0,0 +1,27 @@ +#ifndef ACTIONTYPE_H +#define ACTIONTYPE_H + +#include +#include + +class ActionType +{ +public: + ActionType(const QUuid &id); + + QUuid id() const; + + QString name() const; + void setName(const QString &name); + + QVariantList parameters() const; + void setParameters(const QVariantList ¶meters); + +private: + QUuid m_id; + QString m_name; + + QVariantList m_parameters; +}; + +#endif // ACTIONTYPE_H diff --git a/libhive/device.cpp b/libhive/device.cpp index 4d2296e2..5c9d05bc 100644 --- a/libhive/device.cpp +++ b/libhive/device.cpp @@ -1,17 +1,19 @@ #include "device.h" -Device::Device(const QUuid &id, const QUuid &deviceClassId, QObject *parent): +Device::Device(const QUuid &pluginId, const QUuid &id, const QUuid &deviceClassId, QObject *parent): QObject(parent), m_id(id), - m_deviceClassId(deviceClassId) + m_deviceClassId(deviceClassId), + m_pluginId(pluginId) { } -Device::Device(const QUuid &deviceClassId, QObject *parent): +Device::Device(const QUuid &pluginId, const QUuid &deviceClassId, QObject *parent): QObject(parent), m_id(QUuid::createUuid()), - m_deviceClassId(deviceClassId) + m_deviceClassId(deviceClassId), + m_pluginId(pluginId) { } @@ -26,6 +28,11 @@ QUuid Device::deviceClassId() const return m_deviceClassId; } +QUuid Device::pluginId() const +{ + return m_pluginId; +} + QString Device::name() const { return m_name; @@ -46,6 +53,16 @@ void Device::setTriggers(const QList triggers) m_triggers = triggers; } +QList Device::actions() const +{ + return m_actions; +} + +void Device::setActions(const QList &actions) +{ + m_actions = actions; +} + QVariantMap Device::params() const { return m_params; diff --git a/libhive/device.h b/libhive/device.h index cc640a9a..621ac296 100644 --- a/libhive/device.h +++ b/libhive/device.h @@ -2,6 +2,7 @@ #define DEVICE_H #include "trigger.h" +#include "action.h" #include #include @@ -10,14 +11,13 @@ class Device: public QObject { Q_OBJECT - Q_PROPERTY(QUuid id READ id CONSTANT) + + friend class DeviceManager; public: - Device(const QUuid &id, const QUuid &deviceClassId, QObject *parent = 0); - Device(const QUuid &deviceClassId, QObject *parent = 0); - QUuid id() const; QUuid deviceClassId() const; + QUuid pluginId() const; QString name() const; void setName(const QString &name); @@ -25,14 +25,23 @@ public: QList triggers() const; void setTriggers(const QList triggers); + QList actions() const; + void setActions(const QList &actions); + QVariantMap params() const; void setParams(const QVariantMap ¶ms); +private: + Device(const QUuid &pluginId, const QUuid &id, const QUuid &deviceClassId, QObject *parent = 0); + Device(const QUuid &pluginId, const QUuid &deviceClassId, QObject *parent = 0); + private: QUuid m_id; QUuid m_deviceClassId; + QUuid m_pluginId; QString m_name; QList m_triggers; + QList m_actions; QVariantMap m_params; }; diff --git a/libhive/deviceclass.cpp b/libhive/deviceclass.cpp index 1bf6a424..8e49911f 100644 --- a/libhive/deviceclass.cpp +++ b/libhive/deviceclass.cpp @@ -1,7 +1,8 @@ #include "deviceclass.h" -DeviceClass::DeviceClass(const QUuid &id): - m_id(id) +DeviceClass::DeviceClass(const QUuid &pluginId, const QUuid &id): + m_id(id), + m_pluginId(pluginId) { } @@ -16,6 +17,11 @@ QUuid DeviceClass::id() const return m_id; } +QUuid DeviceClass::pluginId() const +{ + return m_pluginId; +} + QString DeviceClass::name() const { return m_name; @@ -45,3 +51,8 @@ void DeviceClass::setParams(const QVariantList ¶ms) { m_params = params; } + +bool DeviceClass::operator==(const DeviceClass &deviceClass) const +{ + return m_id == deviceClass.id(); +} diff --git a/libhive/deviceclass.h b/libhive/deviceclass.h index f728df5d..f5a9eda2 100644 --- a/libhive/deviceclass.h +++ b/libhive/deviceclass.h @@ -9,10 +9,11 @@ class DeviceClass { public: - DeviceClass(const QUuid &id); + DeviceClass(const QUuid &pluginId, const QUuid &id); virtual ~DeviceClass(); QUuid id() const; + QUuid pluginId() const; QString name() const; void setName(const QString &name); @@ -23,8 +24,11 @@ public: QVariantList params() const; void setParams(const QVariantList ¶ms); + bool operator==(const DeviceClass &device) const; + private: QUuid m_id; + QUuid m_pluginId; QString m_name; QList m_triggers; QVariantList m_params; diff --git a/libhive/devicemanager.cpp b/libhive/devicemanager.cpp index 73390810..c6570048 100644 --- a/libhive/devicemanager.cpp +++ b/libhive/devicemanager.cpp @@ -45,7 +45,13 @@ DeviceManager::DeviceError DeviceManager::addConfiguredDevice(const QUuid &devic // TODO: Check if parameter type matches } - Device *device = new Device(deviceClassId, this); + DevicePlugin *plugin = m_devicePlugins.value(deviceClass.pluginId()); + if (!plugin) { + qWarning() << "Cannot find a plugin for this device class!"; + return DeviceErrorPluginNotFound; + } + + Device *device = new Device(plugin->pluginId(), deviceClassId, this); device->setName(deviceClass.name()); device->setParams(params); QList triggers; @@ -86,7 +92,7 @@ DeviceClass DeviceManager::findDeviceClass(const QUuid &deviceClassId) return deviceClass; } } - return DeviceClass(QUuid()); + return DeviceClass(QUuid(), QUuid()); } Radio433 *DeviceManager::radio433() const @@ -94,6 +100,18 @@ Radio433 *DeviceManager::radio433() const return m_radio433; } +void DeviceManager::executeAction(const QUuid &actionId, const QVariantMap ¶ms) +{ + foreach (Device *device, m_configuredDevices) { + foreach (const Action &action, device->actions()) { + if (action.id() == actionId) { + m_devicePlugins.value(device->pluginId())->executeAction(device, action); + return; + } + } + } +} + void DeviceManager::loadPlugins() { foreach (QObject *pluginObject, QPluginLoader::staticInstances()) { @@ -101,8 +119,11 @@ void DeviceManager::loadPlugins() if (pluginIface) { qDebug() << "*** Loaded plugin" << pluginIface->pluginName(); pluginIface->initPlugin(this); - m_supportedDevices.append(pluginIface->supportedDevices()); - m_devicePlugins.append(pluginIface); + foreach (const DeviceClass &deviceClass, pluginIface->supportedDevices()) { + qDebug() << "* Loaded device class:" << deviceClass.name(); + m_supportedDevices.append(deviceClass); + } + m_devicePlugins.insert(pluginIface->pluginId(), pluginIface); connect(pluginIface,SIGNAL(emitTrigger(QUuid,QVariantMap)),this,SIGNAL(emitTrigger(QUuid,QVariantMap))); } @@ -152,4 +173,3 @@ void DeviceManager::storeConfiguredDevices() settings.endGroup(); } } - diff --git a/libhive/devicemanager.h b/libhive/devicemanager.h index dff42078..33661005 100644 --- a/libhive/devicemanager.h +++ b/libhive/devicemanager.h @@ -18,7 +18,8 @@ public: DeviceErrorNoError, DeviceErrorDeviceNotFound, DeviceErrorDeviceClassNotFound, - DeviceErrorMissingParameter + DeviceErrorMissingParameter, + DeviceErrorPluginNotFound }; explicit DeviceManager(QObject *parent = 0); @@ -36,6 +37,9 @@ public: signals: void emitTrigger(const QUuid &triggerId, const QVariantMap ¶ms); +public slots: + void executeAction(const QUuid &actionId, const QVariantMap ¶ms); + private slots: void loadPlugins(); void loadConfiguredDevices(); @@ -44,7 +48,8 @@ private slots: private: QList m_supportedDevices; QList m_configuredDevices; - QList m_devicePlugins; + + QHash m_devicePlugins; Radio433* m_radio433; }; diff --git a/libhive/deviceplugin.h b/libhive/deviceplugin.h index 3f5b00b6..73a47639 100644 --- a/libhive/deviceplugin.h +++ b/libhive/deviceplugin.h @@ -3,10 +3,12 @@ #include "deviceclass.h" #include "trigger.h" +#include "action.h" #include class DeviceManager; +class Device; class DevicePlugin: public QObject { @@ -20,9 +22,13 @@ public: virtual void init() {} virtual QString pluginName() const = 0; + virtual QUuid pluginId() const = 0; virtual QList supportedDevices() const = 0; +public slots: + virtual void executeAction(Device *device, const Action &action) = 0; + signals: void emitTrigger(const QUuid &triggerId, const QVariantMap ¶ms); diff --git a/libhive/libhive.pro b/libhive/libhive.pro index 0f89fbe6..61a3592a 100644 --- a/libhive/libhive.pro +++ b/libhive/libhive.pro @@ -11,7 +11,9 @@ SOURCES += device.cpp \ radio433.cpp \ gpio.cpp \ trigger.cpp \ - triggertype.cpp + triggertype.cpp \ + action.cpp \ + actiontype.cpp HEADERS += device.h \ deviceclass.h \ @@ -20,5 +22,7 @@ HEADERS += device.h \ radio433.h \ gpio.h \ trigger.h \ - triggertype.h + triggertype.h \ + action.h \ + actiontype.h diff --git a/plugins/deviceplugins/rfremoteintertechno/rfremoteintertechno.cpp b/plugins/deviceplugins/rfremoteintertechno/rfremoteintertechno.cpp index 4789cf84..2a36ead9 100644 --- a/plugins/deviceplugins/rfremoteintertechno/rfremoteintertechno.cpp +++ b/plugins/deviceplugins/rfremoteintertechno/rfremoteintertechno.cpp @@ -22,7 +22,7 @@ QList RfRemoteIntertechno::supportedDevices() const { QList ret; - DeviceClass deviceClassRfRemote(intertechnoRemote); + DeviceClass deviceClassRfRemote(pluginId(), intertechnoRemote); deviceClassRfRemote.setName("Intertechno Remote"); QVariantList deviceParams; @@ -81,6 +81,16 @@ QString RfRemoteIntertechno::pluginName() const return "RF Remote Intertechno"; } +QUuid RfRemoteIntertechno::pluginId() const +{ + return QUuid("e998d934-0397-42c1-ad63-9141bcac8563"); +} + +void RfRemoteIntertechno::executeAction(Device *device, const Action &action) +{ + +} + void RfRemoteIntertechno::dataReceived(QList rawData) { // filter right here a wrong signal length diff --git a/plugins/deviceplugins/rfremoteintertechno/rfremoteintertechno.h b/plugins/deviceplugins/rfremoteintertechno/rfremoteintertechno.h index a8e034a0..980db66c 100644 --- a/plugins/deviceplugins/rfremoteintertechno/rfremoteintertechno.h +++ b/plugins/deviceplugins/rfremoteintertechno/rfremoteintertechno.h @@ -17,6 +17,10 @@ public: QList supportedDevices() const override; QString pluginName() const; + QUuid pluginId() const; + +public slots: + void executeAction(Device *device, const Action &action) override; private slots: void dataReceived(QList rawData); diff --git a/plugins/deviceplugins/rfremotemumbi/rfremotemumbi.cpp b/plugins/deviceplugins/rfremotemumbi/rfremotemumbi.cpp index 58b25cc3..0db7dcdf 100644 --- a/plugins/deviceplugins/rfremotemumbi/rfremotemumbi.cpp +++ b/plugins/deviceplugins/rfremotemumbi/rfremotemumbi.cpp @@ -24,7 +24,7 @@ QList RfRemoteMumbi::supportedDevices() const // TODO: load list from config with static uuid QList ret; - DeviceClass deviceClassRfRemote(mumbiRemote); + DeviceClass deviceClassRfRemote(pluginId(), mumbiRemote); deviceClassRfRemote.setName("Mumbi Remote"); QVariantList deviceParams; @@ -84,7 +84,7 @@ QList RfRemoteMumbi::supportedDevices() const ret.append(deviceClassRfRemote); - DeviceClass deviceClassRfRemoteMumbi(mumbiRfRemoteMumbi); + DeviceClass deviceClassRfRemoteMumbi(pluginId(), mumbiRfRemoteMumbi); deviceClassRfRemoteMumbi.setName("Mumbi Power Switch"); ret.append(deviceClassRfRemoteMumbi); @@ -93,7 +93,17 @@ QList RfRemoteMumbi::supportedDevices() const QString RfRemoteMumbi::pluginName() const { - return "RF Remote Mumbi"; + return QStringLiteral("RF Remote Mumbi"); +} + +QUuid RfRemoteMumbi::pluginId() const +{ + return QUuid("2b267f81-d9ae-4f4f-89a0-7386b547cfd3"); +} + +void RfRemoteMumbi::executeAction(Device *device, const Action &action) +{ + } void RfRemoteMumbi::dataReceived(QList rawData) diff --git a/plugins/deviceplugins/rfremotemumbi/rfremotemumbi.h b/plugins/deviceplugins/rfremotemumbi/rfremotemumbi.h index 02a716c6..a2aac0bd 100644 --- a/plugins/deviceplugins/rfremotemumbi/rfremotemumbi.h +++ b/plugins/deviceplugins/rfremotemumbi/rfremotemumbi.h @@ -17,6 +17,10 @@ public: QList supportedDevices() const override; QString pluginName() const; + QUuid pluginId() const; + +public slots: + void executeAction(Device *device, const Action &action) override; private slots: void dataReceived(QList rawData);