From 2a120e81f83eaa7d9672ccef8f4be5e4bd14ccd3 Mon Sep 17 00:00:00 2001 From: Frank <91616163+softhack007@users.noreply.github.com> Date: Sun, 16 Nov 2025 16:08:16 +0100 Subject: [PATCH] image effect: flicker fixer for WS2812b leds driven by RMT Large file read operations can cause RMT stall leading to flicker. * wait for RMT driver when lading a new gif, and when decoding a new frame. --- wled00/image_loader.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/wled00/image_loader.cpp b/wled00/image_loader.cpp index b6d13efa..96e131d5 100644 --- a/wled00/image_loader.cpp +++ b/wled00/image_loader.cpp @@ -141,6 +141,11 @@ byte renderImageToSegment(Segment &seg) { USER_PRINTF("GIF decoder unsupported file: %s\n", lastFilename); return IMAGE_ERROR_UNSUPPORTED_FORMAT; } + + // flicker fixer: if we have ws2812b leds, lets wait a moment until RMT output is done. + unsigned t0 = millis(); + while (strip.isUpdating() && (millis() - t0 < 100)) delay(1); // up to 100 ms = good enough for up to 1800 LEDs per output + if (file) file.close(); if (!openGif(lastFilename)) { gifDecodeFailed = true; @@ -218,6 +223,10 @@ byte renderImageToSegment(Segment &seg) { // TODO consider handling this on FX level with a different frametime, but that would cause slow gifs to speed up during transitions if (millis() - lastFrameDisplayTime < wait) return IMAGE_ERROR_WAITING; + // flicker fixer: if we have ws2812b leds, lets wait a moment until RMT output is done. + unsigned td0 = millis(); + while (strip.isUpdating() && (millis() - td0 < 20)) delay(1); // wait up to 20ms for LED output to finish + int result = decoder.decodeFrame(false); if (result < 0) { USER_PRINTF("GIF Decoding error %d in decodeFrame().\n", result);