#pragma once // Python includes // collide of qt slots macro #undef slots #include "Python.h" #define slots // Qt includes #include #include #include #include #include #include // Hyperion includes #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()); virtual ~Effect(); virtual void run(); int getPriority() const { return _priority; }; /// /// @brief Set manual interuption to true, /// Note: DO NOT USE QThread::interuption! /// void setInteruptionFlag() { _interupt = true; }; /// /// @brief Check if the interuption flag has been set /// @return The flag state /// bool hasInteruptionFlag() { 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(const int priority, const std::vector& ledColors, const int timeout_ms, const bool& clearEffect); void setInputImage(const int priority, const Image& image, const int timeout_ms, const bool& clearEffect); private: void addImage(); Hyperion* _hyperion; const int _priority; const int _timeout; const QString _script; const QString _name; const QJsonObject _args; int64_t _endTime; /// Buffer for colorData QVector _colors; Logger* _log; // Reflects whenever this effects should interupt (timeout or external request) bool _interupt = false; QSize _imageSize; QImage _image; QPainter* _painter; QVector _imageStack; };