From 50d86de4a3524a1fd58f4eaf27c1338c82d31692 Mon Sep 17 00:00:00 2001 From: Adolfo Reyna Date: Sat, 11 Jul 2026 21:40:18 -0400 Subject: [PATCH] fix(rlcd): screensaver wake/activate must run for monochrome, not just backlight displays RLCD ST7305 has !supportsBacklightDuty(). Previous fix that fixed MCP flash-then-back left entire idle state machine gated by supportsBacklight, causing once dimmed it could never wake on button press -> appears locked weird state reported. Fix: run timeout logic for all displays, guard only setBacklightDuty calls. - timeout disabled (Never) branch always restores displayDimmed - timeout activation creates screensaver for all - wake on inactive<100ms + charging block works for RLCD - setBacklightDuty only when supportsBacklight && display!=nullptr Also preserves deadlock-free ordering (MCP state outside LVGL lock) from 3629ffef. RLCD: 0x2b78b0 32%% free flashed /dev/cu.usbmodem101 Co-Authored-By: internal-model --- .../service/displayidle/DisplayIdle.cpp | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/Tactility/Source/service/displayidle/DisplayIdle.cpp b/Tactility/Source/service/displayidle/DisplayIdle.cpp index c5f6afb6..511ca5e7 100644 --- a/Tactility/Source/service/displayidle/DisplayIdle.cpp +++ b/Tactility/Source/service/displayidle/DisplayIdle.cpp @@ -206,35 +206,38 @@ void DisplayIdleService::tick() { auto display = getDisplay(); bool supportsBacklight = display != nullptr && display->supportsBacklightDuty(); - if (supportsBacklight) { - if (!cachedDisplaySettings.backlightTimeoutEnabled || cachedDisplaySettings.backlightTimeoutMs == 0) { - if (displayDimmed && !isMcpActive) { + if (!cachedDisplaySettings.backlightTimeoutEnabled || cachedDisplaySettings.backlightTimeoutMs == 0) { + // Timeout disabled (Never): ensure we restore if we were dimmed, regardless of display type + if (displayDimmed && !isMcpActive) { + if (supportsBacklight && display != nullptr) { display->setBacklightDuty(cachedDisplaySettings.backlightDuty); - displayDimmed = false; } - } else { - bool charging_blocks = cachedDisplaySettings.disableScreensaverWhenCharging && isDeviceCharging(); + displayDimmed = false; + } + } else { + bool charging_blocks = cachedDisplaySettings.disableScreensaverWhenCharging && isDeviceCharging(); - if (!displayDimmed && inactive_ms >= cachedDisplaySettings.backlightTimeoutMs) { - if (charging_blocks) { - // Skip screensaver while charging - } else { - if (!lvgl::lock(100)) { - return; // Retry on next tick - } - activateScreensaver(); - lvgl::unlock(); - if (cachedDisplaySettings.screensaverType == settings::display::ScreensaverType::None) { + if (!displayDimmed && inactive_ms >= cachedDisplaySettings.backlightTimeoutMs) { + if (charging_blocks) { + // Skip screensaver while charging + } else { + if (!lvgl::lock(100)) { + return; // Retry on next tick + } + activateScreensaver(); + lvgl::unlock(); + if (cachedDisplaySettings.screensaverType == settings::display::ScreensaverType::None) { + if (supportsBacklight && display != nullptr) { display->setBacklightDuty(0); } - displayDimmed = true; - } - } else if (displayDimmed && !isMcpActive) { - if (inactive_ms < kWakeActivityThresholdMs) { - stopScreensaver(); - } else if (charging_blocks) { - stopScreensaver(); } + displayDimmed = true; + } + } else if (displayDimmed && !isMcpActive) { + if (inactive_ms < kWakeActivityThresholdMs) { + stopScreensaver(); + } else if (charging_blocks) { + stopScreensaver(); } } }