diff --git a/selfdrive/ui/ui_state.py b/selfdrive/ui/ui_state.py index 3bcdfa10c..644e6e843 100644 --- a/selfdrive/ui/ui_state.py +++ b/selfdrive/ui/ui_state.py @@ -210,6 +210,8 @@ class Device: self._last_brightness: int = 0 self._brightness_filter = FirstOrderFilter(BACKLIGHT_OFFROAD, 10.00, 1 / gui_app.target_fps) self._brightness_thread: threading.Thread | None = None + self._brightness_event = threading.Event() + self._brightness_target: int = 0 @property def awake(self) -> bool: @@ -235,6 +237,8 @@ class Device: self._interactive_timeout_callbacks.append(callback) def update(self): + self._start_brightness_thread() # start thread after manager forks ui + # do initial reset if self._interaction_time <= 0: self._reset_interactive_timeout() @@ -242,6 +246,17 @@ class Device: self._update_brightness() self._update_wakefulness() + def _start_brightness_thread(self): + if self._brightness_thread is None or not self._brightness_thread.is_alive(): + self._brightness_thread = threading.Thread(target=self._brightness_worker, daemon=True) + self._brightness_thread.start() + + def _brightness_worker(self): + while True: + self._brightness_event.wait() + self._brightness_event.clear() + HARDWARE.set_screen_brightness(self._brightness_target) + def set_offroad_brightness(self, brightness: int | None): if brightness is None: brightness = BACKLIGHT_OFFROAD @@ -266,10 +281,9 @@ class Device: brightness = 0 if brightness != self._last_brightness: - if self._brightness_thread is None or not self._brightness_thread.is_alive(): - self._brightness_thread = threading.Thread(target=HARDWARE.set_screen_brightness, args=(brightness,)) - self._brightness_thread.start() - self._last_brightness = brightness + self._brightness_target = brightness + self._brightness_event.set() + self._last_brightness = brightness def _update_wakefulness(self): # Handle interactive timeout