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 <device@comma.ai>
pull/20034/head
Adeeb Shihadeh 4 years ago committed by GitHub
parent 53bb7e3e10
commit 3dc45554d7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 36
      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,13 +283,9 @@ 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) {
static bool started_prev = false;
if (s->started != started_prev) {
if (s->started) {
s->status = STATUS_DISENGAGED;
s->started_frame = s->sm->frame;
@ -300,13 +293,22 @@ static void update_status(UIState *s) {
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);
}

Loading…
Cancel
Save