diff --git a/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.cc index 5c3b03d2af..1696c7f63a 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.cc @@ -7,6 +7,8 @@ #include "selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.h" +#include "selfdrive/ui/sunnypilot/qt/util.h" + SpeedLimitSettings::SpeedLimitSettings(QWidget *parent) : QStackedWidget(parent) { subPanelFrame = new QFrame(); QVBoxLayout *subPanelLayout = new QVBoxLayout(subPanelFrame); @@ -109,7 +111,7 @@ void SpeedLimitSettings::refresh() { QString offsetLabel = QString::fromStdString(params.get("SpeedLimitValueOffset")); bool has_longitudinal_control; - bool intelligent_cruise_button_management_available; + bool has_icbm; auto cp_bytes = params.get("CarParamsPersistent"); auto cp_sp_bytes = params.get("CarParamsSPPersistent"); if (!cp_bytes.empty() && !cp_sp_bytes.empty()) { @@ -121,16 +123,16 @@ void SpeedLimitSettings::refresh() { cereal::CarParamsSP::Reader CP_SP = cmsg_sp.getRoot(); has_longitudinal_control = hasLongitudinalControl(CP); - intelligent_cruise_button_management_available = CP_SP.getIntelligentCruiseButtonManagementAvailable(); + has_icbm = hasIntelligentCruiseButtonManagement(CP_SP); - if (!has_longitudinal_control && CP_SP.getPcmCruiseSpeed()) { + if (!has_longitudinal_control && !has_icbm) { if (speed_limit_mode_param == SpeedLimitMode::ASSIST) { params.put("SpeedLimitMode", std::to_string(static_cast(SpeedLimitMode::WARNING))); } } } else { has_longitudinal_control = false; - intelligent_cruise_button_management_available = false; + has_icbm = false; } speed_limit_mode_settings->setDescription(modeDescription(speed_limit_mode_param)); @@ -150,13 +152,14 @@ void SpeedLimitSettings::refresh() { speed_limit_offset->showDescription(); } - if (has_longitudinal_control || intelligent_cruise_button_management_available) { + if (has_longitudinal_control || has_icbm) { speed_limit_mode_settings->setEnableSelectedButtons(true, convertSpeedLimitModeValues(getSpeedLimitModeValues())); } else { speed_limit_mode_settings->setEnableSelectedButtons(true, convertSpeedLimitModeValues( {SpeedLimitMode::OFF, SpeedLimitMode::INFORMATION, SpeedLimitMode::WARNING})); } + speed_limit_mode_settings->refresh(); speed_limit_mode_settings->showDescription(); speed_limit_offset->showDescription(); } diff --git a/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.h b/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.h index 23fa7b4ece..69e85814c2 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.h +++ b/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal/speed_limit/speed_limit_settings.h @@ -35,6 +35,7 @@ private: SpeedLimitPolicy *speedLimitPolicyScreen; ButtonParamControlSP *speed_limit_offset_settings; OptionControlSP *speed_limit_offset; + bool icbm_available = false; static QString offsetDescription(SpeedLimitOffsetType type = SpeedLimitOffsetType::NONE) { QString none_str = tr("⦿ None: No Offset"); diff --git a/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal_panel.cc b/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal_panel.cc index f2c7ea3825..2cc59ea333 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal_panel.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal_panel.cc @@ -7,6 +7,8 @@ #include "selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal_panel.h" +#include "selfdrive/ui/sunnypilot/qt/util.h" + LongitudinalPanel::LongitudinalPanel(QWidget *parent) : QWidget(parent) { setStyleSheet(R"( #back_btn { @@ -40,7 +42,9 @@ LongitudinalPanel::LongitudinalPanel(QWidget *parent) : QWidget(parent) { "", this ); - intelligentCruiseButtonManagement->setConfirmation(true, false); + QObject::connect(intelligentCruiseButtonManagement, &ParamControlSP::toggleFlipped, this, [=](bool) { + refresh(offroad); + }); list->addItem(intelligentCruiseButtonManagement); dynamicExperimentalControl = new ParamControlSP( @@ -112,22 +116,41 @@ void LongitudinalPanel::refresh(bool _offroad) { has_longitudinal_control = hasLongitudinalControl(CP); is_pcm_cruise = CP.getPcmCruise(); - intelligent_cruise_button_management_available = CP_SP.getIntelligentCruiseButtonManagementAvailable(); + has_icbm = hasIntelligentCruiseButtonManagement(CP_SP); - if (!intelligent_cruise_button_management_available || has_longitudinal_control) { + if (CP_SP.getIntelligentCruiseButtonManagementAvailable() && !has_longitudinal_control) { + intelligentCruiseButtonManagement->setEnabled(offroad); + } else { params.remove("IntelligentCruiseButtonManagement"); + intelligentCruiseButtonManagement->setEnabled(false); } - if (!has_longitudinal_control && CP_SP.getPcmCruiseSpeed()) { + if (has_longitudinal_control || has_icbm) { + // enable Custom ACC Increments when long is available and is not PCM cruise + customAccIncrement->setEnabled(((has_longitudinal_control && !is_pcm_cruise) || has_icbm) && offroad); + dynamicExperimentalControl->setEnabled(has_longitudinal_control); + SmartCruiseControlVision->setEnabled(true); + SmartCruiseControlMap->setEnabled(true); + } else { params.remove("CustomAccIncrementsEnabled"); params.remove("DynamicExperimentalControl"); params.remove("SmartCruiseControlVision"); params.remove("SmartCruiseControlMap"); + customAccIncrement->setEnabled(false); + dynamicExperimentalControl->setEnabled(false); + SmartCruiseControlVision->setEnabled(false); + SmartCruiseControlMap->setEnabled(false); } + + intelligentCruiseButtonManagement->refresh(); + customAccIncrement->refresh(); + dynamicExperimentalControl->refresh(); + SmartCruiseControlVision->refresh(); + SmartCruiseControlMap->refresh(); } else { has_longitudinal_control = false; is_pcm_cruise = false; - intelligent_cruise_button_management_available = false; + has_icbm = false; } QString accEnabledDescription = tr("Enable custom Short & Long press increments for cruise speed increase/decrease."); @@ -139,8 +162,8 @@ void LongitudinalPanel::refresh(bool _offroad) { customAccIncrement->setDescription(onroadOnlyDescription); customAccIncrement->showDescription(); } else { - if (has_longitudinal_control || intelligent_cruise_button_management_available) { - if (is_pcm_cruise) { + if (has_longitudinal_control || has_icbm) { + if (has_longitudinal_control && is_pcm_cruise) { customAccIncrement->setDescription(accPcmCruiseDisabledDescription); customAccIncrement->showDescription(); } else { @@ -150,21 +173,8 @@ void LongitudinalPanel::refresh(bool _offroad) { customAccIncrement->toggleFlipped(false); customAccIncrement->setDescription(accNoLongDescription); customAccIncrement->showDescription(); - intelligentCruiseButtonManagement->toggleFlipped(false); } } - bool icbm_allowed = intelligent_cruise_button_management_available && !has_longitudinal_control; - intelligentCruiseButtonManagement->setEnabled(icbm_allowed && offroad); - - // enable toggle when long is available and is not PCM cruise - bool cai_allowed = (has_longitudinal_control && !is_pcm_cruise) || icbm_allowed; - customAccIncrement->setEnabled(cai_allowed && !offroad); - customAccIncrement->refresh(); - - dynamicExperimentalControl->setEnabled(has_longitudinal_control); - SmartCruiseControlVision->setEnabled(has_longitudinal_control || icbm_allowed); - SmartCruiseControlMap->setEnabled(has_longitudinal_control || icbm_allowed); - offroad = _offroad; } diff --git a/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal_panel.h b/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal_panel.h index 127b7871eb..2b9c0b8968 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal_panel.h +++ b/selfdrive/ui/sunnypilot/qt/offroad/settings/longitudinal_panel.h @@ -25,7 +25,7 @@ private: Params params; bool has_longitudinal_control = false; bool is_pcm_cruise = false; - bool intelligent_cruise_button_management_available = false;; + bool has_icbm = false; bool offroad = false; QStackedLayout *main_layout = nullptr; diff --git a/selfdrive/ui/sunnypilot/qt/util.cc b/selfdrive/ui/sunnypilot/qt/util.cc index be39b297d7..eaa1f4bd12 100644 --- a/selfdrive/ui/sunnypilot/qt/util.cc +++ b/selfdrive/ui/sunnypilot/qt/util.cc @@ -122,3 +122,7 @@ std::optional loadCerealEvent(Params& params, const std:: return std::nullopt; } } + +bool hasIntelligentCruiseButtonManagement(const cereal::CarParamsSP::Reader &car_params_sp) { + return car_params_sp.getIntelligentCruiseButtonManagementAvailable() && Params().getBool("IntelligentCruiseButtonManagement"); +} diff --git a/selfdrive/ui/sunnypilot/qt/util.h b/selfdrive/ui/sunnypilot/qt/util.h index 4b9d615ce5..60a73615ba 100644 --- a/selfdrive/ui/sunnypilot/qt/util.h +++ b/selfdrive/ui/sunnypilot/qt/util.h @@ -23,3 +23,4 @@ std::optional getParamIgnoringDefault(const std::string ¶m_name, co QMap loadPlatformList(); QStringList searchFromList(const QString &query, const QStringList &list); std::optional loadCerealEvent(Params& params, const std::string& _param); +bool hasIntelligentCruiseButtonManagement(const cereal::CarParamsSP::Reader &car_params_sp);