/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2015 Simon Stuerz * * Copyright (C) 2014 Michael Zanetti * * * * 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 DEVICEMANAGER_H #define DEVICEMANAGER_H #include "plugin/deviceclass.h" #include "plugin/device.h" #include "plugin/devicedescriptor.h" #include "types/event.h" #include "types/action.h" #include "types/vendor.h" #include "network/networkmanager.h" #include #include class Device; class DevicePlugin; class Radio433; class UpnpDiscovery; class DeviceManager : public QObject { Q_OBJECT Q_ENUMS(DeviceError) public: enum HardwareResource { HardwareResourceNone = 0x00, HardwareResourceRadio433 = 0x01, HardwareResourceRadio868 = 0x02, HardwareResourceTimer = 0x04, HardwareResourceNetworkManager = 0x08 }; Q_DECLARE_FLAGS(HardwareResources, HardwareResource) enum DeviceError { DeviceErrorNoError, DeviceErrorPluginNotFound, DeviceErrorDeviceNotFound, DeviceErrorDeviceClassNotFound, DeviceErrorActionTypeNotFound, DeviceErrorStateTypeNotFound, DeviceErrorEventTypeNotFound, DeviceErrorDeviceDescriptorNotFound, DeviceErrorMissingParameter, DeviceErrorInvalidParameter, DeviceErrorSetupFailed, DeviceErrorDuplicateUuid, DeviceErrorCreationMethodNotSupported, DeviceErrorSetupMethodNotSupported, DeviceErrorHardwareNotAvailable, DeviceErrorHardwareFailure, DeviceErrorAuthentificationFailure, DeviceErrorAsync, DeviceErrorDeviceInUse, DeviceErrorPairingTransactionIdNotFound, DeviceErrorParameterNotWritable }; enum DeviceSetupStatus { DeviceSetupStatusSuccess, DeviceSetupStatusFailure, DeviceSetupStatusAsync }; explicit DeviceManager(QObject *parent = 0); ~DeviceManager(); QList plugins() const; DevicePlugin* plugin(const PluginId &id) const; DeviceError setPluginConfig(const PluginId &pluginId, const ParamList &pluginConfig); QList supportedVendors() const; QList supportedDevices(const VendorId &vendorId = VendorId()) const; DeviceError discoverDevices(const DeviceClassId &deviceClassId, const ParamList ¶ms); QList configuredDevices() const; DeviceError addConfiguredDevice(const DeviceClassId &deviceClassId, const ParamList ¶ms, const DeviceId id = DeviceId::createDeviceId()); DeviceError addConfiguredDevice(const DeviceClassId &deviceClassId, const DeviceDescriptorId &deviceDescriptorId, const DeviceId &id = DeviceId::createDeviceId()); DeviceError editDevice(const DeviceId &deviceId, const ParamList ¶ms, bool fromDiscovery = false); DeviceError editDevice(const DeviceId &deviceId, const DeviceDescriptorId &deviceDescriptorId); DeviceError pairDevice(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList ¶ms); DeviceError pairDevice(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const DeviceDescriptorId &deviceDescriptorId); DeviceError confirmPairing(const PairingTransactionId &pairingTransactionId, const QString &secret = QString()); DeviceError removeConfiguredDevice(const DeviceId &deviceId); Device* findConfiguredDevice(const DeviceId &id) const; QList findConfiguredDevices(const DeviceClassId &deviceClassId) const; DeviceClass findDeviceClass(const DeviceClassId &deviceClassId) const; signals: void loaded(); void eventTriggered(const Event &event); void deviceStateChanged(Device *device, const QUuid &stateTypeId, const QVariant &value); void deviceRemoved(const DeviceId &deviceId); void deviceAdded(Device *device); void deviceParamsChanged(Device *device); void devicesDiscovered(const DeviceClassId &deviceClassId, const QList &devices); void deviceSetupFinished(Device *device, DeviceError status); void deviceEditFinished(Device *device, DeviceError status); void pairingFinished(const PairingTransactionId &pairingTransactionId, DeviceError status, const DeviceId &deviceId = DeviceId()); void actionExecutionFinished(const ActionId &actionId, DeviceError status); public slots: DeviceError executeAction(const Action &action); private slots: void loadPlugins(); void loadConfiguredDevices(); void storeConfiguredDevices(); void startMonitoringAutoDevices(); void slotDevicesDiscovered(const DeviceClassId &deviceClassId, const QList deviceDescriptors); void slotDeviceSetupFinished(Device *device, DeviceManager::DeviceSetupStatus status); void slotPairingFinished(const PairingTransactionId &pairingTransactionId, DeviceManager::DeviceSetupStatus status); void autoDevicesAppeared(const DeviceClassId &deviceClassId, const QList &deviceDescriptors); // Only connect this to Devices. It will query the sender() void slotDeviceStateValueChanged(const QUuid &stateTypeId, const QVariant &value); void radio433SignalReceived(QList rawData); void replyReady(const PluginId &pluginId, QNetworkReply *reply); void timerEvent(); private: bool verifyPluginMetadata(const QJsonObject &data); DeviceError addConfiguredDeviceInternal(const DeviceClassId &deviceClassId, const ParamList ¶ms, const DeviceId id = DeviceId::createDeviceId()); DeviceSetupStatus setupDevice(Device *device); void postSetupDevice(Device *device); DeviceError verifyParams(const QList paramTypes, ParamList ¶ms, bool requireAll = true); DeviceError verifyParam(const QList paramTypes, const Param ¶m); DeviceError verifyParam(const ParamType ¶mType, const Param ¶m); private: QHash m_supportedVendors; QHash > m_vendorDeviceMap; QHash m_supportedDevices; QList m_configuredDevices; QHash m_discoveredDevices; QHash m_devicePlugins; QString m_settingsFile; // Hardware Resources Radio433* m_radio433; QTimer m_pluginTimer; QList m_pluginTimerUsers; NetworkManager *m_networkManager; QHash > m_pairingsJustAdd; QHash > m_pairingsDiscovery; QList m_asyncDeviceEdit; QList m_discoveringPlugins; friend class DevicePlugin; }; Q_DECLARE_OPERATORS_FOR_FLAGS(DeviceManager::HardwareResources) Q_DECLARE_METATYPE(DeviceManager::DeviceError) #endif // DEVICEMANAGER_H