diff --git a/cereal b/cereal index 4ecee78a76..a6f4b6351d 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 4ecee78a761c5421a5a677aa802175ca19527426 +Subproject commit a6f4b6351d70e74220ffa7d9af917c3dea08a2ce diff --git a/selfdrive/ui/paint.cc b/selfdrive/ui/paint.cc index e6a868697b..ab46cff65a 100644 --- a/selfdrive/ui/paint.cc +++ b/selfdrive/ui/paint.cc @@ -73,16 +73,15 @@ static void ui_draw_circle_image(const UIState *s, int center_x, int center_y, i ui_draw_circle_image(s, center_x, center_y, radius, image, nvgRGBA(0, 0, 0, (255 * bg_alpha)), img_alpha); } -static void draw_lead(UIState *s, int idx) { +static void draw_lead(UIState *s, const cereal::RadarState::LeadData::Reader &lead_data, const vertex_data &vd) { // Draw lead car indicator - const auto &lead = s->scene.lead_data[idx]; - auto [x, y] = s->scene.lead_vertices[idx]; + auto [x, y] = vd; float fillAlpha = 0; float speedBuff = 10.; float leadBuff = 40.; - float d_rel = lead.getDRel(); - float v_rel = lead.getVRel(); + float d_rel = lead_data.getDRel(); + float v_rel = lead_data.getVRel(); if (d_rel < leadBuff) { fillAlpha = 255*(1.0-(d_rel/leadBuff)); if (v_rel < 0) { @@ -173,7 +172,6 @@ static void ui_draw_vision_lane_lines(UIState *s) { // Draw all world space objects. static void ui_draw_world(UIState *s) { - const UIScene *scene = &s->scene; // Don't draw on top of sidebar nvgScissor(s->vg, s->viz_rect.x, s->viz_rect.y, s->viz_rect.w, s->viz_rect.h); @@ -182,11 +180,14 @@ static void ui_draw_world(UIState *s) { // Draw lead indicators if openpilot is handling longitudinal if (s->scene.longitudinal_control) { - if (scene->lead_data[0].getStatus()) { - draw_lead(s, 0); + auto radar_state = (*s->sm)["radarState"].getRadarState(); + auto lead_one = radar_state.getLeadOne(); + auto lead_two = radar_state.getLeadTwo(); + if (lead_one.getStatus()) { + draw_lead(s, lead_one, s->scene.lead_vertices[0]); } - if (scene->lead_data[1].getStatus() && (std::abs(scene->lead_data[0].getDRel() - scene->lead_data[1].getDRel()) > 3.0)) { - draw_lead(s, 1); + if (lead_two.getStatus() && (std::abs(lead_one.getDRel() - lead_two.getDRel()) > 3.0)) { + draw_lead(s, lead_two, s->scene.lead_vertices[1]); } } nvgResetScissor(s->vg); @@ -194,7 +195,7 @@ static void ui_draw_world(UIState *s) { static void ui_draw_vision_maxspeed(UIState *s) { const int SET_SPEED_NA = 255; - float maxspeed = s->scene.controls_state.getVCruise(); + float maxspeed = (*s->sm)["controlsState"].getControlsState().getVCruise(); const bool is_cruise_set = maxspeed != 0 && maxspeed != SET_SPEED_NA; if (is_cruise_set && !s->scene.is_metric) { maxspeed *= 0.6225; } @@ -213,7 +214,7 @@ 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->scene.is_metric ? 3.6 : 2.2369363)); + const float speed = std::max(0.0, (*s->sm)["carState"].getCarState().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"); @@ -221,7 +222,7 @@ static void ui_draw_vision_speed(UIState *s) { } static void ui_draw_vision_event(UIState *s) { - if (s->scene.controls_state.getEngageable()) { + if ((*s->sm)["controlsState"].getControlsState().getEngageable()) { // draw steering wheel const int radius = 96; const int center_x = s->viz_rect.right() - radius - bdr_s * 2; @@ -234,7 +235,8 @@ static void ui_draw_vision_face(UIState *s) { const int radius = 96; const int center_x = s->viz_rect.x + radius + (bdr_s * 2); const int center_y = s->viz_rect.bottom() - footer_h / 2; - ui_draw_circle_image(s, center_x, center_y, radius, "driver_face", s->scene.dmonitoring_state.getIsActiveMode()); + bool is_active = (*s->sm)["driverMonitoringState"].getDriverMonitoringState().getIsActiveMode(); + ui_draw_circle_image(s, center_x, center_y, radius, "driver_face", is_active); } static void ui_draw_driver_view(UIState *s) { @@ -252,9 +254,10 @@ static void ui_draw_driver_view(UIState *s) { ui_fill_rect(s->vg, {blackout_x_l, rect.y, blackout_w_l, rect.h}, COLOR_BLACK_ALPHA(144)); ui_fill_rect(s->vg, {blackout_x_r, rect.y, blackout_w_r, rect.h}, COLOR_BLACK_ALPHA(144)); - const bool face_detected = s->scene.driver_state.getFaceProb() > 0.4; + auto driver_state = (*s->sm)["driverState"].getDriverState(); + const bool face_detected = driver_state.getFaceProb() > 0.4; if (face_detected) { - auto fxy_list = s->scene.driver_state.getFacePosition(); + auto fxy_list = driver_state.getFacePosition(); float face_x = fxy_list[0]; float face_y = fxy_list[1]; int fbox_x = valid_rect.centerX() + (is_rhd ? face_x : -face_x) * valid_rect.w; @@ -308,7 +311,7 @@ static void ui_draw_vision(UIState *s) { } // Set Speed, Current Speed, Status/Events ui_draw_vision_header(s); - if (s->scene.controls_state.getAlertSize() == cereal::ControlsState::AlertSize::NONE) { + if ((*s->sm)["controlsState"].getControlsState().getAlertSize() == cereal::ControlsState::AlertSize::NONE) { ui_draw_vision_face(s); } } else { diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index c285c07282..7458780edc 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -44,7 +44,7 @@ void OnroadAlerts::updateState(const UIState &s) { volume = util::map_val(sm["carState"].getCarState().getVEgo(), 0.f, 20.f, Hardware::MIN_VOLUME, Hardware::MAX_VOLUME); } - if (s.scene.deviceState.getStarted()) { + if (sm["deviceState"].getDeviceState().getStarted()) { if (sm.updated("controlsState")) { const cereal::ControlsState::Reader &cs = sm["controlsState"].getControlsState(); updateAlert(QString::fromStdString(cs.getAlertText1()), QString::fromStdString(cs.getAlertText2()), diff --git a/selfdrive/ui/qt/sidebar.cc b/selfdrive/ui/qt/sidebar.cc index cf1319a70b..2ac0dc39d7 100644 --- a/selfdrive/ui/qt/sidebar.cc +++ b/selfdrive/ui/qt/sidebar.cc @@ -61,17 +61,18 @@ void Sidebar::update(const UIState &s) { repaint(); } - net_type = s.scene.deviceState.getNetworkType(); - strength = s.scene.deviceState.getNetworkStrength(); + auto deviceState = (*s.sm)["deviceState"].getDeviceState(); + net_type = deviceState.getNetworkType(); + strength = deviceState.getNetworkStrength(); temp_status = danger_color; - auto ts = s.scene.deviceState.getThermalStatus(); + auto ts = deviceState.getThermalStatus(); if (ts == cereal::DeviceState::ThermalStatus::GREEN) { temp_status = good_color; } else if (ts == cereal::DeviceState::ThermalStatus::YELLOW) { temp_status = warning_color; } - temp_val = (int)s.scene.deviceState.getAmbientTempC(); + temp_val = (int)deviceState.getAmbientTempC(); panda_str = "VEHICLE\nONLINE"; panda_status = good_color; @@ -80,7 +81,7 @@ void Sidebar::update(const UIState &s) { panda_str = "NO\nPANDA"; } else if (Hardware::TICI() && s.scene.started) { panda_str = QString("SAT CNT\n%1").arg(s.scene.satelliteCount); - panda_status = s.scene.gpsOK ? good_color : warning_color; + panda_status = (*s.sm)["liveLocationKalman"].getLiveLocationKalman().getGpsOK() ? good_color : warning_color; } if (s.sm->updated("deviceState") || s.sm->updated("pandaState")) { diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index 0d91560f1c..fbf31960a3 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -72,7 +72,6 @@ static void update_leads(UIState *s, const cereal::RadarState::Reader &radar_sta // negative because radarState uses left positive convention calib_frame_to_full_frame(s, lead_data.getDRel(), -lead_data.getYRel(), z + 1.22, &s->scene.lead_vertices[i]); } - s->scene.lead_data[i] = lead_data; } } @@ -114,8 +113,9 @@ static void update_model(UIState *s, const cereal::ModelDataV2::Reader &model) { } // update path - if (scene.lead_data[0].getStatus()) { - const float lead_d = scene.lead_data[0].getDRel() * 2.; + auto lead_one = (*s->sm)["radarState"].getRadarState().getLeadOne(); + if (lead_one.getStatus()) { + const float lead_d = lead_one.getDRel() * 2.; max_distance = std::clamp((float)(lead_d - fmin(lead_d * 0.35, 10.)), 0.0f, max_distance); } max_idx = get_path_length_idx(model_position, max_distance); @@ -123,20 +123,13 @@ static void update_model(UIState *s, const cereal::ModelDataV2::Reader &model) { } static void update_sockets(UIState *s){ - SubMaster &sm = *(s->sm); - sm.update(0); + s->sm->update(0); } static void update_state(UIState *s) { SubMaster &sm = *(s->sm); - UIScene &scene = s->scene; - if (scene.started && sm.updated("controlsState")) { - scene.controls_state = sm["controlsState"].getControlsState(); - } - if (sm.updated("carState")) { - scene.car_state = sm["carState"].getCarState(); - } + if (sm.updated("radarState")) { std::optional line; if (sm.rcv_frame("modelV2") > 0) { @@ -164,9 +157,6 @@ static void update_state(UIState *s) { if (sm.updated("modelV2")) { update_model(s, sm["modelV2"].getModelV2()); } - if (sm.updated("deviceState")) { - scene.deviceState = sm["deviceState"].getDeviceState(); - } if (sm.updated("pandaState")) { auto pandaState = sm["pandaState"].getPandaState(); scene.pandaType = pandaState.getPandaType(); @@ -180,18 +170,9 @@ static void update_state(UIState *s) { scene.satelliteCount = data.getMeasurementReport().getNumMeas(); } } - if (sm.updated("liveLocationKalman")) { - scene.gpsOK = sm["liveLocationKalman"].getLiveLocationKalman().getGpsOK(); - } if (sm.updated("carParams")) { 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 (sm.updated("sensorEvents")) { for (auto sensor : sm["sensorEvents"].getSensorEvents()) { if (!Hardware::TICI() && sensor.which() == cereal::SensorEventData::LIGHT) { @@ -215,7 +196,7 @@ static void update_state(UIState *s) { float gain = camera_state.getGainFrac() * (camera_state.getGlobalGain() > 100 ? 2.5 : 1.0) / 10.0; scene.light_sensor = std::clamp((1023.0 / 1757.0) * (1757.0 - camera_state.getIntegLines()) * (1.0 - gain), 0.0, 1023.0); } - scene.started = scene.deviceState.getStarted() || scene.driver_view; + scene.started = sm["deviceState"].getDeviceState().getStarted() || scene.driver_view; } static void update_params(UIState *s) { @@ -245,13 +226,14 @@ static void update_vision(UIState *s) { static void update_status(UIState *s) { if (s->scene.started && s->sm->updated("controlsState")) { - auto alert_status = s->scene.controls_state.getAlertStatus(); + auto controls_state = (*s->sm)["controlsState"].getControlsState(); + auto alert_status = controls_state.getAlertStatus(); if (alert_status == cereal::ControlsState::AlertStatus::USER_PROMPT) { s->status = STATUS_WARNING; } else if (alert_status == cereal::ControlsState::AlertStatus::CRITICAL) { s->status = STATUS_ALERT; } else { - s->status = s->scene.controls_state.getEnabled() ? STATUS_ENGAGED : STATUS_DISENGAGED; + s->status = controls_state.getEnabled() ? STATUS_ENGAGED : STATUS_DISENGAGED; } } diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 9c20d202cb..f8ae859a96 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -81,16 +81,8 @@ typedef struct UIScene { cereal::PandaState::PandaType pandaType; - cereal::DeviceState::Reader deviceState; - cereal::RadarState::LeadData::Reader lead_data[2]; - cereal::CarState::Reader car_state; - cereal::ControlsState::Reader controls_state; - cereal::DriverState::Reader driver_state; - cereal::DriverMonitoringState::Reader dmonitoring_state; - // gps int satelliteCount; - bool gpsOK; // modelV2 float lane_line_probs[4];