From 465daf323c5bbde7758ebadca2c08d1d4305dfe9 Mon Sep 17 00:00:00 2001 From: nayan Date: Thu, 4 Dec 2025 15:03:31 -0500 Subject: [PATCH] add param, timeout --- common/params_keys.h | 2 ++ selfdrive/ui/ui_state.py | 11 ++++++++--- system/ui/sunnypilot/widgets/screen_saver.py | 13 ++++++++++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/common/params_keys.h b/common/params_keys.h index 38578d7ddc..14858a378d 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -170,6 +170,8 @@ inline static std::unordered_map keys = { {"QuickBootToggle", {PERSISTENT | BACKUP, BOOL, "0"}}, {"QuietMode", {PERSISTENT | BACKUP, BOOL, "0"}}, {"RainbowMode", {PERSISTENT | BACKUP, BOOL, "0"}}, + {"ScreenSaverEnabled", {PERSISTENT | BACKUP, BOOL, "0"}}, + {"ScreenSaverTimeout", {PERSISTENT | BACKUP, INT, "300"}}, {"ShowAdvancedControls", {PERSISTENT | BACKUP, BOOL, "0"}}, {"ShowTurnSignals", {PERSISTENT | BACKUP, BOOL, "0"}}, {"StandstillTimer", {PERSISTENT | BACKUP, BOOL, "0"}}, diff --git a/selfdrive/ui/ui_state.py b/selfdrive/ui/ui_state.py index 0e432eade6..d75cd25336 100644 --- a/selfdrive/ui/ui_state.py +++ b/selfdrive/ui/ui_state.py @@ -271,13 +271,18 @@ class Device: def _set_awake(self, on: bool): if on != self._awake: self._awake = on - if gui_app.sunnypilot_ui() and not on: - gui_app.set_modal_overlay(ScreenSaverSP()) - else: + + def set_display_power(): cloudlog.debug(f"setting display power {int(on)}") HARDWARE.set_display_power(on) gui_app.set_should_render(on) + screensaver_enabled = True #ui_state.params.get_bool("ScreenSaverEnabled") + if gui_app.sunnypilot_ui() and not on and screensaver_enabled: + gui_app.set_modal_overlay(ScreenSaverSP(dismiss_callback=lambda: set_display_power())) + else: + set_display_power() + # Global instance ui_state = UIState() diff --git a/system/ui/sunnypilot/widgets/screen_saver.py b/system/ui/sunnypilot/widgets/screen_saver.py index 769817b094..b0a2a6b5b4 100644 --- a/system/ui/sunnypilot/widgets/screen_saver.py +++ b/system/ui/sunnypilot/widgets/screen_saver.py @@ -1,16 +1,22 @@ import os +import time +from collections.abc import Callable import pyray as rl +from openpilot.common.params import Params from openpilot.system.hardware import HARDWARE from openpilot.system.ui.lib.application import gui_app, FontWeight from openpilot.system.ui.lib.text_measure import measure_text_cached from openpilot.system.ui.widgets import Widget +SCREENSAVER_TIMEOUT = Params().get("ScreenSaverTimeout") or 5 class ScreenSaverSP(Widget): - def __init__(self): + def __init__(self, dismiss_callback: Callable): super().__init__() + self.dismiss_callback = dismiss_callback + self.set_rect(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) self._is_mici = HARDWARE.get_device_type() == 'mici' or (HARDWARE.get_device_type() == "pc" and os.getenv("BIG") != "1") @@ -20,6 +26,7 @@ class ScreenSaverSP(Widget): text_size = measure_text_cached(self.font, self.text, self.font_size, 0) self.logo_width = text_size.x self.logo_height = text_size.y + self._start_time = time.monotonic() self.x = 0.0 self.y = 100.0 @@ -36,6 +43,9 @@ class ScreenSaverSP(Widget): def _update_state(self): super()._update_state() + if time.monotonic() - self._start_time > SCREENSAVER_TIMEOUT: + self._dismiss = True + dt = rl.get_frame_time() self.x += self.vx * dt @@ -65,6 +75,7 @@ class ScreenSaverSP(Widget): def _render(self, rect: rl.Rectangle): if self._dismiss: + self.dismiss_callback() return 0 self.set_rect(rect)