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
parent
6b5a5bd180
commit
dd603a89f6
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue