From 3dc45554d7709b277ac1f8d350391d780ea23a3d Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 5 Feb 2021 22:13:32 -0800 Subject: [PATCH] UI: make onroad/offroad transition more robust (#20030) * make onroad/offroad transition more robust * fix up driver view * check other started Co-authored-by: Comma Device --- selfdrive/ui/ui.cc | 50 ++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index 450fe15174..3946ec4be8 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -180,8 +180,10 @@ static void update_sockets(UIState *s) { } if (sm.updated("driverMonitoringState")) { scene.dmonitoring_state = sm["driverMonitoringState"].getDriverMonitoringState(); - scene.frontview = !s->ignition; - } else if (scene.frontview && (sm.frame - sm.rcv_frame("driverMonitoringState")) > UI_FREQ/2) { + if(!s->scene.frontview && !s->ignition) { + read_param(&s->scene.frontview, "IsDriverViewEnabled"); + } + } else if ((sm.frame - sm.rcv_frame("driverMonitoringState")) > UI_FREQ/2) { scene.frontview = false; } if (sm.updated("sensorEvents")) { @@ -195,11 +197,10 @@ static void update_sockets(UIState *s) { } } } + s->started = s->scene.thermal.getStarted() || s->scene.frontview; } static void update_alert(UIState *s) { - if (!s->started || s->scene.frontview) return; - UIScene &scene = s->scene; if (s->sm->updated("controlsState")) { auto alert_sound = scene.controls_state.getAlertSound(); @@ -218,7 +219,7 @@ static void update_alert(UIState *s) { } // Handle controls timeout - if ((s->sm->frame - s->started_frame) > 10 * UI_FREQ) { + if (s->scene.thermal.getStarted() && (s->sm->frame - s->started_frame) > 10 * UI_FREQ) { const uint64_t cs_frame = s->sm->rcv_frame("controlsState"); if (cs_frame < s->started_frame) { // car is started, but controlsState hasn't been seen at all @@ -256,8 +257,6 @@ static void update_params(UIState *s) { static void update_vision(UIState *s) { if (!s->vipc_client->connected && s->started) { - s->vipc_client = s->scene.frontview ? s->vipc_client_front : s->vipc_client_rear; - if (s->vipc_client->connect(false)){ ui_init_vision(s); } @@ -272,8 +271,6 @@ static void update_vision(UIState *s) { } static void update_status(UIState *s) { - s->started = s->scene.thermal.getStarted() || s->scene.frontview; - if (s->started && s->sm->updated("controlsState")) { auto alert_status = s->scene.controls_state.getAlertStatus(); if (alert_status == cereal::ControlsState::AlertStatus::USER_PROMPT) { @@ -286,27 +283,32 @@ static void update_status(UIState *s) { } // Handle onroad/offroad transition - if (!s->started && s->status != STATUS_OFFROAD) { - s->status = STATUS_OFFROAD; - s->active_app = cereal::UiLayoutState::App::HOME; - s->sidebar_collapsed = false; - s->sound->stop(); - s->vipc_client->connected = false; - } else if (s->started && s->status == STATUS_OFFROAD) { - s->status = STATUS_DISENGAGED; - s->started_frame = s->sm->frame; - - read_param(&s->scene.is_rhd, "IsRHD"); - s->active_app = cereal::UiLayoutState::App::NONE; - s->sidebar_collapsed = true; - s->scene.alert_size = cereal::ControlsState::AlertSize::NONE; + static bool started_prev = false; + if (s->started != started_prev) { + if (s->started) { + s->status = STATUS_DISENGAGED; + s->started_frame = s->sm->frame; + + read_param(&s->scene.is_rhd, "IsRHD"); + s->active_app = cereal::UiLayoutState::App::NONE; + s->sidebar_collapsed = true; + s->scene.alert_size = cereal::ControlsState::AlertSize::NONE; + s->vipc_client = s->scene.frontview ? s->vipc_client_front : s->vipc_client_rear; + } else { + s->status = STATUS_OFFROAD; + s->active_app = cereal::UiLayoutState::App::HOME; + s->sidebar_collapsed = false; + s->sound->stop(); + s->vipc_client->connected = false; + } } + started_prev = s->started; } void ui_update(UIState *s) { update_params(s); update_sockets(s); - update_alert(s); update_status(s); + update_alert(s); update_vision(s); }