#pragma once #include #include #include #include #include // STL incldues #include #include #include #include // Utility includes #include #include #include #include #include #include class LedDevice; typedef LedDevice* ( *LedDeviceCreateFuncType ) ( const QJsonObject& ); typedef std::map LedDeviceRegistry; /// /// Interface (pure virtual base class) for LedDevices. /// class LedDevice : public QObject { Q_OBJECT public: LedDevice(); /// /// Empty virtual destructor for pure virtual base class /// virtual ~LedDevice() {} /// Switch the leds off virtual int switchOff(); virtual int setLedValues(const std::vector& ledValues); /// /// Opens and configures the output device /// /// @return Zero on succes else negative /// virtual int open(); static int addToDeviceMap(QString name, LedDeviceCreateFuncType funcPtr); static const LedDeviceRegistry& getDeviceMap(); static void setActiveDevice(QString dev); static QString activeDevice() { return _activeDevice; } static QJsonObject getLedDeviceSchemas(); static void setLedCount(int ledCount); static int getLedCount() { return _ledCount; } void setEnable(bool enable); bool enabled() { return _enabled; }; int getLatchTime() { return _latchTime_ms; }; inline bool componentState() { return enabled(); }; protected: /// /// Writes the RGB-Color values to the leds. /// /// @param[in] ledValues The RGB-color per led /// /// @return Zero on success else negative /// virtual int write(const std::vector& ledValues) = 0; virtual bool init(const QJsonObject &deviceConfig); /// The common Logger instance for all LedDevices Logger * _log; /// The buffer containing the packed RGB values std::vector _ledBuffer; bool _deviceReady; static QString _activeDevice; static LedDeviceRegistry _ledDeviceMap; static int _ledCount; static int _ledRGBCount; static int _ledRGBWCount; /// Timer object which makes sure that led data is written at a minimum rate /// e.g. Adalight device will switch off when it does not receive data at least every 15 seconds QTimer _refresh_timer; unsigned int _refresh_timer_interval; qint64 _last_write_time; unsigned int _latchTime_ms; protected slots: /// Write the last data to the leds again int rewriteLeds(); private: std::vector _ledValues; bool _componentRegistered; bool _enabled; };