This commit is contained in:
firestar5683
2026-03-28 22:38:29 -05:00
parent 2dd436c40d
commit 2f1bb550e9
43 changed files with 219 additions and 22 deletions

Binary file not shown.

View File

@@ -144,9 +144,9 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"AdjacentPathMetrics", {PERSISTENT, BOOL, "0", "0", 3}},
{"AdvancedCustomUI", {PERSISTENT, BOOL, "0", "0", 2}},
{"AdvancedLateralTune", {PERSISTENT, BOOL, "1", "0", 2}},
{"AdvancedLongitudinalTune", {PERSISTENT, BOOL, "0", "0", 3}},
{"AdvancedLongitudinalTune", {PERSISTENT, BOOL, "1", "0", 3}},
{"AggressiveFollow", {PERSISTENT, FLOAT, "1.25", "1.25", 2}},
{"AggressiveFollowHigh", {PERSISTENT, FLOAT, "1.25", "1.25", 2}},
{"AggressiveFollowHigh", {PERSISTENT, FLOAT, "1.0", "1.0", 2}},
{"AggressiveJerkAcceleration", {PERSISTENT, FLOAT, "50.0", "50.0", 3}},
{"AggressiveJerkDanger", {PERSISTENT, FLOAT, "100.0", "100.0", 3}},
{"AggressiveJerkDeceleration", {PERSISTENT, FLOAT, "50.0", "50.0", 3}},
@@ -182,7 +182,7 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"CELead", {PERSISTENT, BOOL, "0", "0", 1}},
{"CEModelStopTime", {PERSISTENT, FLOAT, "7.0", "0.0", 2}},
{"CESignalLaneDetection", {PERSISTENT, BOOL, "1", "0", 2}},
{"CESignalSpeed", {PERSISTENT, FLOAT, "55.0", "0.0", 2}},
{"CESignalSpeed", {PERSISTENT, FLOAT, "0.0", "0.0", 2}},
{"CESlowerLead", {PERSISTENT, BOOL, "0", "0", 1}},
{"CESpeed", {PERSISTENT, FLOAT, "0.0", "0.0", 1}},
{"CESpeedLead", {PERSISTENT, FLOAT, "0.0", "0.0", 1}},
@@ -389,7 +389,7 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"ReduceLateralAccelerationSnow", {PERSISTENT, INT, "0", "0", 2}},
{"RefuseVolume", {PERSISTENT, INT, "101", "101", 2}},
{"RelaxedFollow", {PERSISTENT, FLOAT, "1.75", "1.75", 2}},
{"RelaxedFollowHigh", {PERSISTENT, FLOAT, "1.75", "1.75", 2}},
{"RelaxedFollowHigh", {PERSISTENT, FLOAT, "1.4", "1.4", 2}},
{"RelaxedJerkAcceleration", {PERSISTENT, FLOAT, "50.0", "50.0", 3}},
{"RelaxedJerkDanger", {PERSISTENT, FLOAT, "100.0", "100.0", 3}},
{"RelaxedJerkDeceleration", {PERSISTENT, FLOAT, "50.0", "50.0", 3}},
@@ -450,7 +450,7 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"SpeedLimitsFiltered", {PERSISTENT | DONT_LOG, JSON, "[]", "[]"}},
{"SpeedLimitSources", {PERSISTENT, BOOL, "0", "0", 3}},
{"StandardFollow", {PERSISTENT, FLOAT, "1.45", "1.45", 2}},
{"StandardFollowHigh", {PERSISTENT, FLOAT, "1.45", "1.45", 2}},
{"StandardFollowHigh", {PERSISTENT, FLOAT, "1.2", "1.2", 2}},
{"StandardJerkAcceleration", {PERSISTENT, FLOAT, "50.0", "50.0", 3}},
{"StandardJerkDanger", {PERSISTENT, FLOAT, "100.0", "100.0", 3}},
{"StandardJerkDeceleration", {PERSISTENT, FLOAT, "50.0", "50.0", 3}},

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,2 +1,2 @@
extern const uint8_t gitversion[19];
const uint8_t gitversion[19] = "DEV-58504c5a-DEBUG";
const uint8_t gitversion[19] = "DEV-2dd436c4-DEBUG";

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
DEV-58504c5a-DEBUG
DEV-2dd436c4-DEBUG

Binary file not shown.

Binary file not shown.

View File

@@ -252,6 +252,18 @@ def normalize_legacy_car_model(car_model):
normalized = LEGACY_CARMODEL_MIGRATIONS.get(car_model, car_model)
return normalized
def default_ev_tuning_enabled(CP):
car_make = str(getattr(CP, "brand", "") or "")
car_model = normalize_legacy_car_model(getattr(CP, "carFingerprint", "")) or ""
gm_ev_vehicle = car_make == "gm" and car_model in GM_EV_CAR
gm_ev_vehicle &= not (car_model.startswith("CHEVROLET_VOLT") and not car_model.endswith("_CC"))
gm_ev_vehicle &= car_model != "CHEVROLET_MALIBU_HYBRID_CC"
ev_vehicle = gm_ev_vehicle or (car_make == "hyundai" and car_model in HYUNDAI_EV_CAR)
ev_vehicle |= getattr(CP, "transmissionType", None) == car.CarParams.TransmissionType.direct
return bool(ev_vehicle)
def get_starpilot_toggles(sm=messaging.SubMaster(["starpilotPlan"])):
toggles = process_starpilot_toggles(sm["starpilotPlan"].starpilotToggles)
@@ -515,11 +527,7 @@ class StarPilotVariables:
toggle.use_custom_steerRatio = bool(round(toggle.steerRatio, 2) != round(steerRatio, 2)) and not toggle.force_auto_tune or toggle.force_auto_tune_off
advanced_longitudinal_tuning = toggle.openpilot_longitudinal and self.get_value("AdvancedLongitudinalTune")
gm_ev_vehicle = toggle.car_make == "gm" and CP.carFingerprint in GM_EV_CAR
gm_ev_vehicle &= not (toggle.car_model.startswith("CHEVROLET_VOLT") and not toggle.car_model.endswith("_CC"))
gm_ev_vehicle &= toggle.car_model != "CHEVROLET_MALIBU_HYBRID_CC"
ev_vehicle = gm_ev_vehicle or (toggle.car_make == "hyundai" and CP.carFingerprint in HYUNDAI_EV_CAR)
ev_vehicle |= CP.transmissionType == car.CarParams.TransmissionType.direct
ev_vehicle = default_ev_tuning_enabled(CP)
if self.params_raw.get("EVTuning") in (None, b""):
self.params.put_bool("EVTuning", ev_vehicle)

View File

@@ -41,7 +41,7 @@ from panda import Panda
from openpilot.starpilot.assets.theme_manager import HOLIDAY_THEME_PATH, THEME_COMPONENT_PARAMS
from openpilot.starpilot.common.starpilot_utilities import delete_file, get_lock_status, run_cmd
from openpilot.starpilot.common.starpilot_variables import ACTIVE_THEME_PATH, ERROR_LOGS_PATH, EXCLUDED_KEYS, LEGACY_STARPILOT_PARAM_RENAMES, RESOURCES_REPO, SCREEN_RECORDINGS_PATH, THEME_SAVE_PATH,\
update_starpilot_toggles
default_ev_tuning_enabled, update_starpilot_toggles
from openpilot.starpilot.common.testing_grounds import (
DEFAULT_TESTING_GROUND_VARIANT as SHARED_DEFAULT_TESTING_GROUND_VARIANT,
TESTING_GROUND_VARIANT_LABELS as SHARED_TESTING_GROUND_VARIANT_LABELS,
@@ -351,6 +351,7 @@ class ParamsCompat:
return getattr(self._params, attr)
_params_raw = Params(return_defaults=True)
_params_live_raw = Params()
_params_memory_raw = Params(memory=True)
def _normalize_default_value(value):
@@ -624,6 +625,25 @@ _TROUBLESHOOT_ADVANCED_LONGITUDINAL_KEYS = [
"VEgoStopping",
]
_RUNTIME_DEFAULT_STOCK_KEYS = {
"SteerDelay": "SteerDelayStock",
"SteerFriction": "SteerFrictionStock",
"SteerOffset": "SteerOffsetStock",
"SteerKP": "SteerKPStock",
"SteerLatAccel": "SteerLatAccelStock",
"SteerRatio": "SteerRatioStock",
"LongitudinalActuatorDelay": "LongitudinalActuatorDelayStock",
"StartAccel": "StartAccelStock",
"StopAccel": "StopAccelStock",
"StoppingDecelRate": "StoppingDecelRateStock",
"VEgoStarting": "VEgoStartingStock",
"VEgoStopping": "VEgoStoppingStock",
}
_RUNTIME_DEFAULT_ZERO_OK_KEYS = {
"SteerOffset",
}
_TROUBLESHOOT_SECTION_DEFINITIONS = [
{
"id": "personality_settings",
@@ -1664,7 +1684,9 @@ def _get_default_param_values():
for key, default_val, _, _ in starpilot_default_params
if key not in EXCLUDED_KEYS
}
return _cached_default_values
default_values = dict(_cached_default_values)
default_values.update(_get_runtime_default_param_overrides())
return default_values
def _coerce_param_value(raw_value, value_type):
safe_type = value_type or str
@@ -1708,6 +1730,12 @@ def _safe_params_get(key, encoding=None, default=None):
except Exception:
return default
def _safe_params_get_live_raw(key, default=None, block=False):
try:
return _params_live_raw.get(key, block=block)
except Exception:
return default
def _safe_params_get_bool(key, default=False):
try:
return params.get_bool(key)
@@ -1723,6 +1751,59 @@ def _is_blank_param_raw(raw_value):
return len(raw_value.strip()) == 0
return False
def _has_runtime_default_value(key, raw_value):
if _is_blank_param_raw(raw_value):
return False
if key in _RUNTIME_DEFAULT_ZERO_OK_KEYS:
return True
try:
if isinstance(raw_value, bytes):
raw_value = raw_value.decode("utf-8", errors="replace")
return float(str(raw_value).strip()) != 0.0
except Exception:
return True
def _get_runtime_default_param_overrides():
overrides = {}
for key, stock_key in _RUNTIME_DEFAULT_STOCK_KEYS.items():
stock_raw = _safe_params_get_live_raw(stock_key)
if _has_runtime_default_value(key, stock_raw):
overrides[key] = stock_raw
overrides[stock_key] = stock_raw
cp_bytes = _safe_params_get_live_raw("CarParamsPersistent")
if not cp_bytes:
return overrides
try:
with car.CarParams.from_bytes(cp_bytes) as cp:
overrides["EVTuning"] = default_ev_tuning_enabled(cp)
car_param_defaults = {
"SteerDelay": getattr(cp, "steerActuatorDelay", None),
"SteerRatio": getattr(cp, "steerRatio", None),
"LongitudinalActuatorDelay": getattr(cp, "longitudinalActuatorDelay", None),
"StartAccel": getattr(cp, "startAccel", None),
"StopAccel": getattr(cp, "stopAccel", None),
"StoppingDecelRate": getattr(cp, "stoppingDecelRate", None),
"VEgoStarting": getattr(cp, "vEgoStarting", None),
"VEgoStopping": getattr(cp, "vEgoStopping", None),
}
for key, value in car_param_defaults.items():
if key in overrides or value is None:
continue
if key not in _RUNTIME_DEFAULT_ZERO_OK_KEYS and float(value) == 0.0:
continue
overrides[key] = value
except Exception:
pass
return overrides
def _get_current_param_value(key, value_type):
safe_type = value_type or str
if safe_type == bool:
@@ -1831,15 +1912,23 @@ def _resolve_troubleshoot_current_value(key, value_type, default_values):
safe_type = value_type or str
if safe_type == bool:
raw_value = _safe_params_get_live_raw(key)
if not _is_blank_param_raw(raw_value):
return _coerce_param_value(raw_value, safe_type)
default_raw_value = default_values.get(key)
if not _is_blank_param_raw(default_raw_value):
return _coerce_param_value(default_raw_value, safe_type)
return _safe_params_get_bool(key)
raw_value = _safe_params_get(key)
raw_value = _safe_params_get_live_raw(key)
if not _is_blank_param_raw(raw_value):
return _coerce_param_value(raw_value, safe_type)
stock_key = f"{key}Stock"
if stock_key in default_values:
stock_raw_value = _safe_params_get(stock_key)
stock_raw_value = _safe_params_get_live_raw(stock_key)
if not _is_blank_param_raw(stock_raw_value):
return _coerce_param_value(stock_raw_value, safe_type)
@@ -1857,7 +1946,7 @@ def _resolve_troubleshoot_default_value(key, value_type, default_values):
stock_key = f"{key}Stock"
if stock_key in default_values:
stock_current_raw = _safe_params_get(stock_key)
stock_current_raw = _safe_params_get_live_raw(stock_key)
if not _is_blank_param_raw(stock_current_raw):
return _coerce_param_value(stock_current_raw, safe_type)
@@ -1911,6 +2000,109 @@ def _get_fingerprint_snapshot_text():
return cp_fingerprint
return "Unknown"
def _snapshot_bool_text(value):
if value is True:
return "Yes"
if value is False:
return "No"
return "Unavailable"
def _get_starpilot_toggles_snapshot():
raw_toggles = _safe_params_get_live_raw("StarPilotToggles")
if not raw_toggles:
return {}
try:
if isinstance(raw_toggles, bytes):
raw_toggles = raw_toggles.decode("utf-8", errors="replace")
parsed = json.loads(str(raw_toggles) or "{}")
return parsed if isinstance(parsed, dict) else {}
except Exception:
return {}
def _get_hardware_snapshot_items():
starpilot_toggles = _get_starpilot_toggles_snapshot()
has_bsm = None
has_openpilot_longitudinal = None
has_pedal = False
has_radar = None
has_sdsu = bool(starpilot_toggles.get("has_sdsu", False))
has_sng = None
has_zss = bool(starpilot_toggles.get("has_zss", False))
can_use_pedal = None
can_use_sdsu = None
is_bolt = False
cp_bytes = _safe_params_get_live_raw("CarParamsPersistent")
if cp_bytes:
try:
with car.CarParams.from_bytes(cp_bytes) as cp:
car_fingerprint = str(getattr(cp, "carFingerprint", "") or "")
car_make = str(getattr(cp, "brand", "") or getattr(cp, "carName", "") or "")
has_bsm = bool(getattr(cp, "enableBsm", False))
has_openpilot_longitudinal = bool(getattr(cp, "openpilotLongitudinalControl", False))
has_pedal = bool(getattr(cp, "enableGasInterceptorDEPRECATED", False))
has_radar = not bool(getattr(cp, "radarUnavailable", False))
has_sdsu = bool(starpilot_toggles.get("has_sdsu", has_sdsu))
has_sng = bool(getattr(cp, "autoResumeSng", False))
has_zss = bool(starpilot_toggles.get("has_zss", has_zss))
is_bolt = car_fingerprint.startswith("CHEVROLET_BOLT")
if PC and (car_make == "mock" or car_fingerprint == "MOCK"):
fallback_make = str(starpilot_toggles.get("car_make", "") or "gm")
fallback_model = str(starpilot_toggles.get("car_model", "") or "CHEVROLET_BOLT_ACC_2022_2023")
has_pedal = bool(starpilot_toggles.get("has_pedal", True))
has_sdsu = bool(starpilot_toggles.get("has_sdsu", has_sdsu))
has_zss = bool(starpilot_toggles.get("has_zss", has_zss))
is_bolt = fallback_model.startswith("CHEVROLET_BOLT")
if fallback_make == "gm" and has_openpilot_longitudinal is None:
has_openpilot_longitudinal = True
except Exception:
pass
elif PC:
fallback_model = str(starpilot_toggles.get("car_model", "") or "CHEVROLET_BOLT_ACC_2022_2023")
has_pedal = bool(starpilot_toggles.get("has_pedal", True))
has_sdsu = bool(starpilot_toggles.get("has_sdsu", has_sdsu))
has_zss = bool(starpilot_toggles.get("has_zss", has_zss))
is_bolt = fallback_model.startswith("CHEVROLET_BOLT")
if can_use_pedal is None:
can_use_pedal = has_pedal or is_bolt
if can_use_sdsu is None:
can_use_sdsu = has_sdsu
fpcp_bytes = _safe_params_get_live_raw("StarPilotCarParamsPersistent")
if fpcp_bytes:
try:
fpcp = messaging.log_from_bytes(fpcp_bytes, custom.StarPilotCarParams)
can_use_pedal = bool(getattr(fpcp, "canUsePedal", can_use_pedal))
can_use_sdsu = bool(getattr(fpcp, "canUseSDSU", can_use_sdsu))
except Exception:
pass
detected = []
if has_pedal:
detected.append("comma Pedal")
if has_sdsu:
detected.append("SDSU")
if has_zss:
detected.append("ZSS")
return [
{"id": "hardware_detected", "label": "Hardware Detected", "value": ", ".join(detected) if detected else "None", "resettable": False},
{"id": "pedal_detected", "label": "Pedal Detected", "value": _snapshot_bool_text(has_pedal), "resettable": False},
{"id": "sdsu_detected", "label": "SDSU Detected", "value": _snapshot_bool_text(has_sdsu), "resettable": False},
{"id": "zss_detected", "label": "ZSS Detected", "value": _snapshot_bool_text(has_zss), "resettable": False},
{"id": "blind_spot_support", "label": "Blind Spot Support", "value": _snapshot_bool_text(has_bsm), "resettable": False},
{"id": "openpilot_longitudinal_support", "label": "openpilot Longitudinal Support", "value": _snapshot_bool_text(has_openpilot_longitudinal), "resettable": False},
{"id": "pedal_support", "label": "comma Pedal Support", "value": _snapshot_bool_text(can_use_pedal), "resettable": False},
{"id": "radar_support", "label": "Radar Support", "value": _snapshot_bool_text(has_radar), "resettable": False},
{"id": "sdsu_support", "label": "SDSU Support", "value": _snapshot_bool_text(can_use_sdsu), "resettable": False},
{"id": "sng_support", "label": "Stop-and-Go Support", "value": _snapshot_bool_text(has_sng), "resettable": False},
]
def _build_troubleshoot_section_payload(section_definition, value_types, default_values, layout_metadata):
section_keys = [str(key).strip() for key in section_definition.get("keys", []) if str(key).strip()]
items = []
@@ -1967,6 +2159,7 @@ def _build_troubleshoot_payload():
"value": _get_fingerprint_snapshot_text(),
"resettable": False,
},
*_get_hardware_snapshot_items(),
{
"id": "driving_model",
"label": "Current Driving Model",
@@ -2883,11 +3076,7 @@ def setup(app):
@app.route("/api/params/defaults", methods=["GET"])
def get_default_params():
allowed_keys, types = _get_param_type_info()
defaults_lookup = {
key: default_val
for key, default_val, _, _ in starpilot_default_params
if key in allowed_keys
}
defaults_lookup = _get_default_param_values()
result = {}
for key in allowed_keys:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.