/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2015-2018 Simon Stürz * * Copyright (C) 2014 Michael Zanetti * * * * This file is part of nymea. * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; If not, see * * . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #ifndef DEVICEMANAGER_H #define DEVICEMANAGER_H #include "libnymea.h" #include "plugin/device.h" #include "plugin/devicedescriptor.h" #include "types/deviceclass.h" #include "types/interface.h" #include "types/event.h" #include "types/action.h" #include "types/vendor.h" #include #include #include #include #include #include "hardwaremanager.h" class Device; class DevicePlugin; class DevicePairingInfo; class HardwareManager; class Translator; class LIBNYMEA_EXPORT DeviceManager : public QObject { Q_OBJECT friend class DevicePlugin; public: enum DeviceError { DeviceErrorNoError, DeviceErrorPluginNotFound, DeviceErrorVendorNotFound, DeviceErrorDeviceNotFound, DeviceErrorDeviceClassNotFound, DeviceErrorActionTypeNotFound, DeviceErrorStateTypeNotFound, DeviceErrorEventTypeNotFound, DeviceErrorDeviceDescriptorNotFound, DeviceErrorMissingParameter, DeviceErrorInvalidParameter, DeviceErrorSetupFailed, DeviceErrorDuplicateUuid, DeviceErrorCreationMethodNotSupported, DeviceErrorSetupMethodNotSupported, DeviceErrorHardwareNotAvailable, DeviceErrorHardwareFailure, DeviceErrorAuthentificationFailure, DeviceErrorAsync, DeviceErrorDeviceInUse, DeviceErrorDeviceInRule, DeviceErrorDeviceIsChild, DeviceErrorPairingTransactionIdNotFound, DeviceErrorParameterNotWritable }; Q_ENUM(DeviceError) enum DeviceSetupStatus { DeviceSetupStatusSuccess, DeviceSetupStatusFailure, DeviceSetupStatusAsync }; Q_ENUM(DeviceSetupStatus) explicit DeviceManager(HardwareManager *hardwareManager, const QLocale &locale, QObject *parent = nullptr); ~DeviceManager(); static QStringList pluginSearchDirs(); static QList pluginsMetadata(); void registerStaticPlugin(DevicePlugin* plugin, const QJsonObject &metaData); HardwareManager *hardwareManager() const; QList plugins() const; DevicePlugin* plugin(const PluginId &id) const; DeviceError setPluginConfig(const PluginId &pluginId, const ParamList &pluginConfig); QList supportedVendors() const; Interfaces supportedInterfaces() const; Interface findInterface(const QString &name); QList supportedDevices(const VendorId &vendorId = VendorId()) const; DeviceError discoverDevices(const DeviceClassId &deviceClassId, const ParamList ¶ms); QList configuredDevices() const; DeviceError addConfiguredDevice(const DeviceClassId &deviceClassId, const QString &name, const ParamList ¶ms, const DeviceId id = DeviceId::createDeviceId()); DeviceError addConfiguredDevice(const DeviceClassId &deviceClassId, const QString &name, const DeviceDescriptorId &deviceDescriptorId, const ParamList ¶ms = ParamList(), const DeviceId &deviceId = DeviceId::createDeviceId()); DeviceError reconfigureDevice(const DeviceId &deviceId, const ParamList ¶ms, bool fromDiscovery = false); DeviceError reconfigureDevice(const DeviceId &deviceId, const DeviceDescriptorId &deviceDescriptorId); DeviceError editDevice(const DeviceId &deviceId, const QString &name); DeviceError pairDevice(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const QString &name, const ParamList ¶ms); DeviceError pairDevice(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const QString &name, 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; QList findConfiguredDevices(const QString &interface) const; QList findChildDevices(const DeviceId &id) const; DeviceClass findDeviceClass(const DeviceClassId &deviceClassId) const; 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); Translator* translator() const; signals: void loaded(); void pluginConfigChanged(const PluginId &id, const ParamList &config); void eventTriggered(const Event &event); void deviceStateChanged(Device *device, const QUuid &stateTypeId, const QVariant &value); void deviceRemoved(const DeviceId &deviceId); void deviceDisappeared(const DeviceId &deviceId); void deviceAdded(Device *device); void deviceChanged(Device *device); void devicesDiscovered(const DeviceClassId &deviceClassId, const QList &devices); void deviceSetupFinished(Device *device, DeviceError status); void deviceReconfigurationFinished(Device *device, DeviceError status); void pairingFinished(const PairingTransactionId &pairingTransactionId, DeviceError status, const DeviceId &deviceId = DeviceId()); void actionExecutionFinished(const ActionId &actionId, DeviceManager::DeviceError status); public slots: DeviceError executeAction(const Action &action); void timeTick(); private slots: void loadPlugins(); void loadPlugin(DevicePlugin *pluginIface); 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 onAutoDevicesAppeared(const DeviceClassId &deviceClassId, const QList &deviceDescriptors); void onAutoDeviceDisappeared(const DeviceId &deviceId); void onLoaded(); void cleanupDeviceStateCache(); // Only connect this to Devices. It will query the sender() void slotDeviceStateValueChanged(const QUuid &stateTypeId, const QVariant &value); private: bool verifyPluginMetadata(const QJsonObject &data); DeviceError addConfiguredDeviceInternal(const DeviceClassId &deviceClassId, const QString &name, const ParamList ¶ms, const DeviceId id = DeviceId::createDeviceId()); DeviceSetupStatus setupDevice(Device *device); void postSetupDevice(Device *device); void storeDeviceStates(Device *device); void loadDeviceStates(Device *device); private: HardwareManager *m_hardwareManager; QLocale m_locale; Translator *m_translator = nullptr; QHash m_supportedVendors; QHash m_supportedInterfaces; QHash > m_vendorDeviceMap; QHash m_supportedDevices; QHash m_configuredDevices; QHash m_discoveredDevices; QHash m_devicePlugins; QHash m_pairingsJustAdd; QHash m_pairingsDiscovery; QList m_asyncDeviceReconfiguration; QList m_discoveringPlugins; }; Q_DECLARE_METATYPE(DeviceManager::DeviceError) Q_DECLARE_METATYPE(DeviceManager::DeviceSetupStatus) #endif // DEVICEMANAGER_H