#pragma once // Qt includes #include #include #include #include #include #include // Hyperion includes #include // Effect engine includes #include #include #include #include // pre-declarioation class Effect; typedef struct _ts PyThreadState; class EffectEngine : public QObject { Q_OBJECT public: EffectEngine(Hyperion * hyperion, const QJsonObject & jsonEffectConfig); virtual ~EffectEngine(); const std::list & getEffects() const; const std::list & getActiveEffects(); const std::list & getEffectSchemas(); static bool loadEffectDefinition(const QString & path, const QString & effectConfigFile, EffectDefinition &effectDefinition); static bool loadEffectSchema(const QString & path, const QString & effectSchemaFile, EffectSchema &effectSchema); public slots: /// Run the specified effect on the given priority channel and optionally specify a timeout int runEffect(const QString &effectName, int priority, int timeout = -1); /// Run the specified effect on the given priority channel and optionally specify a timeout int runEffect(const QString &effectName, const QJsonObject & args, int priority, int timeout = -1, QString pythonScript = ""); /// Clear any effect running on the provided channel void channelCleared(int priority); /// Clear all effects void allChannelsCleared(); private slots: void effectFinished(Effect * effect); private: /// Run the specified effect on the given priority channel and optionally specify a timeout int runEffectScript(const QString &script, const QString &name, const QJsonObject & args, int priority, int timeout = -1); private: Hyperion * _hyperion; std::list _availableEffects; std::list _activeEffects; std::list _availableActiveEffects; std::list _effectSchemas; PyThreadState * _mainThreadState; Logger * _log; };