mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
Added the possibility for scripts to have an argument string
Former-commit-id: 7c5cec34be56d926edda1c9955dc57de838622f9
This commit is contained in:
parent
121f56ca32
commit
554bc30c35
@ -26,13 +26,20 @@ public slots:
|
|||||||
/// Clear all effects
|
/// Clear all effects
|
||||||
void allChannelsCleared();
|
void allChannelsCleared();
|
||||||
|
|
||||||
|
public:
|
||||||
|
struct EffectDefinition
|
||||||
|
{
|
||||||
|
std::string script;
|
||||||
|
std::string args;
|
||||||
|
};
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void effectFinished(Effect * effect);
|
void effectFinished(Effect * effect);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Hyperion * _hyperion;
|
Hyperion * _hyperion;
|
||||||
|
|
||||||
std::map<std::string, std::string> _availableEffects;
|
std::map<std::string, EffectDefinition> _availableEffects;
|
||||||
|
|
||||||
std::list<Effect *> _activeEffects;
|
std::list<Effect *> _activeEffects;
|
||||||
|
|
||||||
|
@ -17,10 +17,12 @@ PyMethodDef Effect::effectMethods[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
Effect::Effect(int priority, int timeout) :
|
Effect::Effect(int priority, int timeout, const std::string & script, const std::string & args) :
|
||||||
QThread(),
|
QThread(),
|
||||||
_priority(priority),
|
_priority(priority),
|
||||||
_timeout(timeout),
|
_timeout(timeout),
|
||||||
|
_script(script),
|
||||||
|
_args(args),
|
||||||
_endTime(-1),
|
_endTime(-1),
|
||||||
_interpreterThreadState(nullptr),
|
_interpreterThreadState(nullptr),
|
||||||
_abortRequested(false),
|
_abortRequested(false),
|
||||||
@ -47,6 +49,9 @@ void Effect::run()
|
|||||||
// add ledCount variable to the interpreter
|
// add ledCount variable to the interpreter
|
||||||
PyObject_SetAttrString(module, "ledCount", Py_BuildValue("i", _imageProcessor->getLedCount()));
|
PyObject_SetAttrString(module, "ledCount", Py_BuildValue("i", _imageProcessor->getLedCount()));
|
||||||
|
|
||||||
|
// add a args variable to the interpreter
|
||||||
|
PyObject_SetAttrString(module, "args", Py_BuildValue("s", _args.c_str()));
|
||||||
|
|
||||||
// Set the end time if applicable
|
// Set the end time if applicable
|
||||||
if (_timeout > 0)
|
if (_timeout > 0)
|
||||||
{
|
{
|
||||||
@ -54,9 +59,15 @@ void Effect::run()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Run the effect script
|
// Run the effect script
|
||||||
std::string script = "test.py";
|
FILE* file = fopen(_script.c_str(), "r");
|
||||||
FILE* file = fopen(script.c_str(), "r");
|
if (file != nullptr)
|
||||||
PyRun_SimpleFile(file, script.c_str());
|
{
|
||||||
|
PyRun_SimpleFile(file, _script.c_str());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cerr << "Unable to open script file " << _script << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
// Clean up the thread state
|
// Clean up the thread state
|
||||||
Py_EndInterpreter(_interpreterThreadState);
|
Py_EndInterpreter(_interpreterThreadState);
|
||||||
|
@ -14,7 +14,7 @@ class Effect : public QThread
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Effect(int priority, int timeout);
|
Effect(int priority, int timeout, const std::string & script, const std::string & args = "");
|
||||||
virtual ~Effect();
|
virtual ~Effect();
|
||||||
|
|
||||||
virtual void run();
|
virtual void run();
|
||||||
@ -45,6 +45,10 @@ private:
|
|||||||
|
|
||||||
const int _timeout;
|
const int _timeout;
|
||||||
|
|
||||||
|
const std::string & _script;
|
||||||
|
|
||||||
|
const std::string & _args;
|
||||||
|
|
||||||
int64_t _endTime;
|
int64_t _endTime;
|
||||||
|
|
||||||
PyThreadState * _interpreterThreadState;
|
PyThreadState * _interpreterThreadState;
|
||||||
|
@ -23,13 +23,12 @@ EffectEngine::EffectEngine(Hyperion * hyperion) :
|
|||||||
connect(_hyperion, SIGNAL(allChannelsCleared()), this, SLOT(allChannelsCleared()));
|
connect(_hyperion, SIGNAL(allChannelsCleared()), this, SLOT(allChannelsCleared()));
|
||||||
|
|
||||||
// read all effects
|
// read all effects
|
||||||
_availableEffects["test"] = "test.py";
|
_availableEffects["test"] = {"test.py", "{\"speed\":0.2}"};
|
||||||
|
|
||||||
// initialize the python interpreter
|
// initialize the python interpreter
|
||||||
std::cout << "Initializing Python interpreter" << std::endl;
|
std::cout << "Initializing Python interpreter" << std::endl;
|
||||||
Py_InitializeEx(0);
|
Py_InitializeEx(0);
|
||||||
PyEval_InitThreads(); // Create the GIL
|
PyEval_InitThreads(); // Create the GIL
|
||||||
PyRun_SimpleString("print 'test'");
|
|
||||||
_mainThreadState = PyEval_SaveThread();
|
_mainThreadState = PyEval_SaveThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,11 +53,18 @@ int EffectEngine::runEffect(const std::string &effectName, int priority, int tim
|
|||||||
{
|
{
|
||||||
std::cout << "run effect " << effectName << " on channel " << priority << std::endl;
|
std::cout << "run effect " << effectName << " on channel " << priority << std::endl;
|
||||||
|
|
||||||
|
if (_availableEffects.find(effectName) == _availableEffects.end())
|
||||||
|
{
|
||||||
|
// no such effect
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// clear current effect on the channel
|
// clear current effect on the channel
|
||||||
channelCleared(priority);
|
channelCleared(priority);
|
||||||
|
|
||||||
// create the effect
|
// create the effect
|
||||||
Effect * effect = new Effect(priority, timeout);
|
const EffectDefinition & effectDefinition = _availableEffects[effectName];
|
||||||
|
Effect * effect = new Effect(priority, timeout, effectDefinition.script, effectDefinition.args);
|
||||||
connect(effect, SIGNAL(setColors(int,std::vector<ColorRgb>,int)), _hyperion, SLOT(setColors(int,std::vector<ColorRgb>,int)), Qt::QueuedConnection);
|
connect(effect, SIGNAL(setColors(int,std::vector<ColorRgb>,int)), _hyperion, SLOT(setColors(int,std::vector<ColorRgb>,int)), Qt::QueuedConnection);
|
||||||
connect(effect, SIGNAL(effectFinished(Effect*)), this, SLOT(effectFinished(Effect*)));
|
connect(effect, SIGNAL(effectFinished(Effect*)), this, SLOT(effectFinished(Effect*)));
|
||||||
_activeEffects.push_back(effect);
|
_activeEffects.push_back(effect);
|
||||||
|
Loading…
Reference in New Issue
Block a user