mirror of https://github.com/nymea/nymea.git
184 lines
7.9 KiB
C++
184 lines
7.9 KiB
C++
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
* *
|
|
* Copyright (C) 2019 Michael Zanetti <michael.zanetti@nymea.io> *
|
|
* *
|
|
* This file is part of nymea. *
|
|
* *
|
|
* nymea 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. *
|
|
* *
|
|
* nymea 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 nymea. If not, see <http://www.gnu.org/licenses/>. *
|
|
* *
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
|
|
#ifndef SCRIPTDEVICEPLUGIN_H
|
|
#define SCRIPTDEVICEPLUGIN_H
|
|
|
|
#include "devices/deviceplugin.h"
|
|
|
|
#include <QQmlEngine>
|
|
#include <QJsonObject>
|
|
|
|
class ScriptDeviceDiscoveryInfo: public QObject
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
ScriptDeviceDiscoveryInfo(DeviceDiscoveryInfo *info): QObject(info), m_info(info) {
|
|
connect(info, &DeviceDiscoveryInfo::aborted, this, &ScriptDeviceDiscoveryInfo::aborted);
|
|
connect(info, &DeviceDiscoveryInfo::finished, this, &ScriptDeviceDiscoveryInfo::finished);
|
|
}
|
|
Q_INVOKABLE void addDeviceDescriptor(const QUuid &deviceClassId, const QString &title, const QString &description = QString(), const QVariantList ¶ms = QVariantList(), const QUuid &parentDeviceId = QUuid()) {
|
|
ParamList paramList;
|
|
for (int i = 0; i < params.count(); i++) {
|
|
paramList << Param(params.at(i).toMap().value("paramTypeId").toUuid(), params.at(i).toMap().value("value"));
|
|
}
|
|
DeviceDescriptor d(deviceClassId, title, description, parentDeviceId);
|
|
d.setParams(paramList);
|
|
m_info->addDeviceDescriptor(d);
|
|
}
|
|
Q_INVOKABLE void finish(Device::DeviceError status = Device::DeviceErrorNoError, const QString &displayMessage = QString()) {
|
|
m_info->finish(status, displayMessage);
|
|
}
|
|
signals:
|
|
void aborted();
|
|
void finished();
|
|
private:
|
|
DeviceDiscoveryInfo *m_info = nullptr;
|
|
};
|
|
|
|
class ScriptDevice: public QObject
|
|
{
|
|
Q_OBJECT
|
|
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
|
|
public:
|
|
ScriptDevice(Device *device): QObject(device), m_device(device) {
|
|
connect(device, &Device::nameChanged, this, &ScriptDevice::nameChanged);
|
|
}
|
|
|
|
QString name() const { return m_device->name(); }
|
|
void setName(const QString &name) { m_device->setName(name); }
|
|
|
|
Q_INVOKABLE QVariant paramValue(const QUuid ¶mTypeId) { return m_device->paramValue(paramTypeId); }
|
|
Q_INVOKABLE void setParamValue(const QUuid ¶mTypeId, const QVariant &value) { m_device->setParamValue(paramTypeId, value); }
|
|
|
|
Q_INVOKABLE QVariant stateValue(const QUuid &stateTypeId) { return m_device->stateValue(stateTypeId); }
|
|
Q_INVOKABLE void setStateValue(const QUuid &stateTypeId, const QVariant &value) { m_device->setStateValue(stateTypeId, value); }
|
|
|
|
signals:
|
|
void nameChanged();
|
|
|
|
private:
|
|
Device *m_device = nullptr;
|
|
};
|
|
|
|
class ScriptDeviceSetupInfo: public QObject
|
|
{
|
|
Q_OBJECT
|
|
Q_PROPERTY(ScriptDevice* device READ device CONSTANT)
|
|
public:
|
|
ScriptDeviceSetupInfo(DeviceSetupInfo *info, ScriptDevice *scriptDevice): QObject(info), m_info(info), m_device(scriptDevice) {
|
|
connect(info, &DeviceSetupInfo::aborted, this, &ScriptDeviceSetupInfo::aborted);
|
|
connect(info, &DeviceSetupInfo::finished, this, &ScriptDeviceSetupInfo::finished);
|
|
}
|
|
Q_INVOKABLE void finish(Device::DeviceError status = Device::DeviceErrorNoError, const QString &displayMessage = QString()) {
|
|
m_info->finish(status, displayMessage);
|
|
}
|
|
ScriptDevice* device() const { return m_device; }
|
|
signals:
|
|
void aborted();
|
|
void finished();
|
|
private:
|
|
DeviceSetupInfo *m_info = nullptr;
|
|
ScriptDevice* m_device = nullptr;
|
|
};
|
|
|
|
class ScriptDevicePairingInfo: public QObject
|
|
{
|
|
Q_OBJECT
|
|
Q_PROPERTY(QUuid deviceClassId READ deviceClassId CONSTANT)
|
|
Q_PROPERTY(QUuid deviceId READ deviceId CONSTANT)
|
|
Q_PROPERTY(QString deviceName READ deviceName CONSTANT)
|
|
Q_PROPERTY(QUuid parentDeviceId READ parentDeviceId CONSTANT)
|
|
Q_PROPERTY(QUrl oAuthUrl READ oAuthUrl WRITE setOAuthUrl)
|
|
public:
|
|
ScriptDevicePairingInfo(DevicePairingInfo* info): QObject(info), m_info(info) {
|
|
connect(info, &DevicePairingInfo::aborted, this, &ScriptDevicePairingInfo::aborted);
|
|
connect(info, &DevicePairingInfo::finished, this, &ScriptDevicePairingInfo::finished);
|
|
}
|
|
Q_INVOKABLE QVariant paramValue(const QUuid ¶mTypeId) { return m_info->params().paramValue(paramTypeId); }
|
|
Q_INVOKABLE void finish(Device::DeviceError status = Device::DeviceErrorNoError, const QString &displayMessage = QString()) {
|
|
m_info->finish(status, displayMessage);
|
|
}
|
|
QUuid deviceClassId() const { return m_info->deviceClassId(); }
|
|
QUuid deviceId() const { return m_info->deviceId(); }
|
|
QString deviceName() const { return m_info->deviceName(); }
|
|
QUuid parentDeviceId() const { return m_info->parentDeviceId(); }
|
|
QUrl oAuthUrl() const { return m_info->oAuthUrl(); }
|
|
void setOAuthUrl(const QUrl &oAuthUrl) { m_info->setOAuthUrl(oAuthUrl); }
|
|
signals:
|
|
void aborted();
|
|
void finished();
|
|
private:
|
|
DevicePairingInfo *m_info = nullptr;
|
|
};
|
|
|
|
class ScriptDeviceActionInfo: public QObject
|
|
{
|
|
Q_OBJECT
|
|
Q_PROPERTY(ScriptDevice* device READ device CONSTANT)
|
|
Q_PROPERTY(QUuid actionTypeId READ actionTypeId CONSTANT)
|
|
public:
|
|
ScriptDeviceActionInfo(DeviceActionInfo* info, ScriptDevice* scriptDevice): QObject(info), m_info(info), m_device(scriptDevice) {
|
|
connect(info, &DeviceActionInfo::finished, this, &ScriptDeviceActionInfo::finished);
|
|
connect(info, &DeviceActionInfo::aborted, this, &ScriptDeviceActionInfo::aborted);
|
|
}
|
|
ScriptDevice* device() const { return m_device; }
|
|
QUuid actionTypeId() const { return m_info->action().actionTypeId(); }
|
|
Q_INVOKABLE QVariant paramValue(const QUuid ¶mTypeId) { return m_info->action().params().paramValue(paramTypeId); }
|
|
Q_INVOKABLE void finish(Device::DeviceError status = Device::DeviceErrorNoError, const QString &displayMessage = QString()) {
|
|
m_info->finish(status, displayMessage);
|
|
}
|
|
|
|
signals:
|
|
void aborted();
|
|
void finished();
|
|
private:
|
|
DeviceActionInfo* m_info = nullptr;
|
|
ScriptDevice* m_device = nullptr;
|
|
};
|
|
|
|
class ScriptDevicePlugin : public DevicePlugin
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
explicit ScriptDevicePlugin(QObject *parent = nullptr);
|
|
|
|
bool loadScript(const QString &fileName);
|
|
QJsonObject metaData() const;
|
|
|
|
void init() override;
|
|
void startMonitoringAutoDevices() override;
|
|
void discoverDevices(DeviceDiscoveryInfo *info) override;
|
|
void startPairing(DevicePairingInfo *info) override;
|
|
void confirmPairing(DevicePairingInfo *info, const QString &username, const QString &secret) override;
|
|
void setupDevice(DeviceSetupInfo *info) override;
|
|
void postSetupDevice(Device *device) override;
|
|
void deviceRemoved(Device *device) override;
|
|
void executeAction(DeviceActionInfo *info) override;
|
|
|
|
private:
|
|
QQmlEngine *m_engine = nullptr;
|
|
QJsonObject m_metaData;
|
|
QJSValue m_pluginImport;
|
|
QHash<Device*, ScriptDevice*> m_devices;
|
|
};
|
|
|
|
#endif // SCRIPTDEVICEPLUGIN_H
|