From 50f507fa56ce2d11241b3051b05da3abfc63122d Mon Sep 17 00:00:00 2001 From: Frank <91616163+softhack007@users.noreply.github.com> Date: Tue, 24 Mar 2026 15:21:31 +0100 Subject: [PATCH] bugfix: prevent _segment_index being misaligned w.r.t. segments vector prevent that an inactive segment in the segments list causes misalignment between getSegmentID() and actual segments vector. --- wled00/FX_fcn.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 247f0fe7..b40376c7 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -1937,9 +1937,10 @@ void WS2812FX::service() { unsigned speedLimit = (_targetFps != FPS_UNLIMITED) && (_targetFps != FPS_UNLIMITED_AC) ? (0.85f * FRAMETIME) : 1; // WLEDMM minimum for effect frametime _isServicing = true; - _segment_index = 0; if (esp32SemTake(segmentMux, 250) == pdTRUE) { // WLEDMM prevent changes to segments while servicing - for (segment &seg : _segments) { + for (size_t i = 0; i < _segments.size(); i++) { + Segment &seg = _segments[i]; + _segment_index = i; #ifdef WLEDMM_FASTPATH _currentSeg = &seg; #endif @@ -1990,10 +1991,11 @@ void WS2812FX::service() { seg.next_time = nowUp + frameDelay; } - _segment_index++; } esp32SemGive(segmentMux); } // end of critical section + _segment_index = 0; // segment index is only valid while effects are serviced + #ifdef WLEDMM_FASTPATH _currentSeg = & strip.getMainSegment(); // WLEDMM safe default