From c08a66e2b2cce85145b32d91236be5fb157c1896 Mon Sep 17 00:00:00 2001 From: Eiswolf-BG <37225519+Eiswolf-BG@users.noreply.github.com> Date: Wed, 12 Aug 2026 23:22:38 +0200 Subject: [PATCH] Fix screensaver flicker: pause radar render/tick/status-line while active Radar rendering, sweep tick, and status-line updates ran regardless of screensaver state, so each aircraft-update cycle or sweep tick repainted the full radar over the dimmed starfield while the clock kept redrawing on top - visible as flicker between the two. Both drawing blocks now skip entirely while screensaverShowing is true; updateProximityAlert() (LED/sound only, no display writes) keeps running unaffected. Co-Authored-By: Claude Sonnet 5 --- src/main.cpp | 48 ++++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 609ced0..7103e77 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -681,14 +681,24 @@ void loop() { } } - if (forceRedraw || millis() - lastPollMs >= POLL_INTERVAL_MS) { - lastPollMs = millis(); - uint32_t currentVersion = AircraftTable::version(); - if (forceRedraw || currentVersion != lastRenderedVersion) { - lastRenderedVersion = currentVersion; - forceRedraw = false; - RadarScreen::render(tft, CONTENT_TOP); - lastSweepMs = millis(); + // Waehrend der Ruhebildschirm aktiv ist (screensaverShowing), duerfen + // Radar-Rendering/Sweep/Statuszeile den Bildschirm NICHT mehr + // ueberschreiben - sonst wuerde der naechste Aircraft-Update-Zyklus + // (oder der Sweep-Tick) den gedimmten Sternenhimmel jederzeit wieder mit + // dem vollen Radarbild uebermalen, waehrend gleichzeitig + // drawScreensaverClock() im Sekundentakt seinen Streifen drueberzeichnet + // - das Ergebnis war sichtbares Geflacker zwischen Radarbild und Uhr + // statt eines ruhigen Sternenhimmels. + if (!screensaverShowing) { + if (forceRedraw || millis() - lastPollMs >= POLL_INTERVAL_MS) { + lastPollMs = millis(); + uint32_t currentVersion = AircraftTable::version(); + if (forceRedraw || currentVersion != lastRenderedVersion) { + lastRenderedVersion = currentVersion; + forceRedraw = false; + RadarScreen::render(tft, CONTENT_TOP); + lastSweepMs = millis(); + } } } @@ -696,17 +706,19 @@ void loop() { RadarScreen::updateProximityAlert(nowMs); - if (nowMs - lastSweepMs >= SWEEP_TICK_MS) { - uint32_t deltaMs = nowMs - lastSweepMs; - lastSweepMs = nowMs; - RadarScreen::tick(tft, CONTENT_TOP, deltaMs); - updateEmergencyBanner(nowMs); - } + if (!screensaverShowing) { + if (nowMs - lastSweepMs >= SWEEP_TICK_MS) { + uint32_t deltaMs = nowMs - lastSweepMs; + lastSweepMs = nowMs; + RadarScreen::tick(tft, CONTENT_TOP, deltaMs); + updateEmergencyBanner(nowMs); + } - if (nowMs - lastStatusLineMs >= STATUS_LINE_UPDATE_MS) { - lastStatusLineMs = nowMs; - updateStatusLine(); - updateNightDimming(); + if (nowMs - lastStatusLineMs >= STATUS_LINE_UPDATE_MS) { + lastStatusLineMs = nowMs; + updateStatusLine(); + updateNightDimming(); + } } uint8_t timeoutMin = SettingsStore::screenTimeoutMinutes();