diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 43559b88b2..4d8f596cad 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -29,6 +29,9 @@ sunnypilot - 0.9.7.0 (2024-05-xx) * When Forced Offroad mode is on, allows changing offroad-only settings even when the car is turned on * NEW❗: Ford CAN-FD longitudinal * NEW❗: Parse speed limit sign recognition from camera for certain supported platforms +* UPDATED: Pause Lateral Below Speed w/ Blinker + * NEW❗: Customizable Pause Lateral Speed + * Pause lateral actuation with blinker when traveling below the desired speed selected. Default is 20 MPH or 32 km/h. * UPDATED: Hyundai CAN Longitudinal * Auto-enable radar tracks on platforms with applicable Mando radar * UPDATED: Hyundai CAN-FD Radar-based SCC diff --git a/common/params.cc b/common/params.cc index 6ef443f1b9..8642d0ae68 100644 --- a/common/params.cc +++ b/common/params.cc @@ -291,6 +291,7 @@ std::unordered_map keys = { {"OsmWayTest", PERSISTENT}, {"OsmDownloadedDate", PERSISTENT}, {"PathOffset", PERSISTENT | BACKUP}, + {"PauseLateralSpeed", PERSISTENT | BACKUP}, {"QuietDrive", PERSISTENT | BACKUP}, {"RoadEdge", PERSISTENT | BACKUP}, {"ReverseAccChange", PERSISTENT | BACKUP}, diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index fc9715cb82..df6efebe69 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -220,7 +220,9 @@ class CarInterfaceBase(ABC): self.gear_warning = 0 self.cruise_cancelled_btn = True self.acc_mads_combo = self.param_s.get_bool("AccMadsCombo") + self.is_metric = self.param_s.get_bool("IsMetric") self.below_speed_pause = self.param_s.get_bool("BelowSpeedPause") + self.pause_lateral_speed = self.param_s.get("PauseLateralSpeed", encoding="utf8") self.prev_acc_mads_combo = False self.mads_event_lock = True self.gap_button_counter = 0 @@ -606,7 +608,10 @@ class CarInterfaceBase(ABC): if self.CP.openpilotLongitudinalControl: self.toggle_exp_mode(gap_button) - cs_out.belowLaneChangeSpeed = cs_out.vEgo < LANE_CHANGE_SPEED_MIN and self.below_speed_pause + below_lateral_speed = LANE_CHANGE_SPEED_MIN if not self.pause_lateral_speed else \ + self.pause_lateral_speed * (CV.KPH_TO_MS if self.is_metric else CV.MPH_TO_MS) + + cs_out.belowLaneChangeSpeed = cs_out.vEgo < below_lateral_speed and self.below_speed_pause if cs_out.gearShifter in [GearShifter.park, GearShifter.reverse] or cs_out.doorOpen or \ (cs_out.seatbeltUnlatched and cs_out.gearShifter != GearShifter.park): @@ -708,6 +713,10 @@ class CarInterfaceBase(ABC): def sp_update_params(self): self.experimental_mode = self.param_s.get_bool("ExperimentalMode") self._frame += 1 + if self._frame % 100 == 0: + self.is_metric = self.param_s.get_bool("IsMetric") + self.below_speed_pause = self.param_s.get_bool("BelowSpeedPause") + self.pause_lateral_speed = self.param_s.get("PauseLateralSpeed", encoding="utf8") if self._frame % 300 == 0: self._frame = 0 self.reverse_dm_cam = self.param_s.get_bool("ReverseDmCam") diff --git a/selfdrive/manager/manager.py b/selfdrive/manager/manager.py index 59b7a2aa8b..13eac7f59a 100755 --- a/selfdrive/manager/manager.py +++ b/selfdrive/manager/manager.py @@ -80,6 +80,7 @@ def manager_init() -> None: ("OnroadScreenOffEvent", "1"), ("OnroadSettings", "1"), ("PathOffset", "0"), + ("PauseLateralSpeed", "0"), ("ReverseAccChange", "0"), ("ScreenRecorder", "1"), ("ShowDebugUI", "1"), diff --git a/selfdrive/ui/qt/offroad/sunnypilot/lane_change_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/lane_change_settings.cc index e24425a6fc..cc5bab87de 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/lane_change_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/lane_change_settings.cc @@ -16,7 +16,7 @@ LaneChangeSettings::LaneChangeSettings(QWidget* parent) : QWidget(parent) { { "BelowSpeedPause", tr("Pause Lateral Below Speed w/ Blinker"), - tr("Enable this toggle to pause lateral actuation with blinker when traveling below 20 MPH or 32 km/h."), + tr("Enable this toggle to pause lateral actuation with blinker when traveling below the desired speed selected below."), "../assets/offroad/icon_blank.png", }, { @@ -41,16 +41,32 @@ LaneChangeSettings::LaneChangeSettings(QWidget* parent) : QWidget(parent) { connect(auto_lane_change_timer, &AutoLaneChangeTimer::updateOtherToggles, this, &LaneChangeSettings::updateToggles); list->addItem(auto_lane_change_timer); + // Pause Lateral Below Speed w/ Blinker + pause_lateral_speed = new PauseLateralSpeed(); + pause_lateral_speed->showDescription(); + connect(pause_lateral_speed, &SPOptionControl::updateLabels, pause_lateral_speed, &PauseLateralSpeed::refresh); + for (auto &[param, title, desc, icon] : toggle_defs) { auto toggle = new ParamControl(param, title, desc, icon, this); list->addItem(toggle); toggles[param.toStdString()] = toggle; + if (param == "BelowSpeedPause") { + list->addItem(pause_lateral_speed); + } + // trigger offroadTransition when going onroad/offroad connect(uiState(), &UIState::offroadTransition, toggle, &ParamControl::setEnabled); } + connect(toggles["BelowSpeedPause"], &ToggleControl::toggleFlipped, [=](bool state) { + pause_lateral_speed->setEnabled(state); + pause_lateral_speed->setVisible(state); + }); + pause_lateral_speed->setEnabled(toggles["BelowSpeedPause"]->isToggled()); + pause_lateral_speed->setVisible(toggles["BelowSpeedPause"]->isToggled()); + main_layout->addWidget(new ScrollView(list, this)); } @@ -111,3 +127,25 @@ void AutoLaneChangeTimer::refresh() { setLabel("2 " + second); } } + +PauseLateralSpeed::PauseLateralSpeed() : SPOptionControl ( + "PauseLateralSpeed", + "", + tr("Pause lateral actuation with blinker when traveling below the desired speed selected. Default is 20 MPH or 32 km/h."), + "../assets/offroad/icon_blank.png", + {0, 255}, + 5) { + + refresh(); +} + +void PauseLateralSpeed::refresh() { + QString option = QString:: fromStdString(params.get("PauseLateralSpeed")); + bool is_metric = params.getBool("IsMetric"); + + if (option == "0") { + setLabel(tr("Default")); + } else { + setLabel(option + " " + (is_metric ? tr("km/h") : tr("mph"))); + } +} diff --git a/selfdrive/ui/qt/offroad/sunnypilot/lane_change_settings.h b/selfdrive/ui/qt/offroad/sunnypilot/lane_change_settings.h index 86bdd3ede3..066f4821e2 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/lane_change_settings.h +++ b/selfdrive/ui/qt/offroad/sunnypilot/lane_change_settings.h @@ -19,6 +19,22 @@ private: Params params; }; +class PauseLateralSpeed : public SPOptionControl { + Q_OBJECT + +public: + PauseLateralSpeed(); + + void refresh(); + + signals: + void ToggleUpdated(); + +private: + Params params; +}; + + class LaneChangeSettings : public QWidget { Q_OBJECT @@ -37,4 +53,5 @@ private: std::map toggles; AutoLaneChangeTimer *auto_lane_change_timer; -}; + PauseLateralSpeed *pause_lateral_speed; +}; \ No newline at end of file