UI: Move the variables need to be updated by socket to UIScene (#19783)

* move variables into UIScene

* rebase master

* rebase master

* rebase master

* rebase master

* rebase master

* rebase master

* fix build error

* cleanup

Co-authored-by: Willem Melching <willem.melching@gmail.com>
pull/20209/head^2
Dean Lee 4 years ago committed by GitHub
parent 6b5a5bd180
commit dd603a89f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 18
      selfdrive/ui/android/ui.cc
  2. 10
      selfdrive/ui/paint.cc
  3. 2
      selfdrive/ui/qt/api.cc
  4. 12
      selfdrive/ui/qt/home.cc
  5. 2
      selfdrive/ui/sidebar.cc
  6. 45
      selfdrive/ui/ui.cc
  7. 11
      selfdrive/ui/ui.hpp

@ -30,14 +30,14 @@ static void handle_display_state(UIState *s, bool user_input) {
constexpr float accel_samples = 5*UI_FREQ; constexpr float accel_samples = 5*UI_FREQ;
static float accel_prev = 0., gyro_prev = 0.; 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) { if (!should_wake) {
// tap detection while display is off // tap detection while display is off
bool accel_trigger = abs(s->accel_sensor - accel_prev) > 0.2; bool accel_trigger = abs(s->scene.accel_sensor - accel_prev) > 0.2;
bool gyro_trigger = abs(s->gyro_sensor - gyro_prev) > 0.15; bool gyro_trigger = abs(s->scene.gyro_sensor - gyro_prev) > 0.15;
should_wake = accel_trigger && gyro_trigger; should_wake = accel_trigger && gyro_trigger;
gyro_prev = s->gyro_sensor; gyro_prev = s->scene.gyro_sensor;
accel_prev = (accel_prev * (accel_samples - 1) + s->accel_sensor) / accel_samples; accel_prev = (accel_prev * (accel_samples - 1) + s->scene.accel_sensor) / accel_samples;
} }
// determine desired state // 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) { 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)) { && (s->active_app != cereal::UiLayoutState::App::SETTINGS)) {
if (!s->scene.driver_view) { if (!s->scene.driver_view) {
s->sidebar_collapsed = !s->sidebar_collapsed; 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)) { if (settings_btn.ptInRect(touch_x, touch_y)) {
s->active_app = cereal::UiLayoutState::App::SETTINGS; s->active_app = cereal::UiLayoutState::App::SETTINGS;
} else if (home_btn.ptInRect(touch_x, touch_y)) { } else if (home_btn.ptInRect(touch_x, touch_y)) {
if (s->started) { if (s->scene.started) {
s->active_app = cereal::UiLayoutState::App::NONE; s->active_app = cereal::UiLayoutState::App::NONE;
s->sidebar_collapsed = true; s->sidebar_collapsed = true;
} else { } else {
@ -139,7 +139,7 @@ int main(int argc, char* argv[]) {
s->sound->setVolume(MIN_VOLUME); s->sound->setVolume(MIN_VOLUME);
while (!do_exit) { while (!do_exit) {
if (!s->started) { if (!s->scene.started) {
util::sleep_for(50); util::sleep_for(50);
} }
double u1 = millis_since_boot(); 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)); s->sound->setVolume(fmin(MAX_VOLUME, MIN_VOLUME + s->scene.car_state.getVEgo() / 5));
// set brightness // 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); smooth_brightness = fmin(255, clipped_brightness * 0.01 + smooth_brightness * 0.99);
ui_set_brightness(s, (int)smooth_brightness); ui_set_brightness(s, (int)smooth_brightness);

@ -169,7 +169,7 @@ static void ui_draw_world(UIState *s) {
ui_draw_vision_lane_lines(s); ui_draw_vision_lane_lines(s);
// Draw lead indicators if openpilot is handling longitudinal // Draw lead indicators if openpilot is handling longitudinal
if (s->longitudinal_control) { if (s->scene.longitudinal_control) {
if (scene->lead_data[0].getStatus()) { if (scene->lead_data[0].getStatus()) {
draw_lead(s, 0); draw_lead(s, 0);
} }
@ -184,7 +184,7 @@ static void ui_draw_vision_maxspeed(UIState *s) {
const int SET_SPEED_NA = 255; const int SET_SPEED_NA = 255;
float maxspeed = s->scene.controls_state.getVCruise(); float maxspeed = s->scene.controls_state.getVCruise();
const bool is_cruise_set = maxspeed != 0 && maxspeed != SET_SPEED_NA; 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}; 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.); 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) { 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)); const std::string speed_str = std::to_string((int)std::nearbyint(speed));
nvgTextAlign(s->vg, NVG_ALIGN_CENTER | NVG_ALIGN_BASELINE); 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(), 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) { static void ui_draw_vision_event(UIState *s) {
@ -375,7 +375,7 @@ void ui_draw(UIState *s) {
s->viz_rect.w -= sbr_w; 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; const bool draw_vision = draw_alerts && s->vipc_client->connected;
// GL drawing functions // GL drawing functions

@ -96,7 +96,7 @@ RequestRepeater::RequestRepeater(QWidget* parent, QString requestURL, int period
void RequestRepeater::sendRequest(QString requestURL, QVector<QPair<QString, QJsonValue>> payloads){ void RequestRepeater::sendRequest(QString requestURL, QVector<QPair<QString, QJsonValue>> payloads){
// No network calls onroad // No network calls onroad
if(GLWindow::ui_state.started){ if(GLWindow::ui_state.scene.started){
return; return;
} }
if (!active || (!GLWindow::ui_state.awake && disableWithScreen)) { if (!active || (!GLWindow::ui_state.awake && disableWithScreen)) {

@ -160,7 +160,7 @@ void HomeWindow::setVisibility(bool offroad) {
void HomeWindow::mousePressEvent(QMouseEvent* e) { void HomeWindow::mousePressEvent(QMouseEvent* e) {
UIState* ui_state = &glWindow->ui_state; 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); Params().write_db_value("IsDriverViewEnabled", "0", 1);
return; return;
} }
@ -173,7 +173,7 @@ void HomeWindow::mousePressEvent(QMouseEvent* e) {
} }
// Vision click // 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; 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 static int awake_timeout = 0; // Somehow this only gets called on program start
awake_timeout = std::max(awake_timeout - 1, 0); 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; s->awake = true;
awake_timeout = 30 * UI_FREQ; awake_timeout = 30 * UI_FREQ;
} else if (awake_timeout == 0) { } else if (awake_timeout == 0) {
@ -240,7 +240,7 @@ void GLWindow::backlightUpdate() {
// Update brightness // Update brightness
float k = (BACKLIGHT_DT / BACKLIGHT_TS) / (1.0f + BACKLIGHT_DT / BACKLIGHT_TS); 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); smooth_brightness = clipped_brightness * k + smooth_brightness * (1.0f - k);
int brightness = smooth_brightness; int brightness = smooth_brightness;
@ -257,8 +257,8 @@ void GLWindow::timerUpdate() {
makeCurrent(); makeCurrent();
} }
if (ui_state.started != onroad) { if (ui_state.scene.started != onroad) {
onroad = ui_state.started; onroad = ui_state.scene.started;
emit offroadTransition(!onroad); emit offroadTransition(!onroad);
// Change timeout to 0 when onroad, this will call timerUpdate continously. // Change timeout to 0 when onroad, this will call timerUpdate continously.

@ -123,7 +123,7 @@ static void draw_panda_metric(UIState *s) {
panda_message = "NO\nPANDA"; panda_message = "NO\nPANDA";
} }
#ifdef QCOM2 #ifdef QCOM2
else if (s->started) { else if (s->scene.started) {
panda_severity = s->scene.gpsOK ? 0 : 1; panda_severity = s->scene.gpsOK ? 0 : 1;
panda_message = util::string_format("SAT CNT\n%d", s->scene.satelliteCount); panda_message = util::string_format("SAT CNT\n%d", s->scene.satelliteCount);
} }

@ -57,7 +57,7 @@ void ui_init(UIState *s) {
s->sm = new SubMaster({"modelV2", "controlsState", "uiLayoutState", "liveCalibration", "radarState", "deviceState", "roadCameraState", "liveLocationKalman", s->sm = new SubMaster({"modelV2", "controlsState", "uiLayoutState", "liveCalibration", "radarState", "deviceState", "roadCameraState", "liveLocationKalman",
"pandaState", "carParams", "driverState", "driverMonitoringState", "sensorEvents", "carState", "ubloxGnss"}); "pandaState", "carParams", "driverState", "driverMonitoringState", "sensorEvents", "carState", "ubloxGnss"});
s->started = false; s->scene.started = false;
s->status = STATUS_OFFROAD; s->status = STATUS_OFFROAD;
s->fb = std::make_unique<FrameBuffer>("ui", 0, true, &s->fb_w, &s->fb_h); s->fb = std::make_unique<FrameBuffer>("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; if (sm.update(0) == 0) return;
UIScene &scene = s->scene; UIScene &scene = s->scene;
if (s->started && sm.updated("controlsState")) { if (scene.started && sm.updated("controlsState")) {
scene.controls_state = sm["controlsState"].getControlsState(); scene.controls_state = sm["controlsState"].getControlsState();
} }
if (sm.updated("carState")) { if (sm.updated("carState")) {
@ -180,7 +180,7 @@ static void update_sockets(UIState *s) {
if (sm.updated("pandaState")) { if (sm.updated("pandaState")) {
auto pandaState = sm["pandaState"].getPandaState(); auto pandaState = sm["pandaState"].getPandaState();
scene.pandaType = pandaState.getPandaType(); 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) { } else if ((s->sm->frame - s->sm->rcv_frame("pandaState")) > 5*UI_FREQ) {
scene.pandaType = cereal::PandaState::PandaType::UNKNOWN; scene.pandaType = cereal::PandaState::PandaType::UNKNOWN;
} }
@ -194,14 +194,14 @@ static void update_sockets(UIState *s) {
scene.gpsOK = sm["liveLocationKalman"].getLiveLocationKalman().getGpsOK(); scene.gpsOK = sm["liveLocationKalman"].getLiveLocationKalman().getGpsOK();
} }
if (sm.updated("carParams")) { if (sm.updated("carParams")) {
s->longitudinal_control = sm["carParams"].getCarParams().getOpenpilotLongitudinalControl(); scene.longitudinal_control = sm["carParams"].getCarParams().getOpenpilotLongitudinalControl();
} }
if (sm.updated("driverState")) { if (sm.updated("driverState")) {
scene.driver_state = sm["driverState"].getDriverState(); scene.driver_state = sm["driverState"].getDriverState();
} }
if (sm.updated("driverMonitoringState")) { if (sm.updated("driverMonitoringState")) {
scene.dmonitoring_state = sm["driverMonitoringState"].getDriverMonitoringState(); scene.dmonitoring_state = sm["driverMonitoringState"].getDriverMonitoringState();
if(!scene.driver_view && !s->ignition) { if(!scene.driver_view && !scene.ignition) {
read_param(&scene.driver_view, "IsDriverViewEnabled"); read_param(&scene.driver_view, "IsDriverViewEnabled");
} }
} else if ((sm.frame - sm.rcv_frame("driverMonitoringState")) > UI_FREQ/2) { } 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")) { if (sm.updated("sensorEvents")) {
for (auto sensor : sm["sensorEvents"].getSensorEvents()) { for (auto sensor : sm["sensorEvents"].getSensorEvents()) {
if (sensor.which() == cereal::SensorEventData::LIGHT) { if (sensor.which() == cereal::SensorEventData::LIGHT) {
s->light_sensor = sensor.getLight(); scene.light_sensor = sensor.getLight();
} else if (!s->started && sensor.which() == cereal::SensorEventData::ACCELERATION) { } else if (!scene.started && sensor.which() == cereal::SensorEventData::ACCELERATION) {
s->accel_sensor = sensor.getAcceleration().getV()[2]; scene.accel_sensor = sensor.getAcceleration().getV()[2];
} else if (!s->started && sensor.which() == cereal::SensorEventData::GYRO_UNCALIBRATED) { } else if (!scene.started && sensor.which() == cereal::SensorEventData::GYRO_UNCALIBRATED) {
s->gyro_sensor = sensor.getGyroUncalibrated().getV()[1]; 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) { static void update_alert(UIState *s) {
@ -240,9 +240,9 @@ static void update_alert(UIState *s) {
} }
// Handle controls timeout // 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"); 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 // car is started, but controlsState hasn't been seen at all
scene.alert_text1 = "openpilot Unavailable"; scene.alert_text1 = "openpilot Unavailable";
scene.alert_text2 = "Waiting for controls to start"; scene.alert_text2 = "Waiting for controls to start";
@ -264,20 +264,21 @@ static void update_alert(UIState *s) {
static void update_params(UIState *s) { static void update_params(UIState *s) {
const uint64_t frame = s->sm->frame; const uint64_t frame = s->sm->frame;
UIScene &scene = s->scene;
if (frame % (5*UI_FREQ) == 0) { 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) { } else if (frame % (6*UI_FREQ) == 0) {
s->scene.athenaStatus = NET_DISCONNECTED; scene.athenaStatus = NET_DISCONNECTED;
uint64_t last_ping = 0; uint64_t last_ping = 0;
if (read_param(&last_ping, "LastAthenaPingTime") == 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) { 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)){ if (s->vipc_client->connect(false)){
ui_init_vision(s); ui_init_vision(s);
} }
@ -296,7 +297,7 @@ static void update_vision(UIState *s) {
} }
static void update_status(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(); auto alert_status = s->scene.controls_state.getAlertStatus();
if (alert_status == cereal::ControlsState::AlertStatus::USER_PROMPT) { if (alert_status == cereal::ControlsState::AlertStatus::USER_PROMPT) {
s->status = STATUS_WARNING; s->status = STATUS_WARNING;
@ -309,10 +310,10 @@ static void update_status(UIState *s) {
// Handle onroad/offroad transition // Handle onroad/offroad transition
static bool started_prev = false; static bool started_prev = false;
if (s->started != started_prev) { if (s->scene.started != started_prev) {
if (s->started) { if (s->scene.started) {
s->status = STATUS_DISENGAGED; s->status = STATUS_DISENGAGED;
s->started_frame = s->sm->frame; s->scene.started_frame = s->sm->frame;
read_param(&s->scene.is_rhd, "IsRHD"); read_param(&s->scene.is_rhd, "IsRHD");
s->active_app = cereal::UiLayoutState::App::NONE; s->active_app = cereal::UiLayoutState::App::NONE;
@ -327,7 +328,7 @@ static void update_status(UIState *s) {
s->vipc_client->connected = false; s->vipc_client->connected = false;
} }
} }
started_prev = s->started; started_prev = s->scene.started;
} }
void ui_update(UIState *s) { void ui_update(UIState *s) {

@ -131,6 +131,10 @@ typedef struct UIScene {
// lead // lead
vertex_data lead_vertices[2]; vertex_data lead_vertices[2];
float light_sensor, accel_sensor, gyro_sensor;
bool started, ignition, is_metric, longitudinal_control;
uint64_t started_frame;
} UIScene; } UIScene;
typedef struct UIState { typedef struct UIState {
@ -165,13 +169,6 @@ typedef struct UIState {
// device state // device state
bool awake; 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; bool sidebar_collapsed;
Rect video_rect, viz_rect; Rect video_rect, viz_rect;

Loading…
Cancel
Save