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>
albatross
Dean Lee 2021-03-04 00:40:50 +08:00 committed by GitHub
parent 6b5a5bd180
commit dd603a89f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 49 additions and 51 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -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);
}

View File

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

View File

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