From f1acf5a9e42f95381fefea0c714d31c33e142012 Mon Sep 17 00:00:00 2001 From: johan Date: Sun, 8 Dec 2013 17:45:26 +0100 Subject: [PATCH] Clear effects if a setColor comes from another source Former-commit-id: 43084eeee26ee233ac1f0c71d6782b64b154f0da --- include/hyperion/Hyperion.h | 4 ++-- libsrc/effectengine/Effect.cpp | 6 +++--- libsrc/effectengine/Effect.h | 2 +- libsrc/effectengine/EffectEngine.cpp | 2 +- libsrc/hyperion/Hyperion.cpp | 12 +++++++++--- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/include/hyperion/Hyperion.h b/include/hyperion/Hyperion.h index bf23cf5c..b4fc0f1c 100644 --- a/include/hyperion/Hyperion.h +++ b/include/hyperion/Hyperion.h @@ -105,7 +105,7 @@ public slots: /// @param[in] ledColor The color to write to the leds /// @param[in] timeout_ms The time the leds are set to the given color [ms] /// - void setColor(int priority, const ColorRgb &ledColor, const int timeout_ms); + void setColor(int priority, const ColorRgb &ledColor, const int timeout_ms, bool clearEffects = true); /// /// Writes the given colors to all leds for the given time and priority @@ -114,7 +114,7 @@ public slots: /// @param[in] ledColors The colors to write to the leds /// @param[in] timeout_ms The time the leds are set to the given colors [ms] /// - void setColors(int priority, const std::vector &ledColors, const int timeout_ms); + void setColors(int priority, const std::vector &ledColors, const int timeout_ms, bool clearEffects = true); /// /// Returns the list with unique transform identifiers diff --git a/libsrc/effectengine/Effect.cpp b/libsrc/effectengine/Effect.cpp index 497ca700..e09f8979 100644 --- a/libsrc/effectengine/Effect.cpp +++ b/libsrc/effectengine/Effect.cpp @@ -174,7 +174,7 @@ PyObject* Effect::wrapSetColor(PyObject *self, PyObject *args) if (PyArg_ParseTuple(args, "bbb", &color.red, &color.green, &color.blue)) { std::fill(effect->_colors.begin(), effect->_colors.end(), color); - effect->setColors(effect->_priority, effect->_colors, timeout); + effect->setColors(effect->_priority, effect->_colors, timeout, false); return Py_BuildValue(""); } else @@ -195,7 +195,7 @@ PyObject* Effect::wrapSetColor(PyObject *self, PyObject *args) { char * data = PyByteArray_AS_STRING(bytearray); memcpy(effect->_colors.data(), data, length); - effect->setColors(effect->_priority, effect->_colors, timeout); + effect->setColors(effect->_priority, effect->_colors, timeout, false); return Py_BuildValue(""); } else @@ -265,7 +265,7 @@ PyObject* Effect::wrapSetImage(PyObject *self, PyObject *args) memcpy(image.memptr(), data, length); effect->_imageProcessor->process(image, effect->_colors); - effect->setColors(effect->_priority, effect->_colors, timeout); + effect->setColors(effect->_priority, effect->_colors, timeout, false); return Py_BuildValue(""); } else diff --git a/libsrc/effectengine/Effect.h b/libsrc/effectengine/Effect.h index 4f681a6e..62c2ed75 100644 --- a/libsrc/effectengine/Effect.h +++ b/libsrc/effectengine/Effect.h @@ -29,7 +29,7 @@ public slots: signals: void effectFinished(Effect * effect); - void setColors(int priority, const std::vector &ledColors, const int timeout_ms); + void setColors(int priority, const std::vector &ledColors, const int timeout_ms, bool clearEffects); private slots: void effectFinished(); diff --git a/libsrc/effectengine/EffectEngine.cpp b/libsrc/effectengine/EffectEngine.cpp index b409540f..c01809b5 100644 --- a/libsrc/effectengine/EffectEngine.cpp +++ b/libsrc/effectengine/EffectEngine.cpp @@ -83,7 +83,7 @@ int EffectEngine::runEffectScript(const std::string &script, const Json::Value & // create the effect Effect * effect = new Effect(priority, timeout, script, args); - connect(effect, SIGNAL(setColors(int,std::vector,int)), _hyperion, SLOT(setColors(int,std::vector,int)), Qt::QueuedConnection); + connect(effect, SIGNAL(setColors(int,std::vector,int,bool)), _hyperion, SLOT(setColors(int,std::vector,int,bool)), Qt::QueuedConnection); connect(effect, SIGNAL(effectFinished(Effect*)), this, SLOT(effectFinished(Effect*))); _activeEffects.push_back(effect); diff --git a/libsrc/hyperion/Hyperion.cpp b/libsrc/hyperion/Hyperion.cpp index 54d75f0f..8e42ac05 100644 --- a/libsrc/hyperion/Hyperion.cpp +++ b/libsrc/hyperion/Hyperion.cpp @@ -392,17 +392,23 @@ unsigned Hyperion::getLedCount() const return _ledString.leds().size(); } -void Hyperion::setColor(int priority, const ColorRgb &color, const int timeout_ms) +void Hyperion::setColor(int priority, const ColorRgb &color, const int timeout_ms, bool clearEffects) { // create led output std::vector ledColors(_ledString.leds().size(), color); // set colors - setColors(priority, ledColors, timeout_ms); + setColors(priority, ledColors, timeout_ms, clearEffects); } -void Hyperion::setColors(int priority, const std::vector& ledColors, const int timeout_ms) +void Hyperion::setColors(int priority, const std::vector& ledColors, const int timeout_ms, bool clearEffects) { + // clear effects if this call does not come from an effect + if (clearEffects) + { + _effectEngine->channelCleared(priority); + } + if (timeout_ms > 0) { const uint64_t timeoutTime = QDateTime::currentMSecsSinceEpoch() + timeout_ms;