diff --git a/wled00/FX.h b/wled00/FX.h index 4c2bb930..86ecd39e 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -731,7 +731,7 @@ class WS2812FX { // 96 bytes setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t grouping = 1, uint8_t spacing = 0, uint16_t offset = UINT16_MAX, uint16_t startY=0, uint16_t stopY=1), setMainSegmentId(uint8_t n), restartRuntime(), - resetSegments(), + resetSegments(bool boundsOnly = false), //WLEDMM add boundsOnly makeAutoSegments(bool forceReset = false), fixInvalidSegments(), setPixelColor(int n, uint32_t c), diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index b22ae167..932856f2 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -68,7 +68,7 @@ void WS2812FX::setUpMatrix(bool reset) { Segment::maxHeight = 1; panels = 0; panel.clear(); // release memory allocated by panels - resetSegments(); + resetSegments(true); //WLEDMM bounds only return; } @@ -131,13 +131,7 @@ void WS2812FX::setUpMatrix(bool reset) { Segment::maxWidth = _length; Segment::maxHeight = 1; } - if (reset) //resetSegments(); //WLEDMM: only if reset, and only update width and height, keep the fx in place - for (segment &seg : _segments) { - seg.start = 0; - seg.stop = Segment::maxWidth; - seg.startY = 0; - seg.stopY = Segment::maxHeight; - } + //WLEDMM: no resetSegments here, only do it in set.cpp/handleSettingsSet } #else isMatrix = false; // no matter what config says diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index b8cf62de..38c4b9ca 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -1740,15 +1740,30 @@ void WS2812FX::restartRuntime() { for (segment &seg : _segments) seg.markForReset(); } -void WS2812FX::resetSegments() { - _segments.clear(); // destructs all Segment as part of clearing - #ifndef WLED_DISABLE_2D - segment seg = isMatrix ? Segment(0, Segment::maxWidth, 0, Segment::maxHeight) : Segment(0, _length); - #else - segment seg = Segment(0, _length); - #endif - _segments.push_back(seg); - _mainSegment = 0; +void WS2812FX::resetSegments(bool boundsOnly) { //WLEDMM add boundsonly + if (!boundsOnly) { + _segments.clear(); // destructs all Segment as part of clearing + #ifndef WLED_DISABLE_2D + segment seg = isMatrix ? Segment(0, Segment::maxWidth, 0, Segment::maxHeight) : Segment(0, _length); + #else + segment seg = Segment(0, _length); + #endif + _segments.push_back(seg); + _mainSegment = 0; + } else { //WLEDMM boundsonly + for (segment &seg : _segments) { + #ifndef WLED_DISABLE_2D + seg.start = 0; + seg.stop = Segment::maxWidth; + seg.startY = 0; + seg.stopY = Segment::maxHeight; + #else + seg.start = 0; + seg.stop = _length; + #endif + } + } + } void WS2812FX::makeAutoSegments(bool forceReset) { diff --git a/wled00/set.cpp b/wled00/set.cpp index 526b1cf6..6b55c4b2 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -714,6 +714,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) Segment::maxHeight = 1; } strip.setUpMatrix(); // will check limits + strip.resetSegments(true); //WLEDMM reset segments, boundsOnly!! } #endif diff --git a/wled00/wled.h b/wled00/wled.h index 4f0c27f8..764222fd 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2302120 +#define VERSION 2302130 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG @@ -681,7 +681,7 @@ WLED_GLOBAL BusManager busses _INIT(BusManager()); WLED_GLOBAL WS2812FX strip _INIT(WS2812FX()); WLED_GLOBAL BusConfig* busConfigs[WLED_MAX_BUSSES+WLED_MIN_VIRTUAL_BUSSES] _INIT({nullptr}); //temporary, to remember values from network callback until after WLED_GLOBAL bool doInitBusses _INIT(false); -WLED_GLOBAL bool loadLedmap _INIT(false); +WLED_GLOBAL bool loadLedmap _INIT(false); //WLEDMM use as bool and use loadedLedmap for Nr WLED_GLOBAL uint8_t loadedLedmap _INIT(0); //WLEDMM default 0 WLED_GLOBAL uint16_t ledMaps _INIT(0); // bitfield representation of available ledmaps