From f7fc476f885e4440b6db3de629edffc7733dd6e0 Mon Sep 17 00:00:00 2001 From: FrogAi <91348155+FrogAi@users.noreply.github.com> Date: Fri, 10 May 2024 11:42:09 -0700 Subject: [PATCH] Controls - Experimental Mode Activation - Double Tap the UI Enable/disable 'Experimental Mode' by double tapping the onroad UI within a 0.5 second time frame. --- selfdrive/ui/qt/onroad.cc | 25 +++++++++++++++++++++++++ selfdrive/ui/qt/onroad.h | 3 +++ selfdrive/ui/ui.cc | 2 ++ selfdrive/ui/ui.h | 1 + 4 files changed, 31 insertions(+) diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index 8faf2dc..27cad10 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -66,6 +67,12 @@ OnroadWindow::OnroadWindow(QWidget *parent) : QWidget(parent), scene(uiState()-> QObject::connect(uiState(), &UIState::uiUpdate, this, &OnroadWindow::updateState); QObject::connect(uiState(), &UIState::offroadTransition, this, &OnroadWindow::offroadTransition); QObject::connect(uiState(), &UIState::primeChanged, this, &OnroadWindow::primeChanged); + + QObject::connect(&clickTimer, &QTimer::timeout, this, [this]() { + clickTimer.stop(); + QMouseEvent *event = new QMouseEvent(QEvent::MouseButtonPress, timeoutPoint, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QApplication::postEvent(this, event); + }); } void OnroadWindow::updateState(const UIState &s) { @@ -93,6 +100,24 @@ void OnroadWindow::updateState(const UIState &s) { } void OnroadWindow::mousePressEvent(QMouseEvent* e) { + // FrogPilot clickable widgets + if (scene.experimental_mode_via_screen && e->pos() != timeoutPoint) { + if (clickTimer.isActive()) { + clickTimer.stop(); + + if (scene.conditional_experimental) { + int override_value = (scene.conditional_status >= 1 && scene.conditional_status <= 6) ? 0 : (scene.conditional_status >= 7 ? 5 : 6); + paramsMemory.putIntNonBlocking("CEStatus", override_value); + } else { + bool experimentalMode = params.getBool("ExperimentalMode"); + params.putBoolNonBlocking("ExperimentalMode", !experimentalMode); + } + } else { + clickTimer.start(500); + } + return; + } + #ifdef ENABLE_MAPS if (map != nullptr) { // Switch between map and sidebar when using navigate on openpilot diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h index aa4aa39..487dca4 100644 --- a/selfdrive/ui/qt/onroad.h +++ b/selfdrive/ui/qt/onroad.h @@ -207,6 +207,9 @@ private: Params params; Params paramsMemory{"/dev/shm/params"}; + QPoint timeoutPoint = QPoint(420, 69); + QTimer clickTimer; + private slots: void offroadTransition(bool offroad); void primeChanged(bool prime); diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index 8e41cbf..be6dc02 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -272,6 +272,8 @@ void ui_update_frogpilot_params(UIState *s) { bool driving_personalities = scene.longitudinal_control && params.getBool("DrivingPersonalities"); scene.onroad_distance_button = driving_personalities && params.getBool("OnroadDistanceButton"); scene.use_kaofui_icons = scene.onroad_distance_button && params.getBool("KaofuiIcons"); + + scene.experimental_mode_via_screen = scene.longitudinal_control && params.getBool("ExperimentalModeActivation") && params.getBool("ExperimentalModeViaTap"); } void UIState::updateStatus() { diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 8d71ec7..c51963b 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -188,6 +188,7 @@ typedef struct UIScene { bool conditional_experimental; bool enabled; bool experimental_mode; + bool experimental_mode_via_screen; bool map_open; bool online; bool onroad_distance_button;