From b2578703b2234d907c79968cf7fd706537f7a91a Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Mon, 29 Dec 2025 12:56:06 +0100 Subject: [PATCH 1/6] minor bugfixes as suggested by the rabbit - PulLightControl UM: dont release a lock you do not own - off-by-one error in extractModeSlider (used only in rotary in UM) - safety check in playlist in case something goes horribly wrong --- wled00/playlist.cpp | 3 ++- wled00/util.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/wled00/playlist.cpp b/wled00/playlist.cpp index 463f2b15..b98f93c6 100644 --- a/wled00/playlist.cpp +++ b/wled00/playlist.cpp @@ -90,7 +90,8 @@ int16_t loadPlaylist(JsonObject playlistObj, byte presetId) { it++; } } - for (int i = it; i < playlistLen; i++) playlistEntries[i].dur = playlistEntries[it -1].dur; + if (it > 0) // should never happen but just in case + for (int i = it; i < playlistLen; i++) playlistEntries[i].dur = playlistEntries[it -1].dur; it = 0; JsonArray tr = playlistObj[F("transition")]; diff --git a/wled00/util.cpp b/wled00/util.cpp index 63e8b131..d075efa1 100644 --- a/wled00/util.cpp +++ b/wled00/util.cpp @@ -378,7 +378,7 @@ uint8_t extractModeSlider(uint8_t mode, uint8_t slider, char *dest, uint8_t maxL case 0: strncpy_P(dest, PSTR("FX Speed"), maxLen); break; case 1: strncpy_P(dest, PSTR("FX Intensity"), maxLen); break; } - dest[maxLen] = '\0'; // strncpy does not necessarily null terminate string + dest[maxLen-1] = '\0'; // strncpy does not necessarily null terminate string } } return strlen(dest); From 45e8c63c2c918910d159076a61390d2c4553a08e Mon Sep 17 00:00:00 2001 From: Will Tatam Date: Sun, 9 Nov 2025 08:03:10 +0000 Subject: [PATCH 2/6] Merge pull request #5031 from wled/add-check-diff Add segment checkmarks to `differs()` check --- wled00/FX_fcn.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index d9417063..9d47b804 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -1373,6 +1373,9 @@ uint8_t Segment::differs(Segment& b) const { if (custom1 != b.custom1) d |= SEG_DIFFERS_FX; if (custom2 != b.custom2) d |= SEG_DIFFERS_FX; if (custom3 != b.custom3) d |= SEG_DIFFERS_FX; + if (a.check1 != b.check1) d |= SEG_DIFFERS_FX; + if (a.check2 != b.check2) d |= SEG_DIFFERS_FX; + if (a.check3 != b.check3) d |= SEG_DIFFERS_FX; if (startY != b.startY) d |= SEG_DIFFERS_BOUNDS; if (stopY != b.stopY) d |= SEG_DIFFERS_BOUNDS; From 3785ae9a20815efd2db5cd3afde8add5b0542ffe Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sun, 28 Dec 2025 13:02:02 +0100 Subject: [PATCH 3/6] fix FX checkmark sync --- wled00/udp.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wled00/udp.cpp b/wled00/udp.cpp index 3fc630e9..6401815c 100644 --- a/wled00/udp.cpp +++ b/wled00/udp.cpp @@ -452,8 +452,8 @@ void handleNotifications() selseg.custom2 = udpIn[30+ofs]; selseg.custom3 = udpIn[31+ofs] & 0x1F; selseg.check1 = (udpIn[31+ofs]>>5) & 0x1; - selseg.check1 = (udpIn[31+ofs]>>6) & 0x1; - selseg.check1 = (udpIn[31+ofs]>>7) & 0x1; + selseg.check2 = (udpIn[31+ofs]>>6) & 0x1; + selseg.check3 = (udpIn[31+ofs]>>7) & 0x1; } startY = (udpIn[32+ofs] << 8 | udpIn[33+ofs]); stopY = (udpIn[34+ofs] << 8 | udpIn[35+ofs]); From 103e7db83fa59f53bbbc7f7247f691488a7c9264 Mon Sep 17 00:00:00 2001 From: Frank <91616163+softhack007@users.noreply.github.com> Date: Mon, 29 Dec 2025 14:45:11 +0100 Subject: [PATCH 4/6] post merge fix, build 2512291 --- wled00/FX_fcn.cpp | 6 +++--- wled00/wled.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 9d47b804..5dfc00db 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -1373,9 +1373,9 @@ uint8_t Segment::differs(Segment& b) const { if (custom1 != b.custom1) d |= SEG_DIFFERS_FX; if (custom2 != b.custom2) d |= SEG_DIFFERS_FX; if (custom3 != b.custom3) d |= SEG_DIFFERS_FX; - if (a.check1 != b.check1) d |= SEG_DIFFERS_FX; - if (a.check2 != b.check2) d |= SEG_DIFFERS_FX; - if (a.check3 != b.check3) d |= SEG_DIFFERS_FX; + if (check1 != b.check1) d |= SEG_DIFFERS_FX; + if (check2 != b.check2) d |= SEG_DIFFERS_FX; + if (check3 != b.check3) d |= SEG_DIFFERS_FX; if (startY != b.startY) d |= SEG_DIFFERS_BOUNDS; if (stopY != b.stopY) d |= SEG_DIFFERS_BOUNDS; diff --git a/wled00/wled.h b/wled00/wled.h index 26dca9cd..74abe15f 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -7,7 +7,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2512171 +#define VERSION 2512291 // WLEDMM - you can check for this define in usermods, to only enabled WLEDMM specific code in the "right" fork. Its not defined in AC WLED. #define _MoonModules_WLED_ From dab6a96b78789cd1eff400259ac9309502ef9033 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Mon, 29 Dec 2025 14:50:58 +0100 Subject: [PATCH 5/6] revert change to extractModeName, add comment for clarification --- wled00/util.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wled00/util.cpp b/wled00/util.cpp index d075efa1..61aa0b4d 100644 --- a/wled00/util.cpp +++ b/wled00/util.cpp @@ -254,7 +254,7 @@ void releaseJSONBufferLock() // extracts effect mode (or palette) name from names serialized string -// caller must provide large enough buffer for name (including SR extensions)! +// caller must provide large enough buffer for name (including SR extensions)! maxLen is (buffersize - 1) uint8_t extractModeName(uint8_t mode, const char *src, char *dest, uint8_t maxLen) { if (src == JSON_mode_names || src == nullptr) { @@ -276,7 +276,7 @@ uint8_t extractModeName(uint8_t mode, const char *src, char *dest, uint8_t maxLe if (src == JSON_palette_names && mode > (GRADIENT_PALETTE_COUNT + 13)) { snprintf_P(dest, maxLen, PSTR("~ Custom %d ~"), 255-mode); - dest[maxLen-1] = '\0'; + dest[maxLen] = '\0'; return strlen(dest); } From 4521ba848cf49d2f9f2a273266b4315f5caf14fa Mon Sep 17 00:00:00 2001 From: Frank <91616163+softhack007@users.noreply.github.com> Date: Mon, 29 Dec 2025 19:43:42 +0100 Subject: [PATCH 6/6] align extractModeSlider() and extractModeNames() behaviour * document behavior * both functions are only called from usermods, and all calls are already correctly passing maxLen = buffersize -1 --- wled00/util.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wled00/util.cpp b/wled00/util.cpp index 61aa0b4d..58f092ee 100644 --- a/wled00/util.cpp +++ b/wled00/util.cpp @@ -311,7 +311,7 @@ uint8_t extractModeName(uint8_t mode, const char *src, char *dest, uint8_t maxLe } -// extracts effect slider data (1st group after @) +// extracts effect slider data (1st group after @) -> maxLen is (buffersize - 1) uint8_t extractModeSlider(uint8_t mode, uint8_t slider, char *dest, uint8_t maxLen, uint8_t *var) { dest[0] = '\0'; // start by clearing buffer @@ -378,7 +378,7 @@ uint8_t extractModeSlider(uint8_t mode, uint8_t slider, char *dest, uint8_t maxL case 0: strncpy_P(dest, PSTR("FX Speed"), maxLen); break; case 1: strncpy_P(dest, PSTR("FX Intensity"), maxLen); break; } - dest[maxLen-1] = '\0'; // strncpy does not necessarily null terminate string + dest[maxLen] = '\0'; // strncpy does not necessarily null terminate string } } return strlen(dest);