#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(); void readEffects(); const std::list & getEffects() const { return _availableEffects; }; const std::list & getActiveEffects(); const std::list & getEffectSchemas() { return _effectSchemas; }; 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) { return runEffect(effectName, QJsonObject(), priority, timeout); }; /// 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: bool loadEffectDefinition(const QString & path, const QString & effectConfigFile, EffectDefinition &effectDefinition); bool loadEffectSchema(const QString & path, const QString & effectSchemaFile, EffectSchema &effectSchema); /// 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; QJsonObject _effectConfig; std::list _availableEffects; std::list _activeEffects; std::list _availableActiveEffects; std::list _effectSchemas; PyThreadState * _mainThreadState; Logger * _log; };