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
This commit is contained in:
Adolfo Reyna
2026-07-11 21:40:18 -04:00
parent 3629ffef2c
commit 50d86de4a3
@@ -206,35 +206,38 @@ void DisplayIdleService::tick() {
auto display = getDisplay(); auto display = getDisplay();
bool supportsBacklight = display != nullptr && display->supportsBacklightDuty(); bool supportsBacklight = display != nullptr && display->supportsBacklightDuty();
if (supportsBacklight) { if (!cachedDisplaySettings.backlightTimeoutEnabled || cachedDisplaySettings.backlightTimeoutMs == 0) {
if (!cachedDisplaySettings.backlightTimeoutEnabled || cachedDisplaySettings.backlightTimeoutMs == 0) { // Timeout disabled (Never): ensure we restore if we were dimmed, regardless of display type
if (displayDimmed && !isMcpActive) { if (displayDimmed && !isMcpActive) {
if (supportsBacklight && display != nullptr) {
display->setBacklightDuty(cachedDisplaySettings.backlightDuty); display->setBacklightDuty(cachedDisplaySettings.backlightDuty);
displayDimmed = false;
} }
} else { displayDimmed = false;
bool charging_blocks = cachedDisplaySettings.disableScreensaverWhenCharging && isDeviceCharging(); }
} else {
bool charging_blocks = cachedDisplaySettings.disableScreensaverWhenCharging && isDeviceCharging();
if (!displayDimmed && inactive_ms >= cachedDisplaySettings.backlightTimeoutMs) { if (!displayDimmed && inactive_ms >= cachedDisplaySettings.backlightTimeoutMs) {
if (charging_blocks) { if (charging_blocks) {
// Skip screensaver while charging // Skip screensaver while charging
} else { } else {
if (!lvgl::lock(100)) { if (!lvgl::lock(100)) {
return; // Retry on next tick return; // Retry on next tick
} }
activateScreensaver(); activateScreensaver();
lvgl::unlock(); lvgl::unlock();
if (cachedDisplaySettings.screensaverType == settings::display::ScreensaverType::None) { if (cachedDisplaySettings.screensaverType == settings::display::ScreensaverType::None) {
if (supportsBacklight && display != nullptr) {
display->setBacklightDuty(0); 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();
} }
} }
} }