From 6ad49bcda842c4da0c3ed2b8404085b8fcc82ce3 Mon Sep 17 00:00:00 2001 From: Rick Lan Date: Mon, 31 Mar 2025 12:21:50 +0800 Subject: [PATCH] min-feat/ui/display-mode 2025-10-29: move to raylib ui --- common/params_keys.h | 1 + .../ui/layouts/settings/dragonpilot.py | 8 +++ selfdrive/ui/ui_state.py | 59 ++++++++++++++++++- 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/common/params_keys.h b/common/params_keys.h index 65eadb23d..75c24c05a 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -130,4 +130,5 @@ inline static std::unordered_map keys = { {"Version", {PERSISTENT, STRING}}, {"dp_dev_last_log", {CLEAR_ON_ONROAD_TRANSITION, STRING}}, {"dp_dev_reset_conf", {CLEAR_ON_MANAGER_START, BOOL, "0"}}, + {"dp_ui_display_mode", {PERSISTENT, INT, "0"}}, }; diff --git a/dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py b/dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py index 3964edca3..e912ac76f 100644 --- a/dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py +++ b/dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py @@ -66,6 +66,14 @@ class DragonpilotLayout(Widget): def _device_toggles(self): self._toggles["title_dev"] = simple_item(title=lambda: tr("### Device ###")) + self._toggles["dp_ui_display_mode"] = text_spin_button_item( + title=lambda: tr("Display Mode"), + callback=lambda val: self._params.put("dp_ui_display_mode", val), + options=["Std.", "MAIN+", "OP+", "MAIN-", "OP-"], + initial_index=int(self._params.get("dp_ui_display_mode") or 0), + description=lambda: tr("Std.: Stock behavior.
MAIN+: ACC MAIN on = Display ON.
OP+: OP enabled = Display ON.
MAIN-: ACC MAIN on = Display OFF
OP-: OP enabled = Display OFF."), + ) + def _reset_dp_conf(self): def reset_dp_conf(result: int): # Check engaged again in case it changed while the dialog was open diff --git a/selfdrive/ui/ui_state.py b/selfdrive/ui/ui_state.py index dab01f924..248c9e6d9 100644 --- a/selfdrive/ui/ui_state.py +++ b/selfdrive/ui/ui_state.py @@ -79,6 +79,9 @@ class UIState: self._offroad_transition_callbacks: list[Callable[[], None]] = [] self._engaged_transition_callbacks: list[Callable[[], None]] = [] + # dp + self.dp_ui_display_mode = 0 + self.update_params() def add_offroad_transition_callback(self, callback: Callable[[], None]): @@ -134,6 +137,11 @@ class UIState: self.is_metric = self.params.get_bool("IsMetric") + # dp + self.dp_ui_display_mode = int(self.params.get("dp_ui_display_mode") or 0) + self.dp_ui_display_mode_cruise_available = False + self.dp_ui_display_mode_cruise_enabled = False + def _update_status(self) -> None: if self.started and self.sm.updated["selfdriveState"]: ss = self.sm["selfdriveState"] @@ -160,6 +168,11 @@ class UIState: for callback in self._offroad_transition_callbacks: callback() + # dp + if self.sm.updated["carState"]: + self.dp_ui_display_mode_cruise_available = self.sm["carState"].cruiseState.available + self.dp_ui_display_mode_cruise_enabled = self.sm["carState"].cruiseState.enabled + self._started_prev = self.started def update_params(self) -> None: @@ -232,6 +245,48 @@ class Device: self._brightness_thread.start() self._last_brightness = brightness + # // Display Mode + # // 0 Std. - Stock behavior. + # // 1 MAIN+ - ACC MAIN on = Display ON + # // 2 OP+ - OP enabled = Display ON + # // 3 MAIN- - ACC MAIN on = Display OFF + # // 4 OP- - OP enabled = Display OFF + def ignore_state_ovrride(self, ignition): + # 0 stock behaviour or ignition is off + if ui_state.dp_ui_display_mode == 0 or not ignition: + return ignition + + # 1 MAIN+ - ACC MAIN on = Display ON + if ui_state.dp_ui_display_mode == 1: + if ui_state.dp_ui_display_mode_cruise_available: + return True + else: + return False + + # 2 OP+ - OP enabled = Display ON + if ui_state.dp_ui_display_mode == 2: + if ui_state.dp_ui_display_mode_cruise_enabled: + return True + else: + return False + + # 3 MAIN- - ACC MAIN on = Display OFF + if ui_state.dp_ui_display_mode == 3: + if ui_state.dp_ui_display_mode_cruise_available: + return False + else: + return True + + # 4 OP- - OP enabled = Display OFF + if ui_state.dp_ui_display_mode == 4: + if ui_state.dp_ui_display_mode_cruise_enabled: + return False + else: + return True + + # oops + return ignition + def _update_wakefulness(self): # Handle interactive timeout ignition_just_turned_off = not ui_state.ignition and self._ignition @@ -246,7 +301,9 @@ class Device: callback() self._prev_timed_out = interaction_timeout - self._set_awake(ui_state.ignition or not interaction_timeout) + ignition = self.ignore_state_ovrride(ui_state.ignition) + + self._set_awake(ignition or not interaction_timeout) def _set_awake(self, on: bool): if on != self._awake: