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.
This commit is contained in:
Frank
2025-11-16 16:08:16 +01:00
parent b443c13ad8
commit 2a120e81f8

View File

@@ -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);