/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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 DEVICEMANAGERIMPLEMENTATION_H #define DEVICEMANAGERIMPLEMENTATION_H #include "libnymea.h" #include "devices/device.h" #include "devices/devicedescriptor.h" #include "devices/pluginmetadata.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" #include "devices/devicemanager.h" class Device; class DevicePlugin; class DevicePairingInfo; class HardwareManager; class Translator; class DeviceManagerImplementation: public DeviceManager { Q_OBJECT friend class DevicePlugin; public: explicit DeviceManagerImplementation(HardwareManager *hardwareManager, const QLocale &locale, QObject *parent = nullptr); ~DeviceManagerImplementation(); static QStringList pluginSearchDirs(); static QList pluginsMetadata(); void registerStaticPlugin(DevicePlugin* plugin, const PluginMetadata &metaData); DevicePlugins plugins() const override; Device::DeviceError setPluginConfig(const PluginId &pluginId, const ParamList &pluginConfig) override; Vendors supportedVendors() const override; Interfaces supportedInterfaces() const override; DeviceClasses supportedDevices(const VendorId &vendorId = VendorId()) const override; Devices configuredDevices() const override; Device* findConfiguredDevice(const DeviceId &id) const override; Devices findConfiguredDevices(const DeviceClassId &deviceClassId) const override; Devices findConfiguredDevices(const QString &interface) const override; Devices findChildDevices(const DeviceId &id) const override; DeviceClass findDeviceClass(const DeviceClassId &deviceClassId) const override; Device::DeviceError discoverDevices(const DeviceClassId &deviceClassId, const ParamList ¶ms) override; Device::DeviceError addConfiguredDevice(const DeviceClassId &deviceClassId, const QString &name, const ParamList ¶ms, const DeviceId id = DeviceId::createDeviceId()) override; Device::DeviceError addConfiguredDevice(const DeviceClassId &deviceClassId, const QString &name, const DeviceDescriptorId &deviceDescriptorId, const ParamList ¶ms = ParamList(), const DeviceId &deviceId = DeviceId::createDeviceId()) override; Device::DeviceError reconfigureDevice(const DeviceId &deviceId, const ParamList ¶ms, bool fromDiscoveryOrAuto = false) override; Device::DeviceError reconfigureDevice(const DeviceId &deviceId, const DeviceDescriptorId &deviceDescriptorId) override; Device::DeviceError editDevice(const DeviceId &deviceId, const QString &name) override; Device::DeviceError setDeviceSettings(const DeviceId &deviceId, const ParamList &settings) override; Device::DeviceError pairDevice(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const QString &name, const ParamList ¶ms) override; Device::DeviceError pairDevice(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const QString &name, const DeviceDescriptorId &deviceDescriptorId) override; Device::DeviceError confirmPairing(const PairingTransactionId &pairingTransactionId, const QString &secret = QString()) override; Device::DeviceError removeConfiguredDevice(const DeviceId &deviceId) override; Device::DeviceError executeAction(const Action &action) override; Device::BrowseResult browseDevice(const DeviceId &deviceId, const QString &itemId, const QLocale &locale) override; Device::DeviceError executeBrowserItem(const BrowserAction &browserAction) override; Device::DeviceError executeBrowserItemAction(const BrowserItemAction &browserItemAction) override; QString translate(const PluginId &pluginId, const QString &string, const QLocale &locale) override; signals: void loaded(); public slots: void timeTick(); private slots: void loadPlugins(); void loadPlugin(DevicePlugin *pluginIface, const PluginMetadata &metaData); void loadConfiguredDevices(); void storeConfiguredDevices(); void startMonitoringAutoDevices(); void slotDevicesDiscovered(const DeviceClassId &deviceClassId, const QList deviceDescriptors); void slotDeviceSetupFinished(Device *device, Device::DeviceSetupStatus status); void slotPairingFinished(const PairingTransactionId &pairingTransactionId, Device::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 StateTypeId &stateTypeId, const QVariant &value); void slotDeviceSettingChanged(const ParamTypeId ¶mTypeId, const QVariant &value); private: Device::DeviceError addConfiguredDeviceInternal(const DeviceClassId &deviceClassId, const QString &name, const ParamList ¶ms, const DeviceId id = DeviceId::createDeviceId(), const DeviceId &parentDeviceId = DeviceId()); Device::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; }; #endif // DEVICEMANAGERIMPLEMENTATION_H