added actions

This commit is contained in:
Michael Zanetti 2014-01-01 22:59:32 +01:00
parent 39c9abc809
commit adb1c1ca64
16 changed files with 234 additions and 24 deletions

32
libhive/action.cpp Normal file
View File

@ -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 &params)
{
m_params = params;
}

26
libhive/action.h Normal file
View File

@ -0,0 +1,26 @@
#ifndef ACTION_H
#define ACTION_H
#include <QUuid>
#include <QVariantList>
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 &params);
private:
QUuid m_id;
QString m_name;
QVariantList m_params;
};
#endif // ACTION_H

21
libhive/actiontype.cpp Normal file
View File

@ -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;
}

27
libhive/actiontype.h Normal file
View File

@ -0,0 +1,27 @@
#ifndef ACTIONTYPE_H
#define ACTIONTYPE_H
#include <QUuid>
#include <QVariantList>
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 &parameters);
private:
QUuid m_id;
QString m_name;
QVariantList m_parameters;
};
#endif // ACTIONTYPE_H

View File

@ -1,17 +1,19 @@
#include "device.h" #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), QObject(parent),
m_id(id), 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), QObject(parent),
m_id(QUuid::createUuid()), m_id(QUuid::createUuid()),
m_deviceClassId(deviceClassId) m_deviceClassId(deviceClassId),
m_pluginId(pluginId)
{ {
} }
@ -26,6 +28,11 @@ QUuid Device::deviceClassId() const
return m_deviceClassId; return m_deviceClassId;
} }
QUuid Device::pluginId() const
{
return m_pluginId;
}
QString Device::name() const QString Device::name() const
{ {
return m_name; return m_name;
@ -46,6 +53,16 @@ void Device::setTriggers(const QList<Trigger> triggers)
m_triggers = triggers; m_triggers = triggers;
} }
QList<Action> Device::actions() const
{
return m_actions;
}
void Device::setActions(const QList<Action> &actions)
{
m_actions = actions;
}
QVariantMap Device::params() const QVariantMap Device::params() const
{ {
return m_params; return m_params;

View File

@ -2,6 +2,7 @@
#define DEVICE_H #define DEVICE_H
#include "trigger.h" #include "trigger.h"
#include "action.h"
#include <QObject> #include <QObject>
#include <QUuid> #include <QUuid>
@ -10,14 +11,13 @@
class Device: public QObject class Device: public QObject
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QUuid id READ id CONSTANT)
friend class DeviceManager;
public: public:
Device(const QUuid &id, const QUuid &deviceClassId, QObject *parent = 0);
Device(const QUuid &deviceClassId, QObject *parent = 0);
QUuid id() const; QUuid id() const;
QUuid deviceClassId() const; QUuid deviceClassId() const;
QUuid pluginId() const;
QString name() const; QString name() const;
void setName(const QString &name); void setName(const QString &name);
@ -25,14 +25,23 @@ public:
QList<Trigger> triggers() const; QList<Trigger> triggers() const;
void setTriggers(const QList<Trigger> triggers); void setTriggers(const QList<Trigger> triggers);
QList<Action> actions() const;
void setActions(const QList<Action> &actions);
QVariantMap params() const; QVariantMap params() const;
void setParams(const QVariantMap &params); void setParams(const QVariantMap &params);
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: private:
QUuid m_id; QUuid m_id;
QUuid m_deviceClassId; QUuid m_deviceClassId;
QUuid m_pluginId;
QString m_name; QString m_name;
QList<Trigger> m_triggers; QList<Trigger> m_triggers;
QList<Action> m_actions;
QVariantMap m_params; QVariantMap m_params;
}; };

View File

@ -1,7 +1,8 @@
#include "deviceclass.h" #include "deviceclass.h"
DeviceClass::DeviceClass(const QUuid &id): DeviceClass::DeviceClass(const QUuid &pluginId, const QUuid &id):
m_id(id) m_id(id),
m_pluginId(pluginId)
{ {
} }
@ -16,6 +17,11 @@ QUuid DeviceClass::id() const
return m_id; return m_id;
} }
QUuid DeviceClass::pluginId() const
{
return m_pluginId;
}
QString DeviceClass::name() const QString DeviceClass::name() const
{ {
return m_name; return m_name;
@ -45,3 +51,8 @@ void DeviceClass::setParams(const QVariantList &params)
{ {
m_params = params; m_params = params;
} }
bool DeviceClass::operator==(const DeviceClass &deviceClass) const
{
return m_id == deviceClass.id();
}

View File

@ -9,10 +9,11 @@
class DeviceClass class DeviceClass
{ {
public: public:
DeviceClass(const QUuid &id); DeviceClass(const QUuid &pluginId, const QUuid &id);
virtual ~DeviceClass(); virtual ~DeviceClass();
QUuid id() const; QUuid id() const;
QUuid pluginId() const;
QString name() const; QString name() const;
void setName(const QString &name); void setName(const QString &name);
@ -23,8 +24,11 @@ public:
QVariantList params() const; QVariantList params() const;
void setParams(const QVariantList &params); void setParams(const QVariantList &params);
bool operator==(const DeviceClass &device) const;
private: private:
QUuid m_id; QUuid m_id;
QUuid m_pluginId;
QString m_name; QString m_name;
QList<TriggerType> m_triggers; QList<TriggerType> m_triggers;
QVariantList m_params; QVariantList m_params;

View File

@ -45,7 +45,13 @@ DeviceManager::DeviceError DeviceManager::addConfiguredDevice(const QUuid &devic
// TODO: Check if parameter type matches // 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->setName(deviceClass.name());
device->setParams(params); device->setParams(params);
QList<Trigger> triggers; QList<Trigger> triggers;
@ -86,7 +92,7 @@ DeviceClass DeviceManager::findDeviceClass(const QUuid &deviceClassId)
return deviceClass; return deviceClass;
} }
} }
return DeviceClass(QUuid()); return DeviceClass(QUuid(), QUuid());
} }
Radio433 *DeviceManager::radio433() const Radio433 *DeviceManager::radio433() const
@ -94,6 +100,18 @@ Radio433 *DeviceManager::radio433() const
return m_radio433; return m_radio433;
} }
void DeviceManager::executeAction(const QUuid &actionId, const QVariantMap &params)
{
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() void DeviceManager::loadPlugins()
{ {
foreach (QObject *pluginObject, QPluginLoader::staticInstances()) { foreach (QObject *pluginObject, QPluginLoader::staticInstances()) {
@ -101,8 +119,11 @@ void DeviceManager::loadPlugins()
if (pluginIface) { if (pluginIface) {
qDebug() << "*** Loaded plugin" << pluginIface->pluginName(); qDebug() << "*** Loaded plugin" << pluginIface->pluginName();
pluginIface->initPlugin(this); pluginIface->initPlugin(this);
m_supportedDevices.append(pluginIface->supportedDevices()); foreach (const DeviceClass &deviceClass, pluginIface->supportedDevices()) {
m_devicePlugins.append(pluginIface); 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))); connect(pluginIface,SIGNAL(emitTrigger(QUuid,QVariantMap)),this,SIGNAL(emitTrigger(QUuid,QVariantMap)));
} }
@ -152,4 +173,3 @@ void DeviceManager::storeConfiguredDevices()
settings.endGroup(); settings.endGroup();
} }
} }

View File

@ -18,7 +18,8 @@ public:
DeviceErrorNoError, DeviceErrorNoError,
DeviceErrorDeviceNotFound, DeviceErrorDeviceNotFound,
DeviceErrorDeviceClassNotFound, DeviceErrorDeviceClassNotFound,
DeviceErrorMissingParameter DeviceErrorMissingParameter,
DeviceErrorPluginNotFound
}; };
explicit DeviceManager(QObject *parent = 0); explicit DeviceManager(QObject *parent = 0);
@ -36,6 +37,9 @@ public:
signals: signals:
void emitTrigger(const QUuid &triggerId, const QVariantMap &params); void emitTrigger(const QUuid &triggerId, const QVariantMap &params);
public slots:
void executeAction(const QUuid &actionId, const QVariantMap &params);
private slots: private slots:
void loadPlugins(); void loadPlugins();
void loadConfiguredDevices(); void loadConfiguredDevices();
@ -44,7 +48,8 @@ private slots:
private: private:
QList<DeviceClass> m_supportedDevices; QList<DeviceClass> m_supportedDevices;
QList<Device*> m_configuredDevices; QList<Device*> m_configuredDevices;
QList<DevicePlugin*> m_devicePlugins;
QHash<QUuid, DevicePlugin*> m_devicePlugins;
Radio433* m_radio433; Radio433* m_radio433;
}; };

View File

@ -3,10 +3,12 @@
#include "deviceclass.h" #include "deviceclass.h"
#include "trigger.h" #include "trigger.h"
#include "action.h"
#include <QObject> #include <QObject>
class DeviceManager; class DeviceManager;
class Device;
class DevicePlugin: public QObject class DevicePlugin: public QObject
{ {
@ -20,9 +22,13 @@ public:
virtual void init() {} virtual void init() {}
virtual QString pluginName() const = 0; virtual QString pluginName() const = 0;
virtual QUuid pluginId() const = 0;
virtual QList<DeviceClass> supportedDevices() const = 0; virtual QList<DeviceClass> supportedDevices() const = 0;
public slots:
virtual void executeAction(Device *device, const Action &action) = 0;
signals: signals:
void emitTrigger(const QUuid &triggerId, const QVariantMap &params); void emitTrigger(const QUuid &triggerId, const QVariantMap &params);

View File

@ -11,7 +11,9 @@ SOURCES += device.cpp \
radio433.cpp \ radio433.cpp \
gpio.cpp \ gpio.cpp \
trigger.cpp \ trigger.cpp \
triggertype.cpp triggertype.cpp \
action.cpp \
actiontype.cpp
HEADERS += device.h \ HEADERS += device.h \
deviceclass.h \ deviceclass.h \
@ -20,5 +22,7 @@ HEADERS += device.h \
radio433.h \ radio433.h \
gpio.h \ gpio.h \
trigger.h \ trigger.h \
triggertype.h triggertype.h \
action.h \
actiontype.h

View File

@ -22,7 +22,7 @@ QList<DeviceClass> RfRemoteIntertechno::supportedDevices() const
{ {
QList<DeviceClass> ret; QList<DeviceClass> ret;
DeviceClass deviceClassRfRemote(intertechnoRemote); DeviceClass deviceClassRfRemote(pluginId(), intertechnoRemote);
deviceClassRfRemote.setName("Intertechno Remote"); deviceClassRfRemote.setName("Intertechno Remote");
QVariantList deviceParams; QVariantList deviceParams;
@ -81,6 +81,16 @@ QString RfRemoteIntertechno::pluginName() const
return "RF Remote Intertechno"; 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<int> rawData) void RfRemoteIntertechno::dataReceived(QList<int> rawData)
{ {
// filter right here a wrong signal length // filter right here a wrong signal length

View File

@ -17,6 +17,10 @@ public:
QList<DeviceClass> supportedDevices() const override; QList<DeviceClass> supportedDevices() const override;
QString pluginName() const; QString pluginName() const;
QUuid pluginId() const;
public slots:
void executeAction(Device *device, const Action &action) override;
private slots: private slots:
void dataReceived(QList<int> rawData); void dataReceived(QList<int> rawData);

View File

@ -24,7 +24,7 @@ QList<DeviceClass> RfRemoteMumbi::supportedDevices() const
// TODO: load list from config with static uuid // TODO: load list from config with static uuid
QList<DeviceClass> ret; QList<DeviceClass> ret;
DeviceClass deviceClassRfRemote(mumbiRemote); DeviceClass deviceClassRfRemote(pluginId(), mumbiRemote);
deviceClassRfRemote.setName("Mumbi Remote"); deviceClassRfRemote.setName("Mumbi Remote");
QVariantList deviceParams; QVariantList deviceParams;
@ -84,7 +84,7 @@ QList<DeviceClass> RfRemoteMumbi::supportedDevices() const
ret.append(deviceClassRfRemote); ret.append(deviceClassRfRemote);
DeviceClass deviceClassRfRemoteMumbi(mumbiRfRemoteMumbi); DeviceClass deviceClassRfRemoteMumbi(pluginId(), mumbiRfRemoteMumbi);
deviceClassRfRemoteMumbi.setName("Mumbi Power Switch"); deviceClassRfRemoteMumbi.setName("Mumbi Power Switch");
ret.append(deviceClassRfRemoteMumbi); ret.append(deviceClassRfRemoteMumbi);
@ -93,7 +93,17 @@ QList<DeviceClass> RfRemoteMumbi::supportedDevices() const
QString RfRemoteMumbi::pluginName() 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<int> rawData) void RfRemoteMumbi::dataReceived(QList<int> rawData)

View File

@ -17,6 +17,10 @@ public:
QList<DeviceClass> supportedDevices() const override; QList<DeviceClass> supportedDevices() const override;
QString pluginName() const; QString pluginName() const;
QUuid pluginId() const;
public slots:
void executeAction(Device *device, const Action &action) override;
private slots: private slots:
void dataReceived(QList<int> rawData); void dataReceived(QList<int> rawData);