diff --git a/selfdrive/ui/ui.py b/selfdrive/ui/ui.py index f2ca4e7700..4a1f03fb87 100755 --- a/selfdrive/ui/ui.py +++ b/selfdrive/ui/ui.py @@ -13,10 +13,9 @@ def main(): gui_app.init_window("UI") main_layout = MainLayout() main_layout.set_rect(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) - for showing_dialog in gui_app.render(): + for should_render in gui_app.render(): ui_state.update() - - if not showing_dialog: + if should_render: main_layout.render() diff --git a/selfdrive/ui/ui_state.py b/selfdrive/ui/ui_state.py index a947e5406b..b08b8ef28c 100644 --- a/selfdrive/ui/ui_state.py +++ b/selfdrive/ui/ui_state.py @@ -253,6 +253,7 @@ class Device: self._awake = on cloudlog.debug(f"setting display power {int(on)}") HARDWARE.set_display_power(on) + gui_app.set_should_render(on) # Global instance diff --git a/system/ui/lib/application.py b/system/ui/lib/application.py index 23fa8a6775..698ed3650b 100644 --- a/system/ui/lib/application.py +++ b/system/ui/lib/application.py @@ -156,6 +156,8 @@ class GuiApplication: self._mouse = MouseState(self._scale) self._mouse_events: list[MouseEvent] = [] + self._should_render = True + # Debug variables self._mouse_history: deque[MousePos] = deque(maxlen=MOUSE_THREAD_RATE) @@ -237,6 +239,9 @@ class GuiApplication: self._modal_overlay = ModalOverlay(overlay=overlay, callback=callback) + def set_should_render(self, should_render: bool): + self._should_render = should_render + def texture(self, asset_path: str, width: int | None = None, height: int | None = None, alpha_premultiply=False, keep_aspect_ratio=True): cache_key = f"{asset_path}_{width}_{height}_{alpha_premultiply}{keep_aspect_ratio}" @@ -322,6 +327,12 @@ class GuiApplication: # Store all mouse events for the current frame self._mouse_events = self._mouse.get_events() + # Skip rendering when screen is off + if not self._should_render: + time.sleep(1 / self._target_fps) + yield False + continue + if self._render_texture: rl.begin_texture_mode(self._render_texture) rl.clear_background(rl.BLACK) @@ -344,9 +355,9 @@ class GuiApplication: self._modal_overlay = ModalOverlay() if original_modal.callback is not None: original_modal.callback(result) - yield True - else: yield False + else: + yield True if self._render_texture: rl.end_texture_mode() diff --git a/system/ui/reset.py b/system/ui/reset.py index 8f6466ce46..3922c27aac 100755 --- a/system/ui/reset.py +++ b/system/ui/reset.py @@ -126,11 +126,10 @@ def main(): if mode == ResetMode.FORMAT: reset.start_reset() - for showing_dialog in gui_app.render(): - if showing_dialog: - continue - if not reset.render(rl.Rectangle(45, 200, gui_app.width - 90, gui_app.height - 245)): - break + for should_render in gui_app.render(): + if should_render: + if not reset.render(rl.Rectangle(45, 200, gui_app.width - 90, gui_app.height - 245)): + break if __name__ == "__main__": diff --git a/system/ui/setup.py b/system/ui/setup.py index da8c8d81fb..f6d2853fa0 100755 --- a/system/ui/setup.py +++ b/system/ui/setup.py @@ -432,10 +432,9 @@ def main(): try: gui_app.init_window("Setup", 20) setup = Setup() - for showing_dialog in gui_app.render(): - if showing_dialog: - continue - setup.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + for should_render in gui_app.render(): + if should_render: + setup.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) setup.close() except Exception as e: print(f"Setup error: {e}") diff --git a/system/ui/updater.py b/system/ui/updater.py index 5dd5a69c69..2e1a8687e1 100755 --- a/system/ui/updater.py +++ b/system/ui/updater.py @@ -161,10 +161,9 @@ def main(): try: gui_app.init_window("System Update") updater = Updater(updater_path, manifest_path) - for showing_dialog in gui_app.render(): - if showing_dialog: - continue - updater.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + for should_render in gui_app.render(): + if should_render: + updater.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) finally: # Make sure we clean up even if there's an error gui_app.close()