diff --git a/wled00/FX.h b/wled00/FX.h index afdf0103c..80abca559 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -657,7 +657,6 @@ class WS2812FX { setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0), show(void), setTargetFps(uint8_t fps), - setPixelSegment(uint8_t n), deserializeMap(uint8_t n=0); bool @@ -688,6 +687,7 @@ class WS2812FX { //getFirstSelectedSegment(void), getMainSegmentId(void), getTargetFps(void), + setPixelSegment(uint8_t n), gamma8(uint8_t), gamma8_cal(uint8_t, float), sin_gap(uint16_t), diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index c7ee98f86..d091dbdb5 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -716,36 +716,16 @@ bool WS2812FX::checkSegmentAlignment() { } //After this function is called, setPixelColor() will use that segment (offsets, grouping, ... will apply) -//Note: If called in an interrupt (e.g. JSON API), it must be reset with "setPixelColor(255)", +//Note: If called in an interrupt (e.g. JSON API), original segment must be restored, //otherwise it can lead to a crash on ESP32 because _segment_index is modified while in use by the main thread -#ifdef ARDUINO_ARCH_ESP32 -uint8_t _segment_index_prev = 0; -uint16_t _virtualSegmentLength_prev = 0; -bool _ps_set = false; -#endif - -void WS2812FX::setPixelSegment(uint8_t n) +uint8_t WS2812FX::setPixelSegment(uint8_t n) { + uint8_t prevSegId = _segment_index; if (n < MAX_NUM_SEGMENTS) { - #ifdef ARDUINO_ARCH_ESP32 - if (!_ps_set) { - _segment_index_prev = _segment_index; - _virtualSegmentLength_prev = _virtualSegmentLength; - _ps_set = true; - } - #endif _segment_index = n; _virtualSegmentLength = SEGMENT.virtualLength(); - } else { - _virtualSegmentLength = 0; - #ifdef ARDUINO_ARCH_ESP32 - if (_ps_set) { - _segment_index = _segment_index_prev; - _virtualSegmentLength = _virtualSegmentLength_prev; - _ps_set = false; - } - #endif } + return prevSegId; } void WS2812FX::setRange(uint16_t i, uint16_t i2, uint32_t col) diff --git a/wled00/json.cpp b/wled00/json.cpp index 27a989dc5..678674bcf 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -189,7 +189,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId) JsonArray iarr = elem[F("i")]; //set individual LEDs if (!iarr.isNull()) { - strip.setPixelSegment(id); + uint8_t oldSegId = strip.setPixelSegment(id); //freeze and init to black if (!seg.getOption(SEG_OPTION_FREEZE)) { @@ -235,7 +235,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId) set = 0; } } - strip.setPixelSegment(255); + strip.setPixelSegment(oldSegId); strip.trigger(); } else if (!elem["frz"] && iarr.isNull()) { //return to regular effect seg.setOption(SEG_OPTION_FREEZE, false);