From ce941e9f25a4516af2c708975a59c77e798ca189 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Mon, 9 Feb 2026 20:50:52 -0600 Subject: [PATCH] Truck Tuning --- common/params.cc | 1 + frogpilot/common/frogpilot_variables.py | 15 ++++++++- .../controls/lib/frogpilot_acceleration.py | 33 +++++++++++++------ .../ui/qt/offroad/longitudinal_settings.cc | 25 ++++++++++++++ .../ui/qt/offroad/longitudinal_settings.h | 2 +- 5 files changed, 64 insertions(+), 12 deletions(-) diff --git a/common/params.cc b/common/params.cc index c7cae02ff..fe80e6091 100644 --- a/common/params.cc +++ b/common/params.cc @@ -323,6 +323,7 @@ std::unordered_map keys = { {"EngageVolume", PERSISTENT}, {"ExperimentalGMTune", PERSISTENT}, {"EVTuning", PERSISTENT}, + {"TruckTuning", PERSISTENT}, {"Fahrenheit", PERSISTENT}, {"FavoriteDestinations", PERSISTENT | DONT_LOG}, {"FlashPanda", CLEAR_ON_MANAGER_START}, diff --git a/frogpilot/common/frogpilot_variables.py b/frogpilot/common/frogpilot_variables.py index 7b33464f8..589b222f9 100644 --- a/frogpilot/common/frogpilot_variables.py +++ b/frogpilot/common/frogpilot_variables.py @@ -133,6 +133,7 @@ frogpilot_default_params: list[tuple[str, str | bytes, int, str]] = [ ("AdvancedLateralTune", "1", 2, "0"), ("AdvancedLongitudinalTune", "0", 3, "0"), ("EVTuning", "", 3, "0"), + ("TruckTuning", "0", 3, "0"), ("AggressiveFollow", "1.25", 2, "1.25"), ("AggressiveFollowHigh", "1.25", 2, "1.25"), ("AggressiveJerkAcceleration", "50", 3, "50"), @@ -634,7 +635,19 @@ class FrogPilotVariables: if params.get("EVTuning") == b"": params.put_bool("EVTuning", ev_vehicle) - toggle.ev_tuning = params.get_bool("EVTuning") if advanced_longitudinal_tuning and tuning_level >= level["EVTuning"] else ev_vehicle + if params.get("TruckTuning") == b"": + params.put_bool("TruckTuning", False) + + ev_tuning_param = params.get_bool("EVTuning") + truck_tuning_param = params.get_bool("TruckTuning") + + # Enforce exclusivity between EV and Truck tuning. + if truck_tuning_param and ev_tuning_param: + ev_tuning_param = False + params.put_bool("EVTuning", False) + + toggle.ev_tuning = ev_tuning_param if advanced_longitudinal_tuning and tuning_level >= level["EVTuning"] else ev_vehicle + toggle.truck_tuning = truck_tuning_param if advanced_longitudinal_tuning and tuning_level >= level["TruckTuning"] else False toggle.longitudinalActuatorDelay = np.clip(params.get_float("LongitudinalActuatorDelay"), 0, 1) if advanced_longitudinal_tuning and tuning_level >= level["LongitudinalActuatorDelay"] else longitudinalActuatorDelay toggle.startAccel = np.clip(params.get_float("StartAccel"), 0, 4) if advanced_longitudinal_tuning and tuning_level >= level["StartAccel"] else startAccel toggle.stopAccel = np.clip(params.get_float("StopAccel"), -4, 0) if advanced_longitudinal_tuning and tuning_level >= level["StopAccel"] else stopAccel diff --git a/frogpilot/controls/lib/frogpilot_acceleration.py b/frogpilot/controls/lib/frogpilot_acceleration.py index 6b3a6f9f2..93d340d3f 100644 --- a/frogpilot/controls/lib/frogpilot_acceleration.py +++ b/frogpilot/controls/lib/frogpilot_acceleration.py @@ -55,15 +55,27 @@ A_CRUISE_MIN_SPORT = A_CRUISE_MIN * 2 A_CRUISE_MAX_BP_CUSTOM = [0.0, 5., 10., 15., 20., 25., 40.] A_CRUISE_MAX_VALS_ECO_EV = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] A_CRUISE_MAX_VALS_SPORT_EV = [1.25, 1.25, 1.25, 1.25, 1.5, 1.5, 2.0] -A_CRUISE_MAX_VALS_ECO_GAS = [6.0, 1.40, 0.90, 0.65, 0.60, 0.55, 0.42] -A_CRUISE_MAX_VALS_SPORT_GAS = [6.0, 1.50, 1.00, 0.72, 0.65, 0.60, 0.45] +A_CRUISE_MAX_VALS_ECO_GAS = [2.0, 1.5, 1.0, 0.8, 0.6, 0.4, 0.2] +A_CRUISE_MAX_VALS_SPORT_GAS = [3.0, 2.5, 2.0, 1.5, 1.0, 0.8, 0.6] +A_CRUISE_MAX_VALS_ECO_TRUCK = [6.0, 1.40, 0.90, 0.65, 0.60, 0.55, 0.42] +A_CRUISE_MAX_VALS_SPORT_TRUCK = [6.0, 1.50, 1.00, 0.72, 0.65, 0.60, 0.45] -def get_max_accel_eco(v_ego, ev_tuning=True): - cruise_vals = A_CRUISE_MAX_VALS_ECO_EV if ev_tuning else A_CRUISE_MAX_VALS_ECO_GAS +def get_max_accel_eco(v_ego, ev_tuning=True, truck_tuning=False): + if ev_tuning: + cruise_vals = A_CRUISE_MAX_VALS_ECO_EV + elif truck_tuning: + cruise_vals = A_CRUISE_MAX_VALS_ECO_TRUCK + else: + cruise_vals = A_CRUISE_MAX_VALS_ECO_GAS return float(akima_interp(v_ego, A_CRUISE_MAX_BP_CUSTOM, cruise_vals)) -def get_max_accel_sport(v_ego, ev_tuning=True): - cruise_vals = A_CRUISE_MAX_VALS_SPORT_EV if ev_tuning else A_CRUISE_MAX_VALS_SPORT_GAS +def get_max_accel_sport(v_ego, ev_tuning=True, truck_tuning=False): + if ev_tuning: + cruise_vals = A_CRUISE_MAX_VALS_SPORT_EV + elif truck_tuning: + cruise_vals = A_CRUISE_MAX_VALS_SPORT_TRUCK + else: + cruise_vals = A_CRUISE_MAX_VALS_SPORT_GAS return float(akima_interp(v_ego, A_CRUISE_MAX_BP_CUSTOM, cruise_vals)) def get_max_accel_low_speeds(max_accel, v_cruise): @@ -86,22 +98,23 @@ class FrogPilotAcceleration: eco_gear = sm["frogpilotCarState"].ecoGear sport_gear = sm["frogpilotCarState"].sportGear ev_tuning = frogpilot_toggles.ev_tuning + truck_tuning = frogpilot_toggles.truck_tuning if sm["frogpilotCarState"].trafficModeEnabled: self.max_accel = get_max_accel(v_ego) elif frogpilot_toggles.map_acceleration and (eco_gear or sport_gear): if eco_gear: - self.max_accel = get_max_accel_eco(v_ego, ev_tuning) + self.max_accel = get_max_accel_eco(v_ego, ev_tuning, truck_tuning) else: if frogpilot_toggles.acceleration_profile == 2: - self.max_accel = get_max_accel_sport(v_ego, ev_tuning) + self.max_accel = get_max_accel_sport(v_ego, ev_tuning, truck_tuning) else: self.max_accel = get_max_allowed_accel(v_ego) else: if frogpilot_toggles.acceleration_profile == 1: - self.max_accel = get_max_accel_eco(v_ego, ev_tuning) + self.max_accel = get_max_accel_eco(v_ego, ev_tuning, truck_tuning) elif frogpilot_toggles.acceleration_profile == 2: - self.max_accel = get_max_accel_sport(v_ego, ev_tuning) + self.max_accel = get_max_accel_sport(v_ego, ev_tuning, truck_tuning) elif frogpilot_toggles.acceleration_profile == 3: self.max_accel = get_max_allowed_accel(v_ego) else: diff --git a/frogpilot/ui/qt/offroad/longitudinal_settings.cc b/frogpilot/ui/qt/offroad/longitudinal_settings.cc index c22ea10fa..5d44b3ed8 100644 --- a/frogpilot/ui/qt/offroad/longitudinal_settings.cc +++ b/frogpilot/ui/qt/offroad/longitudinal_settings.cc @@ -103,6 +103,10 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel( "vehicle's detected powertrain type but can be overridden if the " "automatic choice doesn't match."), ""}, + {"TruckTuning", tr("Truck Tuning"), + tr("Use aggressive acceleration profiles tuned for trucks. " + "Intended for heavy vehicles that need stronger throttle."), + ""}, {"LongitudinalActuatorDelay", longitudinalActuatorDelay != 0 ? QString(tr("Actuator Delay (Default: %1)")) @@ -1125,6 +1129,21 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel( &FrogPilotLongitudinalPanel::updateToggles); } + QObject::connect(static_cast(toggles["EVTuning"]), + &ToggleControl::toggleFlipped, this, [this]() { + if (params.getBool("EVTuning")) { + params.putBool("TruckTuning", false); + } + updateToggles(); + }); + QObject::connect(static_cast(toggles["TruckTuning"]), + &ToggleControl::toggleFlipped, this, [this]() { + if (params.getBool("TruckTuning")) { + params.putBool("EVTuning", false); + } + updateToggles(); + }); + FrogPilotParamValueControl *trafficFollowToggle = static_cast(toggles["TrafficFollow"]); FrogPilotParamValueControl *trafficAccelerationToggle = @@ -1636,6 +1655,12 @@ void FrogPilotLongitudinalPanel::updateToggles() { setVisible &= !isToyota || !params.getBool("FrogsGoMoosTweak"); } + if (key == "EVTuning") { + toggle->setEnabled(!params.getBool("TruckTuning")); + } else if (key == "TruckTuning") { + toggle->setEnabled(!params.getBool("EVTuning")); + } + toggle->setVisible(setVisible); if (setVisible) { diff --git a/frogpilot/ui/qt/offroad/longitudinal_settings.h b/frogpilot/ui/qt/offroad/longitudinal_settings.h index e6f9122ab..68f4784c5 100644 --- a/frogpilot/ui/qt/offroad/longitudinal_settings.h +++ b/frogpilot/ui/qt/offroad/longitudinal_settings.h @@ -40,7 +40,7 @@ private: std::map toggles; - QSet advancedLongitudinalTuneKeys = {"EVTuning", "LongitudinalActuatorDelay", "StartAccel", "StopAccel", "StoppingDecelRate", "VEgoStarting", "VEgoStopping"}; + QSet advancedLongitudinalTuneKeys = {"EVTuning", "TruckTuning", "LongitudinalActuatorDelay", "StartAccel", "StopAccel", "StoppingDecelRate", "VEgoStarting", "VEgoStopping"}; QSet aggressivePersonalityKeys = {"AggressiveFollow", "AggressiveFollowHigh", "AggressiveJerkAcceleration", "AggressiveJerkDeceleration", "AggressiveJerkDanger", "AggressiveJerkSpeed", "AggressiveJerkSpeedDecrease", "ResetAggressivePersonality"}; QSet conditionalExperimentalKeys = {"CESpeed", "CESpeedLead", "CECurves", "CELead", "CEModelStopTime", "CENavigation", "CESignalSpeed", "ShowCEMStatus"}; QSet curveSpeedKeys = {"CalibratedLateralAcceleration", "CalibrationProgress", "ResetCurveData", "ShowCSCStatus"};