raylib ui: global Device class (#35573)

* device

* works

* clean up

* and

* more

* clean

* fixy

* cu

* slightly smaller
pull/35574/head
Shane Smiskol 2 months ago committed by GitHub
parent c460f5150f
commit 25f5ec46d9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 7
      selfdrive/ui/layouts/main.py
  2. 34
      selfdrive/ui/ui_state.py

@ -4,7 +4,7 @@ import cereal.messaging as messaging
from openpilot.selfdrive.ui.layouts.sidebar import Sidebar, SIDEBAR_WIDTH from openpilot.selfdrive.ui.layouts.sidebar import Sidebar, SIDEBAR_WIDTH
from openpilot.selfdrive.ui.layouts.home import HomeLayout from openpilot.selfdrive.ui.layouts.home import HomeLayout
from openpilot.selfdrive.ui.layouts.settings.settings import SettingsLayout, PanelType from openpilot.selfdrive.ui.layouts.settings.settings import SettingsLayout, PanelType
from openpilot.selfdrive.ui.ui_state import ui_state from openpilot.selfdrive.ui.ui_state import device, ui_state
from openpilot.selfdrive.ui.onroad.augmented_road_view import AugmentedRoadView from openpilot.selfdrive.ui.onroad.augmented_road_view import AugmentedRoadView
from openpilot.system.ui.lib.widget import Widget from openpilot.system.ui.lib.widget import Widget
@ -44,6 +44,7 @@ class MainLayout(Widget):
self._layouts[MainState.HOME]._setup_widget.set_open_settings_callback(lambda: self.open_settings(PanelType.FIREHOSE)) self._layouts[MainState.HOME]._setup_widget.set_open_settings_callback(lambda: self.open_settings(PanelType.FIREHOSE))
self._layouts[MainState.SETTINGS].set_callbacks(on_close=self._set_mode_for_state) self._layouts[MainState.SETTINGS].set_callbacks(on_close=self._set_mode_for_state)
self._layouts[MainState.ONROAD].set_callbacks(on_click=self._on_onroad_clicked) self._layouts[MainState.ONROAD].set_callbacks(on_click=self._on_onroad_clicked)
device.add_interactive_timeout_callback(self._set_mode_for_state)
def _update_layout_rects(self): def _update_layout_rects(self):
self._sidebar_rect = rl.Rectangle(self._rect.x, self._rect.y, SIDEBAR_WIDTH, self._rect.height) self._sidebar_rect = rl.Rectangle(self._rect.x, self._rect.y, SIDEBAR_WIDTH, self._rect.height)
@ -59,8 +60,10 @@ class MainLayout(Widget):
def _set_mode_for_state(self): def _set_mode_for_state(self):
if ui_state.started: if ui_state.started:
# Don't hide sidebar from interactive timeout
if self._current_mode != MainState.ONROAD:
self._sidebar.set_visible(False)
self._current_mode = MainState.ONROAD self._current_mode = MainState.ONROAD
self._sidebar.set_visible(False)
else: else:
self._current_mode = MainState.HOME self._current_mode = MainState.HOME
self._sidebar.set_visible(True) self._sidebar.set_visible(True)

@ -1,4 +1,6 @@
import pyray as rl import pyray as rl
import time
from collections.abc import Callable
from enum import Enum from enum import Enum
from cereal import messaging, log from cereal import messaging, log
from openpilot.common.params import Params, UnknownKeyName from openpilot.common.params import Params, UnknownKeyName
@ -76,6 +78,7 @@ class UIState:
self.sm.update(0) self.sm.update(0)
self._update_state() self._update_state()
self._update_status() self._update_status()
device.update()
def _update_state(self) -> None: def _update_state(self) -> None:
# Handle panda states updates # Handle panda states updates
@ -133,5 +136,36 @@ class UIState:
self.is_metric = False self.is_metric = False
class Device:
def __init__(self):
self._ignition = False
self._interaction_time: float = 0.0
self._interactive_timeout_callbacks: list[Callable] = []
self._prev_timed_out = False
self.reset_interactive_timeout()
def reset_interactive_timeout(self, timeout: int = -1) -> None:
if timeout == -1:
timeout = 10 if ui_state.ignition else 30
self._interaction_time = time.monotonic() + timeout
def add_interactive_timeout_callback(self, callback: Callable):
self._interactive_timeout_callbacks.append(callback)
def update(self):
# Handle interactive timeout
ignition_just_turned_off = not ui_state.ignition and self._ignition
self._ignition = ui_state.ignition
interaction_timeout = time.monotonic() > self._interaction_time
if ignition_just_turned_off or rl.is_mouse_button_down(rl.MouseButton.MOUSE_BUTTON_LEFT):
self.reset_interactive_timeout()
elif interaction_timeout and not self._prev_timed_out:
for callback in self._interactive_timeout_callbacks:
callback()
self._prev_timed_out = interaction_timeout
# Global instance # Global instance
ui_state = UIState() ui_state = UIState()
device = Device()

Loading…
Cancel
Save