From 763ee059d47c136129aa51d5da1473b765aa1424 Mon Sep 17 00:00:00 2001 From: FrogAi <91348155+FrogAi@users.noreply.github.com> Date: Fri, 12 Jan 2024 22:39:30 -0700 Subject: [PATCH] Camera view selection Added toggle to select the preferred camera view between "auto", "standard", "wide", and "driver". --- common/params.cc | 1 + .../assets/toggle_icons/icon_camera.png | Bin 0 -> 27136 bytes selfdrive/frogpilot/ui/visual_settings.cc | 10 +++++++++- selfdrive/ui/qt/onroad.cc | 6 ++++-- selfdrive/ui/qt/onroad.h | 1 + selfdrive/ui/ui.cc | 1 + selfdrive/ui/ui.h | 1 + 7 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 selfdrive/frogpilot/assets/toggle_icons/icon_camera.png diff --git a/common/params.cc b/common/params.cc index 51cd4dd..14d2694 100644 --- a/common/params.cc +++ b/common/params.cc @@ -218,6 +218,7 @@ std::unordered_map keys = { {"AlwaysOnLateralMain", PERSISTENT}, {"ApiCache_DriveStats", PERSISTENT}, {"AverageCurvature", PERSISTENT}, + {"CameraView", PERSISTENT}, {"FrogPilotTogglesUpdated", PERSISTENT}, {"GasRegenCmd", PERSISTENT}, {"LateralTune", PERSISTENT}, diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_camera.png b/selfdrive/frogpilot/assets/toggle_icons/icon_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..b34afe36b8d70857c205c989316bdca0f29ded2a GIT binary patch literal 27136 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 G1^*9i*v#$# literal 0 HcmV?d00001 diff --git a/selfdrive/frogpilot/ui/visual_settings.cc b/selfdrive/frogpilot/ui/visual_settings.cc index 5fea03c..e7ef0ee 100644 --- a/selfdrive/frogpilot/ui/visual_settings.cc +++ b/selfdrive/frogpilot/ui/visual_settings.cc @@ -3,12 +3,20 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(SettingsWindow *parent) : FrogPilotListWidget(parent) { const std::vector> visualToggles { + {"CameraView", "Camera View", "Choose your preferred camera view for the onroad UI. This is a visual change only and doesn't impact openpilot.", "../frogpilot/assets/toggle_icons/icon_camera.png"}, }; for (const auto &[param, title, desc, icon] : visualToggles) { ParamControl *toggle; - toggle = new ParamControl(param, title, desc, icon, this); + if (param == "CameraView") { + std::vector cameraOptions{tr("Auto"), tr("Standard"), tr("Wide"), tr("Driver")}; + FrogPilotButtonParamControl *preferredCamera = new FrogPilotButtonParamControl(param, title, desc, icon, cameraOptions); + toggle = preferredCamera; + + } else { + toggle = new ParamControl(param, title, desc, icon, this); + } addItem(toggle); toggles[param.toStdString()] = toggle; diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index a61d804..e678b47 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -651,11 +651,12 @@ void AnnotatedCameraWidget::paintGL() { } else if (v_ego > 15) { wide_cam_requested = false; } - wide_cam_requested = wide_cam_requested && sm["controlsState"].getControlsState().getExperimentalMode(); + wide_cam_requested = wide_cam_requested && sm["controlsState"].getControlsState().getExperimentalMode() || cameraView == 2; // for replay of old routes, never go to widecam wide_cam_requested = wide_cam_requested && s->scene.calibration_wide_valid; } - CameraWidget::setStreamType(wide_cam_requested ? VISION_STREAM_WIDE_ROAD : VISION_STREAM_ROAD); + CameraWidget::setStreamType(cameraView == 3 ? VISION_STREAM_DRIVER : + wide_cam_requested && cameraView != 1 ? VISION_STREAM_WIDE_ROAD : VISION_STREAM_ROAD); s->scene.wide_cam = CameraWidget::getStreamType() == VISION_STREAM_WIDE_ROAD; if (s->scene.calibration_valid) { @@ -740,6 +741,7 @@ void AnnotatedCameraWidget::initializeFrogPilotWidgets() { void AnnotatedCameraWidget::updateFrogPilotWidgets(QPainter &p) { alwaysOnLateral = scene.always_on_lateral_active; + cameraView = scene.camera_view; experimentalMode = scene.experimental_mode; if (alwaysOnLateral) { diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h index af6ebe5..dd3bf71 100644 --- a/selfdrive/ui/qt/onroad.h +++ b/selfdrive/ui/qt/onroad.h @@ -119,6 +119,7 @@ private: bool alwaysOnLateral; bool experimentalMode; + int cameraView; protected: void paintGL() override; diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index 9d38679..1f8205d 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -249,6 +249,7 @@ void ui_update_params(UIState *s) { UIScene &scene = s->scene; scene.always_on_lateral = params.getBool("AlwaysOnLateral"); + scene.camera_view = params.getInt("CameraView"); } void UIState::updateStatus() { diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 6be81e7..13893f7 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -173,6 +173,7 @@ typedef struct UIScene { bool always_on_lateral_active; bool enabled; bool experimental_mode; + int camera_view; } UIScene;