This commit is contained in:
nayan
2025-12-07 11:18:30 -05:00
parent 6d6a91c318
commit f7a4dbc47f
3 changed files with 34 additions and 21 deletions
+2
View File
@@ -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()
+5 -5
View File
@@ -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
+27 -16
View File
@@ -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: