diff --git a/selfdrive/ui/sunnypilot/ui_state.py b/selfdrive/ui/sunnypilot/ui_state.py index 1db5ad613e..8debc86bec 100644 --- a/selfdrive/ui/sunnypilot/ui_state.py +++ b/selfdrive/ui/sunnypilot/ui_state.py @@ -7,6 +7,7 @@ See the LICENSE.md file in the root directory for more details. from cereal import messaging, custom from openpilot.common.params import Params from openpilot.sunnypilot.sunnylink.sunnylink_state import SunnylinkState +from openpilot.system.ui.sunnypilot.widgets.screen_saver import ScreenSaverSP class UIStateSP: @@ -18,6 +19,7 @@ class UIStateSP: ] self.sunnylink_state = SunnylinkState() + self.screensaver = ScreenSaverSP() def update(self) -> None: self.sunnylink_state.start() diff --git a/selfdrive/ui/ui_state.py b/selfdrive/ui/ui_state.py index 1d1817e1fb..b65134bcbd 100644 --- a/selfdrive/ui/ui_state.py +++ b/selfdrive/ui/ui_state.py @@ -11,7 +11,6 @@ from openpilot.common.swaglog import cloudlog from openpilot.selfdrive.ui.lib.prime_state import PrimeState from openpilot.system.ui.lib.application import gui_app from openpilot.system.hardware import HARDWARE, PC -from openpilot.system.ui.sunnypilot.widgets.screen_saver import ScreenSaverSP from openpilot.selfdrive.ui.sunnypilot.ui_state import UIStateSP @@ -270,18 +269,19 @@ class Device: def _set_awake(self, on: bool): if on != self._awake: - self._awake = on - def set_display_power(): + def set_display_power(power: bool): + self._awake = on cloudlog.debug(f"setting display power {int(on)}") HARDWARE.set_display_power(on) gui_app.set_should_render(on) screensaver_enabled = 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())) + ui_state.screensaver.initialize(dismiss_callback=lambda: set_display_power(False)) + gui_app.set_modal_overlay(ui_state.screensaver) else: - set_display_power() + set_display_power(on) # Global instance diff --git a/system/ui/sunnypilot/widgets/screen_saver.py b/system/ui/sunnypilot/widgets/screen_saver.py index 673c098482..ac7ce09f3f 100644 --- a/system/ui/sunnypilot/widgets/screen_saver.py +++ b/system/ui/sunnypilot/widgets/screen_saver.py @@ -11,39 +11,47 @@ from openpilot.system.ui.lib.text_measure import measure_text_cached from openpilot.system.ui.widgets import Widget class ScreenSaverSP(Widget): - def __init__(self, dismiss_callback: Callable): + def __init__(self): super().__init__() - self.dismiss_callback = dismiss_callback - self.screensaver_timeout = Params().get("ScreenSaverTimeout") - self.set_rect(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + self.screensaver_timeout = Params().get("ScreenSaverTimeout") self._is_mici = HARDWARE.get_device_type() == 'mici' or (HARDWARE.get_device_type() == "pc" and os.getenv("BIG") != "1") - self.text = "sunnypilot" - self.font_size = 50 if self._is_mici else 200 - self.font = gui_app.font(FontWeight.AUDIOWIDE) - 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 self.vx = 120.0 if self._is_mici else 300.0 self.vy = 70.0 if self._is_mici else 200.0 - self.color = rl.Color(0, 255, 0, 255) + self._hue = 150 + self.color = rl.color_from_hsv(self._hue, 1, 1) + self.text = "sunnypilot" + self.font_size = 50 if self._is_mici else 200 + self._start_time = None + + def initialize(self, dismiss_callback: Callable): + if self._start_time is None: + self._start_time = time.monotonic() + self.dismiss_callback = dismiss_callback self._dismiss = False def _handle_mouse_press(self, mouse_pos) -> bool: - self._dismiss = True + self._reset() return super()._handle_mouse_press(mouse_pos) + def _reset(self): + self._dismiss = True + self._start_time = None + def _update_state(self): super()._update_state() + self.font = gui_app.font(FontWeight.AUDIOWIDE) + 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 + if time.monotonic() - self._start_time > self.screensaver_timeout: - self._dismiss = True + self._reset() dt = rl.get_frame_time() @@ -70,7 +78,10 @@ class ScreenSaverSP(Widget): hit_y = True if hit_x or hit_y: - self.color = rl.color_from_hsv(rl.get_random_value(0, 360), 1, 1) + while not abs((new_hue := rl.get_random_value(0, 360)) - self._hue) >= 50: + pass + self._hue = new_hue + self.color = rl.color_from_hsv(self._hue, 1, 1) def _render(self, rect: rl.Rectangle): if self._dismiss: