diff --git a/selfdrive/ui/android/ui.cc b/selfdrive/ui/android/ui.cc index c2fc74a358..1a917efba0 100644 --- a/selfdrive/ui/android/ui.cc +++ b/selfdrive/ui/android/ui.cc @@ -30,14 +30,14 @@ static void handle_display_state(UIState *s, bool user_input) { constexpr float accel_samples = 5*UI_FREQ; static float accel_prev = 0., gyro_prev = 0.; - bool should_wake = s->started || s->ignition || user_input; + bool should_wake = s->scene.started || s->scene.ignition || user_input; if (!should_wake) { // tap detection while display is off - bool accel_trigger = abs(s->accel_sensor - accel_prev) > 0.2; - bool gyro_trigger = abs(s->gyro_sensor - gyro_prev) > 0.15; + bool accel_trigger = abs(s->scene.accel_sensor - accel_prev) > 0.2; + bool gyro_trigger = abs(s->scene.gyro_sensor - gyro_prev) > 0.15; should_wake = accel_trigger && gyro_trigger; - gyro_prev = s->gyro_sensor; - accel_prev = (accel_prev * (accel_samples - 1) + s->accel_sensor) / accel_samples; + gyro_prev = s->scene.gyro_sensor; + accel_prev = (accel_prev * (accel_samples - 1) + s->scene.accel_sensor) / accel_samples; } // determine desired state @@ -62,7 +62,7 @@ static void handle_display_state(UIState *s, bool user_input) { } static void handle_vision_touch(UIState *s, int touch_x, int touch_y) { - if (s->started && (touch_x >= s->viz_rect.x - bdr_s) + if (s->scene.started && (touch_x >= s->viz_rect.x - bdr_s) && (s->active_app != cereal::UiLayoutState::App::SETTINGS)) { if (!s->scene.driver_view) { s->sidebar_collapsed = !s->sidebar_collapsed; @@ -77,7 +77,7 @@ static void handle_sidebar_touch(UIState *s, int touch_x, int touch_y) { if (settings_btn.ptInRect(touch_x, touch_y)) { s->active_app = cereal::UiLayoutState::App::SETTINGS; } else if (home_btn.ptInRect(touch_x, touch_y)) { - if (s->started) { + if (s->scene.started) { s->active_app = cereal::UiLayoutState::App::NONE; s->sidebar_collapsed = true; } else { @@ -139,7 +139,7 @@ int main(int argc, char* argv[]) { s->sound->setVolume(MIN_VOLUME); while (!do_exit) { - if (!s->started) { + if (!s->scene.started) { util::sleep_for(50); } double u1 = millis_since_boot(); @@ -164,7 +164,7 @@ int main(int argc, char* argv[]) { s->sound->setVolume(fmin(MAX_VOLUME, MIN_VOLUME + s->scene.car_state.getVEgo() / 5)); // set brightness - float clipped_brightness = fmin(512, (s->light_sensor*brightness_m) + brightness_b); + float clipped_brightness = fmin(512, (s->scene.light_sensor*brightness_m) + brightness_b); smooth_brightness = fmin(255, clipped_brightness * 0.01 + smooth_brightness * 0.99); ui_set_brightness(s, (int)smooth_brightness); diff --git a/selfdrive/ui/paint.cc b/selfdrive/ui/paint.cc index e0b67336bd..6d3606cffa 100644 --- a/selfdrive/ui/paint.cc +++ b/selfdrive/ui/paint.cc @@ -169,7 +169,7 @@ static void ui_draw_world(UIState *s) { ui_draw_vision_lane_lines(s); // Draw lead indicators if openpilot is handling longitudinal - if (s->longitudinal_control) { + if (s->scene.longitudinal_control) { if (scene->lead_data[0].getStatus()) { draw_lead(s, 0); } @@ -184,7 +184,7 @@ static void ui_draw_vision_maxspeed(UIState *s) { const int SET_SPEED_NA = 255; float maxspeed = s->scene.controls_state.getVCruise(); const bool is_cruise_set = maxspeed != 0 && maxspeed != SET_SPEED_NA; - if (is_cruise_set && !s->is_metric) { maxspeed *= 0.6225; } + if (is_cruise_set && !s->scene.is_metric) { maxspeed *= 0.6225; } const Rect rect = {s->viz_rect.x + (bdr_s * 2), int(s->viz_rect.y + (bdr_s * 1.5)), 184, 202}; ui_fill_rect(s->vg, rect, COLOR_BLACK_ALPHA(100), 30.); @@ -201,11 +201,11 @@ static void ui_draw_vision_maxspeed(UIState *s) { } static void ui_draw_vision_speed(UIState *s) { - const float speed = std::max(0.0, s->scene.car_state.getVEgo() * (s->is_metric ? 3.6 : 2.2369363)); + const float speed = std::max(0.0, s->scene.car_state.getVEgo() * (s->scene.is_metric ? 3.6 : 2.2369363)); const std::string speed_str = std::to_string((int)std::nearbyint(speed)); nvgTextAlign(s->vg, NVG_ALIGN_CENTER | NVG_ALIGN_BASELINE); ui_draw_text(s, s->viz_rect.centerX(), 240, speed_str.c_str(), 96 * 2.5, COLOR_WHITE, "sans-bold"); - ui_draw_text(s, s->viz_rect.centerX(), 320, s->is_metric ? "km/h" : "mph", 36 * 2.5, COLOR_WHITE_ALPHA(200), "sans-regular"); + ui_draw_text(s, s->viz_rect.centerX(), 320, s->scene.is_metric ? "km/h" : "mph", 36 * 2.5, COLOR_WHITE_ALPHA(200), "sans-regular"); } static void ui_draw_vision_event(UIState *s) { @@ -375,7 +375,7 @@ void ui_draw(UIState *s) { s->viz_rect.w -= sbr_w; } - const bool draw_alerts = s->started && s->active_app == cereal::UiLayoutState::App::NONE; + const bool draw_alerts = s->scene.started && s->active_app == cereal::UiLayoutState::App::NONE; const bool draw_vision = draw_alerts && s->vipc_client->connected; // GL drawing functions diff --git a/selfdrive/ui/qt/api.cc b/selfdrive/ui/qt/api.cc index 52343b59f3..a070d8bc36 100644 --- a/selfdrive/ui/qt/api.cc +++ b/selfdrive/ui/qt/api.cc @@ -96,7 +96,7 @@ RequestRepeater::RequestRepeater(QWidget* parent, QString requestURL, int period void RequestRepeater::sendRequest(QString requestURL, QVector> payloads){ // No network calls onroad - if(GLWindow::ui_state.started){ + if(GLWindow::ui_state.scene.started){ return; } if (!active || (!GLWindow::ui_state.awake && disableWithScreen)) { diff --git a/selfdrive/ui/qt/home.cc b/selfdrive/ui/qt/home.cc index c44b5a5aab..3c82c8e6cf 100644 --- a/selfdrive/ui/qt/home.cc +++ b/selfdrive/ui/qt/home.cc @@ -160,7 +160,7 @@ void HomeWindow::setVisibility(bool offroad) { void HomeWindow::mousePressEvent(QMouseEvent* e) { UIState* ui_state = &glWindow->ui_state; - if (GLWindow::ui_state.started && GLWindow::ui_state.scene.driver_view) { + if (GLWindow::ui_state.scene.started && GLWindow::ui_state.scene.driver_view) { Params().write_db_value("IsDriverViewEnabled", "0", 1); return; } @@ -173,7 +173,7 @@ void HomeWindow::mousePressEvent(QMouseEvent* e) { } // Vision click - if (ui_state->started && (e->x() >= ui_state->viz_rect.x - bdr_s)) { + if (ui_state->scene.started && (e->x() >= ui_state->viz_rect.x - bdr_s)) { ui_state->sidebar_collapsed = !ui_state->sidebar_collapsed; } } @@ -182,7 +182,7 @@ static void handle_display_state(UIState* s, bool user_input) { static int awake_timeout = 0; // Somehow this only gets called on program start awake_timeout = std::max(awake_timeout - 1, 0); - if (user_input || s->ignition || s->started) { + if (user_input || s->scene.ignition || s->scene.started) { s->awake = true; awake_timeout = 30 * UI_FREQ; } else if (awake_timeout == 0) { @@ -240,7 +240,7 @@ void GLWindow::backlightUpdate() { // Update brightness float k = (BACKLIGHT_DT / BACKLIGHT_TS) / (1.0f + BACKLIGHT_DT / BACKLIGHT_TS); - float clipped_brightness = std::min(1023.0f, (ui_state.light_sensor * brightness_m) + brightness_b); + float clipped_brightness = std::min(1023.0f, (ui_state.scene.light_sensor * brightness_m) + brightness_b); smooth_brightness = clipped_brightness * k + smooth_brightness * (1.0f - k); int brightness = smooth_brightness; @@ -257,8 +257,8 @@ void GLWindow::timerUpdate() { makeCurrent(); } - if (ui_state.started != onroad) { - onroad = ui_state.started; + if (ui_state.scene.started != onroad) { + onroad = ui_state.scene.started; emit offroadTransition(!onroad); // Change timeout to 0 when onroad, this will call timerUpdate continously. diff --git a/selfdrive/ui/sidebar.cc b/selfdrive/ui/sidebar.cc index 6e936342b6..3f8771a388 100644 --- a/selfdrive/ui/sidebar.cc +++ b/selfdrive/ui/sidebar.cc @@ -123,7 +123,7 @@ static void draw_panda_metric(UIState *s) { panda_message = "NO\nPANDA"; } #ifdef QCOM2 - else if (s->started) { + else if (s->scene.started) { panda_severity = s->scene.gpsOK ? 0 : 1; panda_message = util::string_format("SAT CNT\n%d", s->scene.satelliteCount); } diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index 84472401c1..f1ae604898 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -57,7 +57,7 @@ void ui_init(UIState *s) { s->sm = new SubMaster({"modelV2", "controlsState", "uiLayoutState", "liveCalibration", "radarState", "deviceState", "roadCameraState", "liveLocationKalman", "pandaState", "carParams", "driverState", "driverMonitoringState", "sensorEvents", "carState", "ubloxGnss"}); - s->started = false; + s->scene.started = false; s->status = STATUS_OFFROAD; s->fb = std::make_unique("ui", 0, true, &s->fb_w, &s->fb_h); @@ -137,7 +137,7 @@ static void update_sockets(UIState *s) { if (sm.update(0) == 0) return; UIScene &scene = s->scene; - if (s->started && sm.updated("controlsState")) { + if (scene.started && sm.updated("controlsState")) { scene.controls_state = sm["controlsState"].getControlsState(); } if (sm.updated("carState")) { @@ -180,7 +180,7 @@ static void update_sockets(UIState *s) { if (sm.updated("pandaState")) { auto pandaState = sm["pandaState"].getPandaState(); scene.pandaType = pandaState.getPandaType(); - s->ignition = pandaState.getIgnitionLine() || pandaState.getIgnitionCan(); + scene.ignition = pandaState.getIgnitionLine() || pandaState.getIgnitionCan(); } else if ((s->sm->frame - s->sm->rcv_frame("pandaState")) > 5*UI_FREQ) { scene.pandaType = cereal::PandaState::PandaType::UNKNOWN; } @@ -194,14 +194,14 @@ static void update_sockets(UIState *s) { scene.gpsOK = sm["liveLocationKalman"].getLiveLocationKalman().getGpsOK(); } if (sm.updated("carParams")) { - s->longitudinal_control = sm["carParams"].getCarParams().getOpenpilotLongitudinalControl(); + scene.longitudinal_control = sm["carParams"].getCarParams().getOpenpilotLongitudinalControl(); } if (sm.updated("driverState")) { scene.driver_state = sm["driverState"].getDriverState(); } if (sm.updated("driverMonitoringState")) { scene.dmonitoring_state = sm["driverMonitoringState"].getDriverMonitoringState(); - if(!scene.driver_view && !s->ignition) { + if(!scene.driver_view && !scene.ignition) { read_param(&scene.driver_view, "IsDriverViewEnabled"); } } else if ((sm.frame - sm.rcv_frame("driverMonitoringState")) > UI_FREQ/2) { @@ -210,15 +210,15 @@ static void update_sockets(UIState *s) { if (sm.updated("sensorEvents")) { for (auto sensor : sm["sensorEvents"].getSensorEvents()) { if (sensor.which() == cereal::SensorEventData::LIGHT) { - s->light_sensor = sensor.getLight(); - } else if (!s->started && sensor.which() == cereal::SensorEventData::ACCELERATION) { - s->accel_sensor = sensor.getAcceleration().getV()[2]; - } else if (!s->started && sensor.which() == cereal::SensorEventData::GYRO_UNCALIBRATED) { - s->gyro_sensor = sensor.getGyroUncalibrated().getV()[1]; + scene.light_sensor = sensor.getLight(); + } else if (!scene.started && sensor.which() == cereal::SensorEventData::ACCELERATION) { + scene.accel_sensor = sensor.getAcceleration().getV()[2]; + } else if (!scene.started && sensor.which() == cereal::SensorEventData::GYRO_UNCALIBRATED) { + scene.gyro_sensor = sensor.getGyroUncalibrated().getV()[1]; } } } - s->started = scene.deviceState.getStarted() || scene.driver_view; + scene.started = scene.deviceState.getStarted() || scene.driver_view; } static void update_alert(UIState *s) { @@ -240,9 +240,9 @@ static void update_alert(UIState *s) { } // Handle controls timeout - if (scene.deviceState.getStarted() && (s->sm->frame - s->started_frame) > 10 * UI_FREQ) { + if (scene.deviceState.getStarted() && (s->sm->frame - scene.started_frame) > 10 * UI_FREQ) { const uint64_t cs_frame = s->sm->rcv_frame("controlsState"); - if (cs_frame < s->started_frame) { + if (cs_frame < scene.started_frame) { // car is started, but controlsState hasn't been seen at all scene.alert_text1 = "openpilot Unavailable"; scene.alert_text2 = "Waiting for controls to start"; @@ -264,20 +264,21 @@ static void update_alert(UIState *s) { static void update_params(UIState *s) { const uint64_t frame = s->sm->frame; + UIScene &scene = s->scene; if (frame % (5*UI_FREQ) == 0) { - read_param(&s->is_metric, "IsMetric"); + read_param(&scene.is_metric, "IsMetric"); } else if (frame % (6*UI_FREQ) == 0) { - s->scene.athenaStatus = NET_DISCONNECTED; + scene.athenaStatus = NET_DISCONNECTED; uint64_t last_ping = 0; if (read_param(&last_ping, "LastAthenaPingTime") == 0) { - s->scene.athenaStatus = nanos_since_boot() - last_ping < 70e9 ? NET_CONNECTED : NET_ERROR; + scene.athenaStatus = nanos_since_boot() - last_ping < 70e9 ? NET_CONNECTED : NET_ERROR; } } } static void update_vision(UIState *s) { - if (!s->vipc_client->connected && s->started) { + if (!s->vipc_client->connected && s->scene.started) { if (s->vipc_client->connect(false)){ ui_init_vision(s); } @@ -296,7 +297,7 @@ static void update_vision(UIState *s) { } static void update_status(UIState *s) { - if (s->started && s->sm->updated("controlsState")) { + if (s->scene.started && s->sm->updated("controlsState")) { auto alert_status = s->scene.controls_state.getAlertStatus(); if (alert_status == cereal::ControlsState::AlertStatus::USER_PROMPT) { s->status = STATUS_WARNING; @@ -309,10 +310,10 @@ static void update_status(UIState *s) { // Handle onroad/offroad transition static bool started_prev = false; - if (s->started != started_prev) { - if (s->started) { + if (s->scene.started != started_prev) { + if (s->scene.started) { s->status = STATUS_DISENGAGED; - s->started_frame = s->sm->frame; + s->scene.started_frame = s->sm->frame; read_param(&s->scene.is_rhd, "IsRHD"); s->active_app = cereal::UiLayoutState::App::NONE; @@ -327,7 +328,7 @@ static void update_status(UIState *s) { s->vipc_client->connected = false; } } - started_prev = s->started; + started_prev = s->scene.started; } void ui_update(UIState *s) { diff --git a/selfdrive/ui/ui.hpp b/selfdrive/ui/ui.hpp index 935d2758a0..97d659bf42 100644 --- a/selfdrive/ui/ui.hpp +++ b/selfdrive/ui/ui.hpp @@ -131,6 +131,10 @@ typedef struct UIScene { // lead vertex_data lead_vertices[2]; + + float light_sensor, accel_sensor, gyro_sensor; + bool started, ignition, is_metric, longitudinal_control; + uint64_t started_frame; } UIScene; typedef struct UIState { @@ -165,13 +169,6 @@ typedef struct UIState { // device state bool awake; - float light_sensor, accel_sensor, gyro_sensor; - - bool started; - bool ignition; - bool is_metric; - bool longitudinal_control; - uint64_t started_frame; bool sidebar_collapsed; Rect video_rect, viz_rect;