#pragma once // Qt includes #include #include #include #include #include // Hyperion includes #include #include #include class Hyperion; class Logger; class Effect : public QThread { Q_OBJECT public: friend class EffectModule; Effect(Hyperion *hyperion , int priority , int timeout , const QString &script , const QString &name , const QJsonObject &args = QJsonObject() , const QString &imageData = "" ); ~Effect() override; void run() override; int getPriority() const { return _priority; } /// /// @brief Set manual interruption to true, /// Note: DO NOT USE QThread::interruption! /// void requestInterruption() { _interupt = true; } /// /// @brief Check if the interruption flag has been set /// @return The flag state /// bool isInterruptionRequested() { return _interupt; } QString getScript() const { return _script; } QString getName() const { return _name; } int getTimeout() const {return _timeout; } QJsonObject getArgs() const { return _args; } signals: void setInput(int priority, const std::vector &ledColors, int timeout_ms, bool clearEffect); void setInputImage(int priority, const Image &image, int timeout_ms, bool clearEffect); private: void setModuleParameters(); void addImage(); Hyperion *_hyperion; const int _priority; const int _timeout; const QString _script; const QString _name; const QJsonObject _args; const QString _imageData; int64_t _endTime; /// Buffer for colorData QVector _colors; Logger *_log; // Reflects whenever this effects should interrupt (timeout or external request) std::atomic _interupt {}; QSize _imageSize; QImage _image; QPainter *_painter; QVector _imageStack; };