diff --git a/selfdrive/ui/SConscript b/selfdrive/ui/SConscript index 52e4e0c42c..d33e576691 100644 --- a/selfdrive/ui/SConscript +++ b/selfdrive/ui/SConscript @@ -117,8 +117,7 @@ if arch in ['x86_64', 'Darwin'] or GetOption('extras'): replay_lib = qt_env.Library("qt_replay", replay_lib_src, LIBS=base_libs) replay_libs = [replay_lib, 'avutil', 'avcodec', 'avformat', 'bz2', 'curl', 'yuv'] + qt_libs qt_env.Program("replay/replay", ["replay/main.cc"], LIBS=replay_libs) - - qt_env.Program("watch3", ["watch3.cc"], LIBS=qt_libs + ['common', 'json11']) + qt_env.Program("watch3", ["watch3.cc"], LIBS=qt_libs + ['common', 'json11', 'zmq', 'visionipc', 'messaging']) if GetOption('test'): qt_env.Program('replay/tests/test_replay', ['replay/tests/test_runner.cc', 'replay/tests/test_replay.cc'], LIBS=[replay_libs]) diff --git a/selfdrive/ui/qt/home.cc b/selfdrive/ui/qt/home.cc index 1e89264952..df4f474943 100644 --- a/selfdrive/ui/qt/home.cc +++ b/selfdrive/ui/qt/home.cc @@ -19,7 +19,6 @@ HomeWindow::HomeWindow(QWidget* parent) : QWidget(parent) { sidebar = new Sidebar(this); main_layout->addWidget(sidebar); - QObject::connect(this, &HomeWindow::update, sidebar, &Sidebar::updateState); QObject::connect(sidebar, &Sidebar::openSettings, this, &HomeWindow::openSettings); slayout = new QStackedLayout(); @@ -31,15 +30,13 @@ HomeWindow::HomeWindow(QWidget* parent) : QWidget(parent) { onroad = new OnroadWindow(this); slayout->addWidget(onroad); - QObject::connect(this, &HomeWindow::update, onroad, &OnroadWindow::updateStateSignal); - QObject::connect(this, &HomeWindow::offroadTransitionSignal, onroad, &OnroadWindow::offroadTransitionSignal); - driver_view = new DriverViewWindow(this); connect(driver_view, &DriverViewWindow::done, [=] { showDriverView(false); }); slayout->addWidget(driver_view); setAttribute(Qt::WA_NoSystemBackground); + QObject::connect(uiState(), &UIState::offroadTransition, this, &HomeWindow::offroadTransition); } void HomeWindow::showSidebar(bool show) { @@ -53,7 +50,6 @@ void HomeWindow::offroadTransition(bool offroad) { } else { slayout->setCurrentWidget(onroad); } - emit offroadTransitionSignal(offroad); } void HomeWindow::showDriverView(bool show) { diff --git a/selfdrive/ui/qt/home.h b/selfdrive/ui/qt/home.h index 0e65ef05e9..732071c153 100644 --- a/selfdrive/ui/qt/home.h +++ b/selfdrive/ui/qt/home.h @@ -43,10 +43,6 @@ signals: void openSettings(); void closeSettings(); - // forwarded signals - void update(const UIState &s); - void offroadTransitionSignal(bool offroad); - public slots: void offroadTransition(bool offroad); void showDriverView(bool show); diff --git a/selfdrive/ui/qt/maps/map.cc b/selfdrive/ui/qt/maps/map.cc index e1bfe96c8e..7bf5f0b4d1 100644 --- a/selfdrive/ui/qt/maps/map.cc +++ b/selfdrive/ui/qt/maps/map.cc @@ -106,7 +106,7 @@ void MapWindow::initLayers() { } void MapWindow::timerUpdate() { - if (!QUIState::ui_state.scene.started) { + if (!uiState()->scene.started) { return; } @@ -387,7 +387,7 @@ void MapInstructions::updateDistance(float d) { d = std::max(d, 0.0f); QString distance_str; - if (QUIState::ui_state.scene.is_metric) { + if (uiState()->scene.is_metric) { if (d > 500) { distance_str.setNum(d / 1000, 'f', 1); distance_str += " km"; @@ -620,7 +620,7 @@ void MapETA::updateETA(float s, float s_typical, float d) { // Distance QString distance_str; float num = 0; - if (QUIState::ui_state.scene.is_metric) { + if (uiState()->scene.is_metric) { num = d / 1000.0; distance_unit->setText("km"); } else { diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index a0123e75fe..1819f7b5a8 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -98,7 +98,7 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) { bool locked = params.getBool((param + "Lock").toStdString()); toggle->setEnabled(!locked); if (!locked) { - connect(parent, &SettingsWindow::offroadTransition, toggle, &ParamControl::setEnabled); + connect(uiState(), &UIState::offroadTransition, toggle, &ParamControl::setEnabled); } addItem(toggle); } @@ -144,7 +144,7 @@ DevicePanel::DevicePanel(SettingsWindow *parent) : ListWidget(parent) { addItem(regulatoryBtn); } - QObject::connect(parent, &SettingsWindow::offroadTransition, [=](bool offroad) { + QObject::connect(uiState(), &UIState::offroadTransition, [=](bool offroad) { for (auto btn : findChildren()) { btn->setEnabled(offroad); } @@ -198,10 +198,10 @@ void DevicePanel::updateCalibDescription() { } void DevicePanel::reboot() { - if (QUIState::ui_state.status == UIStatus::STATUS_DISENGAGED) { + if (uiState()->status == UIStatus::STATUS_DISENGAGED) { if (ConfirmationDialog::confirm("Are you sure you want to reboot?", this)) { // Check engaged again in case it changed while the dialog was open - if (QUIState::ui_state.status == UIStatus::STATUS_DISENGAGED) { + if (uiState()->status == UIStatus::STATUS_DISENGAGED) { Params().putBool("DoReboot", true); } } @@ -211,10 +211,10 @@ void DevicePanel::reboot() { } void DevicePanel::poweroff() { - if (QUIState::ui_state.status == UIStatus::STATUS_DISENGAGED) { + if (uiState()->status == UIStatus::STATUS_DISENGAGED) { if (ConfirmationDialog::confirm("Are you sure you want to power off?", this)) { // Check engaged again in case it changed while the dialog was open - if (QUIState::ui_state.status == UIStatus::STATUS_DISENGAGED) { + if (uiState()->status == UIStatus::STATUS_DISENGAGED) { Params().putBool("DoShutdown", true); } } @@ -247,7 +247,7 @@ SoftwarePanel::SoftwarePanel(QWidget* parent) : ListWidget(parent) { params.putBool("DoUninstall", true); } }); - connect(parent, SIGNAL(offroadTransition(bool)), uninstallBtn, SLOT(setEnabled(bool))); + connect(uiState(), &UIState::offroadTransition, uninstallBtn, &QPushButton::setEnabled); QWidget *widgets[] = {versionLbl, lastUpdateLbl, updateBtn, gitBranchLbl, gitCommitLbl, osVersionLbl, uninstallBtn}; for (QWidget* w : widgets) { diff --git a/selfdrive/ui/qt/offroad/settings.h b/selfdrive/ui/qt/offroad/settings.h index f69c080ee7..c3acf3d94a 100644 --- a/selfdrive/ui/qt/offroad/settings.h +++ b/selfdrive/ui/qt/offroad/settings.h @@ -24,7 +24,6 @@ protected: signals: void closeSettings(); - void offroadTransition(bool offroad); void reviewTrainingGuide(); void showDriverView(); diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index 53cc963674..e9f9bbfa09 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -41,8 +41,8 @@ OnroadWindow::OnroadWindow(QWidget *parent) : QWidget(parent) { alerts->raise(); setAttribute(Qt::WA_OpaquePaintEvent); - QObject::connect(this, &OnroadWindow::updateStateSignal, this, &OnroadWindow::updateState); - QObject::connect(this, &OnroadWindow::offroadTransitionSignal, this, &OnroadWindow::offroadTransition); + QObject::connect(uiState(), &UIState::uiUpdate, this, &OnroadWindow::updateState); + QObject::connect(uiState(), &UIState::offroadTransition, this, &OnroadWindow::offroadTransition); } void OnroadWindow::updateState(const UIState &s) { @@ -76,10 +76,10 @@ void OnroadWindow::mousePressEvent(QMouseEvent* e) { void OnroadWindow::offroadTransition(bool offroad) { #ifdef ENABLE_MAPS if (!offroad) { - if (map == nullptr && (QUIState::ui_state.has_prime || !MAPBOX_TOKEN.isEmpty())) { + if (map == nullptr && (uiState()->has_prime || !MAPBOX_TOKEN.isEmpty())) { MapWindow * m = new MapWindow(get_mapbox_settings()); m->setFixedWidth(topWidget(this)->width() / 2); - QObject::connect(this, &OnroadWindow::offroadTransitionSignal, m, &MapWindow::offroadTransition); + QObject::connect(uiState(), &UIState::offroadTransition, m, &MapWindow::offroadTransition); split->addWidget(m, 0, Qt::AlignRight); map = m; } @@ -274,7 +274,7 @@ void NvgWindow::initializeGL() { void NvgWindow::updateFrameMat(int w, int h) { CameraViewWidget::updateFrameMat(w, h); - UIState *s = &QUIState::ui_state; + UIState *s = uiState(); s->fb_w = w; s->fb_h = h; auto intrinsic_matrix = s->wide_camera ? ecam_intrinsic_matrix : fcam_intrinsic_matrix; @@ -348,7 +348,7 @@ void NvgWindow::drawLead(QPainter &painter, const cereal::ModelDataV2::LeadDataV void NvgWindow::paintGL() { CameraViewWidget::paintGL(); - UIState *s = &QUIState::ui_state; + UIState *s = uiState(); if (s->scene.world_objects_visible) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); @@ -379,6 +379,6 @@ void NvgWindow::paintGL() { void NvgWindow::showEvent(QShowEvent *event) { CameraViewWidget::showEvent(event); - ui_update_params(&QUIState::ui_state); + ui_update_params(uiState()); prev_draw_t = millis_since_boot(); } diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h index 37460c8ba6..05811c5060 100644 --- a/selfdrive/ui/qt/onroad.h +++ b/selfdrive/ui/qt/onroad.h @@ -97,10 +97,6 @@ private: QWidget *map = nullptr; QHBoxLayout* split; -signals: - void updateStateSignal(const UIState &s); - void offroadTransitionSignal(bool offroad); - private slots: void offroadTransition(bool offroad); void updateState(const UIState &s); diff --git a/selfdrive/ui/qt/request_repeater.cc b/selfdrive/ui/qt/request_repeater.cc index d2c0f9bc30..7ef1c833ab 100644 --- a/selfdrive/ui/qt/request_repeater.cc +++ b/selfdrive/ui/qt/request_repeater.cc @@ -5,7 +5,7 @@ RequestRepeater::RequestRepeater(QObject *parent, const QString &requestURL, con timer = new QTimer(this); timer->setTimerType(Qt::VeryCoarseTimer); QObject::connect(timer, &QTimer::timeout, [=]() { - if ((!QUIState::ui_state.scene.started || while_onroad) && QUIState::ui_state.awake && !active()) { + if ((!uiState()->scene.started || while_onroad) && uiState()->awake && !active()) { sendRequest(requestURL); } }); diff --git a/selfdrive/ui/qt/sidebar.cc b/selfdrive/ui/qt/sidebar.cc index 73c4e2f8ce..e8804bc059 100644 --- a/selfdrive/ui/qt/sidebar.cc +++ b/selfdrive/ui/qt/sidebar.cc @@ -34,6 +34,8 @@ Sidebar::Sidebar(QWidget *parent) : QFrame(parent) { setAttribute(Qt::WA_OpaquePaintEvent); setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); setFixedWidth(300); + + QObject::connect(uiState(), &UIState::uiUpdate, this, &Sidebar::updateState); } void Sidebar::mouseReleaseEvent(QMouseEvent *event) { diff --git a/selfdrive/ui/qt/widgets/prime.cc b/selfdrive/ui/qt/widgets/prime.cc index ab6dc67d36..2e9a9e6af9 100644 --- a/selfdrive/ui/qt/widgets/prime.cc +++ b/selfdrive/ui/qt/widgets/prime.cc @@ -314,8 +314,8 @@ void SetupWidget::replyFinished(const QString &response, bool success) { bool prime = json["prime"].toBool(); - if (QUIState::ui_state.has_prime != prime) { - QUIState::ui_state.has_prime = prime; + if (uiState()->has_prime != prime) { + uiState()->has_prime = prime; Params().putBool("HasPrime", prime); } diff --git a/selfdrive/ui/qt/window.cc b/selfdrive/ui/qt/window.cc index da83bb97e4..0fee52f736 100644 --- a/selfdrive/ui/qt/window.cc +++ b/selfdrive/ui/qt/window.cc @@ -12,14 +12,10 @@ MainWindow::MainWindow(QWidget *parent) : QWidget(parent) { main_layout->addWidget(homeWindow); QObject::connect(homeWindow, &HomeWindow::openSettings, this, &MainWindow::openSettings); QObject::connect(homeWindow, &HomeWindow::closeSettings, this, &MainWindow::closeSettings); - QObject::connect(&qs, &QUIState::uiUpdate, homeWindow, &HomeWindow::update); - QObject::connect(&qs, &QUIState::offroadTransition, homeWindow, &HomeWindow::offroadTransition); - QObject::connect(&qs, &QUIState::offroadTransition, homeWindow, &HomeWindow::offroadTransitionSignal); settingsWindow = new SettingsWindow(this); main_layout->addWidget(settingsWindow); QObject::connect(settingsWindow, &SettingsWindow::closeSettings, this, &MainWindow::closeSettings); - QObject::connect(&qs, &QUIState::offroadTransition, settingsWindow, &SettingsWindow::offroadTransition); QObject::connect(settingsWindow, &SettingsWindow::reviewTrainingGuide, [=]() { onboardingWindow->showTrainingGuide(); main_layout->setCurrentWidget(onboardingWindow); @@ -37,8 +33,7 @@ MainWindow::MainWindow(QWidget *parent) : QWidget(parent) { main_layout->setCurrentWidget(onboardingWindow); } - QObject::connect(&qs, &QUIState::uiUpdate, &device, &Device::update); - QObject::connect(&qs, &QUIState::offroadTransition, [=](bool offroad) { + QObject::connect(uiState(), &UIState::offroadTransition, [=](bool offroad) { if (!offroad) { closeSettings(); } @@ -79,7 +74,7 @@ void MainWindow::openSettings() { void MainWindow::closeSettings() { main_layout->setCurrentWidget(homeWindow); - if (QUIState::ui_state.scene.started) { + if (uiState()->scene.started) { homeWindow->showSidebar(false); } } diff --git a/selfdrive/ui/qt/window.h b/selfdrive/ui/qt/window.h index 069831cffe..0bd328aa8a 100644 --- a/selfdrive/ui/qt/window.h +++ b/selfdrive/ui/qt/window.h @@ -19,7 +19,6 @@ private: void closeSettings(); Device device; - QUIState qs; QStackedLayout *main_layout; HomeWindow *homeWindow; diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index 3dd044653b..a8453889cb 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -218,41 +218,43 @@ static void update_status(UIState *s) { } -QUIState::QUIState(QObject *parent) : QObject(parent) { - ui_state.sm = std::make_unique>({ +UIState::UIState(QObject *parent) : QObject(parent) { + sm = std::make_unique>({ "modelV2", "controlsState", "liveCalibration", "radarState", "deviceState", "roadCameraState", "pandaStates", "carParams", "driverMonitoringState", "sensorEvents", "carState", "liveLocationKalman", }); Params params; - ui_state.wide_camera = Hardware::TICI() ? params.getBool("EnableWideCamera") : false; - ui_state.has_prime = params.getBool("HasPrime"); + wide_camera = Hardware::TICI() ? params.getBool("EnableWideCamera") : false; + has_prime = params.getBool("HasPrime"); // update timer timer = new QTimer(this); - QObject::connect(timer, &QTimer::timeout, this, &QUIState::update); + QObject::connect(timer, &QTimer::timeout, this, &UIState::update); timer->start(1000 / UI_FREQ); } -void QUIState::update() { - update_sockets(&ui_state); - update_state(&ui_state); - update_status(&ui_state); +void UIState::update() { + update_sockets(this); + update_state(this); + update_status(this); - if (ui_state.scene.started != started_prev || ui_state.sm->frame == 1) { - started_prev = ui_state.scene.started; - emit offroadTransition(!ui_state.scene.started); + if (scene.started != started_prev || sm->frame == 1) { + started_prev = scene.started; + emit offroadTransition(!scene.started); } - if (ui_state.sm->frame % UI_FREQ == 0) { + if (sm->frame % UI_FREQ == 0) { watchdog_kick(); } - emit uiUpdate(ui_state); + emit uiUpdate(*this); } Device::Device(QObject *parent) : brightness_filter(BACKLIGHT_OFFROAD, BACKLIGHT_TS, BACKLIGHT_DT), QObject(parent) { setAwake(true); resetInteractiveTimout(); + + QObject::connect(uiState(), &UIState::uiUpdate, this, &Device::update); } void Device::update(const UIState &s) { @@ -260,7 +262,7 @@ void Device::update(const UIState &s) { updateWakefulness(s); // TODO: remove from UIState and use signals - QUIState::ui_state.awake = awake; + uiState()->awake = awake; } void Device::setAwake(bool on) { @@ -329,3 +331,8 @@ void Device::updateWakefulness(const UIState &s) { setAwake(s.scene.ignition || interactive_timeout > 0); } + +UIState *uiState() { + static UIState ui_state; + return &ui_state; +} diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 924fb8194c..7c16e4ae6f 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -101,7 +101,12 @@ typedef struct UIScene { uint64_t started_frame; } UIScene; -typedef struct UIState { +class UIState : public QObject { + Q_OBJECT + +public: + UIState(QObject* parent = 0); + int fb_w = 0, fb_h = 0; std::unique_ptr sm; @@ -114,17 +119,6 @@ typedef struct UIState { QTransform car_space_transform; bool wide_camera; -} UIState; - - -class QUIState : public QObject { - Q_OBJECT - -public: - QUIState(QObject* parent = 0); - - // TODO: get rid of this, only use signal - inline static UIState ui_state = {0}; signals: void uiUpdate(const UIState &s); @@ -138,6 +132,7 @@ private: bool started_prev = true; }; +UIState *uiState(); // device management class