diff --git a/common/params_keys.h b/common/params_keys.h index b576f1a97..851055c1d 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -119,4 +119,5 @@ inline static std::unordered_map keys = { {"Version", PERSISTENT}, {"dp_device_last_log", CLEAR_ON_MANAGER_START}, {"dp_device_reset_conf", CLEAR_ON_MANAGER_START}, + {"dp_ui_display_mode", PERSISTENT}, }; diff --git a/selfdrive/ui/qt/offroad/dp_panel.cc b/selfdrive/ui/qt/offroad/dp_panel.cc index 548b02be5..786787657 100644 --- a/selfdrive/ui/qt/offroad/dp_panel.cc +++ b/selfdrive/ui/qt/offroad/dp_panel.cc @@ -173,6 +173,11 @@ void DPPanel::add_ui_toggles() { "", }, }; + std::vector display_off_mode_texts{tr("Std."), tr("MAIN+"), tr("OP+"), tr("MAIN-"), tr("OP-")}; + ButtonParamControl* display_off_mode_setting = new ButtonParamControl("dp_ui_display_mode", tr("Display Mode"), + tr("Std. - Stock behavior.\nMAIN+ - ACC MAIN on = Display ON.\nOP+ - OP enabled = Display ON.\nMAIN- - ACC MAIN on = Display OFF\nOP- - OP enabled = Display OFF."), + "", + display_off_mode_texts, 200); QWidget *label = nullptr; bool has_toggle = false; @@ -181,6 +186,8 @@ void DPPanel::add_ui_toggles() { if (param.isEmpty()) { label = new LabelControl(title, ""); addItem(label); + addItem(display_off_mode_setting); + has_toggle = true; continue; } diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index ec3d40961..6372c65e9 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -65,6 +65,7 @@ static void update_state(UIState *s) { void ui_update_params(UIState *s) { auto params = Params(); s->scene.is_metric = params.getBool("IsMetric"); + s->scene.display_mode = std::atoi(params.get("dp_ui_display_mode").c_str()); } void UIState::updateStatus() { @@ -172,6 +173,62 @@ void Device::updateBrightness(const UIState &s) { } } +// 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 +bool Device::applyDisplayMode(const UIState &s, int timeout) { + // standard + if (s.scene.display_mode == 0 || !s.scene.ignition) { + return (s.scene.ignition || timeout > 0); + } + + bool cruise_available = false; + bool cruise_enabled = false; + + auto &sm = *(s.sm); + if (sm.updated("carState")) { + auto cs = sm["carState"].getCarState().getCruiseState(); + cruise_available = cs.getAvailable(); + cruise_enabled = cs.getEnabled(); + } + + if (sm["selfdriveState"].getSelfdriveState().getAlertSize() != cereal::SelfdriveState::AlertSize::NONE) { + resetInteractiveTimeout(5); + return true; + } + + // 1 MAIN+ - ACC MAIN on = Display ON + if (s.scene.display_mode == 1 && cruise_available) { + return s.scene.ignition; + } + + // 2 OP+ - OP enabled = Display ON + if (s.scene.display_mode == 2 && cruise_enabled) { + return s.scene.ignition; + } + + // 3 MAIN- - ACC MAIN on = Display OFF + if (s.scene.display_mode == 3 && cruise_available) { + return false; + } + + // 4 OP- - OP enabled = Display OFF + if (s.scene.display_mode == 4 && cruise_enabled) { + return false; + } + + if (s.scene.display_mode >= 3) { + // 3,4 + return s.scene.ignition; + } else { + // 1,2 + return false; + } +} + void Device::updateWakefulness(const UIState &s) { bool ignition_just_turned_off = !s.scene.ignition && ignition_on; ignition_on = s.scene.ignition; @@ -182,7 +239,7 @@ void Device::updateWakefulness(const UIState &s) { emit interactiveTimeout(); } - setAwake(s.scene.ignition || interactive_timeout > 0); + setAwake(applyDisplayMode(s, interactive_timeout)); } UIState *uiState() { diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 6ff67cacd..c3aab1460 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -60,6 +60,7 @@ typedef struct UIScene { float light_sensor = -1; bool started, ignition, is_metric; uint64_t started_frame; + int display_mode; } UIScene; class UIState : public QObject { @@ -113,6 +114,7 @@ private: FirstOrderFilter brightness_filter; QFuture brightness_future; + bool applyDisplayMode(const UIState &s, int timeout); void updateBrightness(const UIState &s); void updateWakefulness(const UIState &s); void setAwake(bool on); diff --git a/system/manager/manager.py b/system/manager/manager.py index 9fe81947f..bb4128f3c 100755 --- a/system/manager/manager.py +++ b/system/manager/manager.py @@ -41,6 +41,7 @@ def manager_init() -> None: ("OpenpilotEnabledToggle", "1"), ("LongitudinalPersonality", str(log.LongitudinalPersonality.standard)), ("DisableLogging", "0"), + ("dp_ui_display_mode", "0"), ] if params.get_bool("RecordFrontLock"):