diff --git a/common/params_keys.h b/common/params_keys.h index d3a9ea7d6d..4c1164da82 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -169,6 +169,7 @@ inline static std::unordered_map keys = { {"HyundaiRadarTracksConfirmed", PERSISTENT}, {"HyundaiRadarTracksPersistent", PERSISTENT}, {"HyundaiRadarTracksToggle", PERSISTENT}, + {"HyundaiRadar", PERSISTENT}, {"DynamicExperimentalControl", PERSISTENT}, }; diff --git a/opendbc_repo b/opendbc_repo index 5db6b93bc5..a905f691ee 160000 --- a/opendbc_repo +++ b/opendbc_repo @@ -1 +1 @@ -Subproject commit 5db6b93bc550edf5425d0b22e49c9bf51ec23eab +Subproject commit a905f691ee90a60940de4d6b5c5e226e0b1f97ca diff --git a/selfdrive/ui/sunnypilot/qt/offroad/settings/vehicle/hyundai_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/settings/vehicle/hyundai_settings.cc index 5f0010ac33..b3a5fd5916 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/settings/vehicle/hyundai_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/settings/vehicle/hyundai_settings.cc @@ -20,6 +20,19 @@ HyundaiSettings::HyundaiSettings(QWidget *parent) : BrandSettingsInterface(paren QObject::connect(longitudinalTuningToggle, &ButtonParamControlSP::buttonToggled, this, &HyundaiSettings::updateSettings); list->addItem(longitudinalTuningToggle); longitudinalTuningToggle->showDescription(); + + std::vector radar_tuning_texts{ tr("Off"), tr("Lead Only"), tr("Full Radar") }; + radarToggle = new ButtonParamControl( + "HyundaiRadar", + tr("Radar Tracks"), + "", + "", + radar_tuning_texts, + 500 + ); + QObject::connect(radarToggle, &ButtonParamControlSP::buttonToggled, this, &HyundaiSettings::updateSettings); + list->addItem(radarToggle); + radarToggle->showDescription(); } void HyundaiSettings::updateSettings() { @@ -54,4 +67,25 @@ void HyundaiSettings::updateSettings() { longitudinalTuningToggle->setEnabled(!longitudinal_tuning_disabled); longitudinalTuningToggle->setDescription(longitudinal_tuning_description); longitudinalTuningToggle->showDescription(); + + auto radar_param = std::atoi(params.get("HyundaiRadar").c_str()); + + RadarOption radar_option; + if (radar_param == int(RadarOption::LEAD_ONLY)) { + radar_option = RadarOption::LEAD_ONLY; + } else if (radar_param == int(RadarOption::FULL_RADAR)) { + radar_option = RadarOption::FULL_RADAR; + } else { + radar_option = RadarOption::OFF; + } + + bool radar_disabled = !offroad || !has_longitudinal_control; + QString radar_description = radarDescription(radar_option); + if (radar_disabled) { + radar_description = toggleDisableMsg(offroad, has_longitudinal_control); + } + + radarToggle->setEnabled(!radar_disabled); + radarToggle->setDescription(radar_description); + radarToggle->showDescription(); } diff --git a/selfdrive/ui/sunnypilot/qt/offroad/settings/vehicle/hyundai_settings.h b/selfdrive/ui/sunnypilot/qt/offroad/settings/vehicle/hyundai_settings.h index c94d40cfde..a4994733e5 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/settings/vehicle/hyundai_settings.h +++ b/selfdrive/ui/sunnypilot/qt/offroad/settings/vehicle/hyundai_settings.h @@ -20,6 +20,12 @@ enum class LongitudinalTuningOption { PREDICTIVE, }; +enum class RadarOption { + OFF, + LEAD_ONLY, + FULL_RADAR, +}; + class HyundaiSettings : public BrandSettingsInterface { Q_OBJECT @@ -30,6 +36,7 @@ public: private: bool has_longitudinal_control = false; ButtonParamControl *longitudinalTuningToggle = nullptr; + ButtonParamControl *radarToggle = nullptr; static QString toggleDisableMsg(bool _offroad, bool _has_longitudinal_control) { if (!_has_longitudinal_control) { @@ -62,4 +69,24 @@ private: .arg(dynamic_str) .arg(predictive_str); } + + static QString radarDescription(RadarOption option = RadarOption::OFF) { + QString off_str = tr("Off: Disables radar tracking. Vision-only vehicle detection."); + QString lead_only_str = tr("Lead Only: Tracks only the closest vehicle ahead."); + QString full_radar_str = tr("Full Radar: Tracks all nearby vehicles using radar."); + + if (option == RadarOption::LEAD_ONLY) { + lead_only_str = "" + lead_only_str + ""; + } else if (option == RadarOption::FULL_RADAR) { + full_radar_str = "" + full_radar_str + ""; + } else { + off_str = "" + off_str + ""; + } + + return QString("%1

%2
%3
%4
") + .arg(tr("Configure how radar tracks surrounding vehicles — turn it off, track only the lead, or track all.")) + .arg(off_str) + .arg(lead_only_str) + .arg(full_radar_str); + } }; diff --git a/sunnypilot/selfdrive/car/interfaces.py b/sunnypilot/selfdrive/car/interfaces.py index f2019f5ed7..a10db3e00c 100644 --- a/sunnypilot/selfdrive/car/interfaces.py +++ b/sunnypilot/selfdrive/car/interfaces.py @@ -11,7 +11,7 @@ from opendbc.car.car_helpers import can_fingerprint from opendbc.car.interfaces import CarInterfaceBase from opendbc.car.hyundai.radar_interface import RADAR_START_ADDR from opendbc.car.hyundai.values import HyundaiFlags, DBC as HYUNDAI_DBC -from opendbc.sunnypilot.car.hyundai.longitudinal.helpers import LongitudinalTuningType +from opendbc.sunnypilot.car.hyundai.longitudinal.helpers import LongitudinalTuningType, RadarType from opendbc.sunnypilot.car.hyundai.values import HyundaiFlagsSP from openpilot.common.params import Params from openpilot.common.swaglog import cloudlog @@ -77,6 +77,19 @@ def _initialize_radar_tracks(CP: structs.CarParams, CP_SP: structs.CarParamsSP, CP.radarUnavailable = False +def _initialize_radar(CI: CarInterfaceBase, CP: structs.CarParams, CP_SP: structs.CarParamsSP, params: Params = None) -> None: + if params is None: + params = Params() + + # Hyundai Radar + if CP.brand == 'hyundai': + hyundai_radar = int(params.get("HyundaiRadar", encoding="utf8") or 0) + if hyundai_radar == RadarType.LEAD_ONLY: + CP_SP.flags |= HyundaiFlagsSP.RADAR_LEAD_ONLY.value + if hyundai_radar == RadarType.FULL_RADAR: + CP_SP.flags |= HyundaiFlagsSP.RADAR_FULL_RADAR.value + + def setup_interfaces(CI: CarInterfaceBase, params: Params = None) -> None: CP = CI.CP CP_SP = CI.CP_SP @@ -84,6 +97,7 @@ def setup_interfaces(CI: CarInterfaceBase, params: Params = None) -> None: _initialize_custom_longitudinal_tuning(CI, CP, CP_SP, params) _initialize_neural_network_lateral_control(CI, CP, CP_SP, params) _initialize_radar_tracks(CP, CP_SP, params) + _initialize_radar(CI, CP, CP_SP, params) def _enable_radar_tracks(CP: structs.CarParams, CP_SP: structs.CarParamsSP, can_recv: CanRecvCallable, diff --git a/system/manager/manager.py b/system/manager/manager.py index 71f2bc525a..3fa6f636c3 100755 --- a/system/manager/manager.py +++ b/system/manager/manager.py @@ -46,6 +46,7 @@ def manager_init() -> None: ("AutoLaneChangeBsmDelay", "0"), ("DynamicExperimentalControl", "0"), ("HyundaiLongitudinalTuning", "0"), + ("HyundaiRadar", "0"), ("Mads", "1"), ("MadsMainCruiseAllowed", "1"), ("MadsSteeringMode", "0"),