min-feat/ui/display-mode

2025-10-29: move to raylib ui
This commit is contained in:
Rick Lan
2025-03-31 12:21:50 +08:00
parent d9d3c13577
commit 6ad49bcda8
3 changed files with 67 additions and 1 deletions

View File

@@ -130,4 +130,5 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> 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"}},
};

View File

@@ -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.<br>MAIN+: ACC MAIN on = Display ON.<br>OP+: OP enabled = Display ON.<br>MAIN-: ACC MAIN on = Display OFF<br>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

View File

@@ -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: