UI: remove duplicate capnp readers (#20855)

* refactor submaster

* rebase master

* CAPNP best pratice

* zero initialize

* vwp_w has not been initialized before UIState()

* no static

* rebase master

* Minimize refactoring

* cleanup

* remove gpsOk

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
albatross
Dean Lee 2021-05-15 13:47:06 +08:00 committed by GitHub
parent e694f0b4d6
commit 533bc30c2e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 37 additions and 59 deletions

2
cereal

@ -1 +1 @@
Subproject commit 4ecee78a761c5421a5a677aa802175ca19527426
Subproject commit a6f4b6351d70e74220ffa7d9af917c3dea08a2ce

View File

@ -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 {

View File

@ -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()),

View File

@ -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")) {

View File

@ -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<cereal::ModelDataV2::XYZTData::Reader> 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<float>((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;
}
}

View File

@ -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];