From 68fca49aab820bfae2e420b3511713ac6f3ac472 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Sat, 31 Oct 2026 08:11:52 -0500 Subject: [PATCH] Avoid repeated static Bolt and empty-fault classification in Card --- opendbc_repo/opendbc/car/gm/values.py | 8 ++++ openpilot/starpilot/aol/panda_faults.py | 5 ++- .../aol/tests/test_bolt_profile_cache.py | 41 +++++++++++++++++++ .../aol/tests/test_gm_diagnostic_fast_path.py | 8 ++++ prebuilt.json | 2 +- 5 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 openpilot/starpilot/aol/tests/test_bolt_profile_cache.py diff --git a/opendbc_repo/opendbc/car/gm/values.py b/opendbc_repo/opendbc/car/gm/values.py index 3f04c9d040..ca787ce9ad 100644 --- a/opendbc_repo/opendbc/car/gm/values.py +++ b/opendbc_repo/opendbc/car/gm/values.py @@ -1,3 +1,4 @@ +from opendbc.car.config_cache import cached_config from dataclasses import dataclass, field, replace from enum import Enum, IntFlag from math import isfinite @@ -933,6 +934,13 @@ def is_bolt_pedal_removed_profile(cp, *, stock_only=False): def is_bolt_pedal_profile(cp, *, stock_only=False): + if cp.brand != 'gm' or cp.carFingerprint not in BOLT_PEDAL_WORDS: + return False + return _bolt_pedal_profile(cp, stock_only=stock_only) + + +@cached_config +def _bolt_pedal_profile(cp, *, stock_only=False): """Exact selected interceptor profile, including its startup authority reduction.""" if is_bolt_pedal_removed_profile(cp, stock_only=stock_only): return True diff --git a/openpilot/starpilot/aol/panda_faults.py b/openpilot/starpilot/aol/panda_faults.py index d2a7c2ad7d..00f5925856 100644 --- a/openpilot/starpilot/aol/panda_faults.py +++ b/openpilot/starpilot/aol/panda_faults.py @@ -65,13 +65,16 @@ def _diagnostic_mask(cp): def blocking_fault_mask(mask, cp): try: value = int(mask) - return value < 0 or value > 0xFFFFFFFF or bool(value & ~_diagnostic_mask(cp)) + return value < 0 or value > 0xFFFFFFFF or bool(value and value & ~_diagnostic_mask(cp)) except (TypeError, ValueError, OverflowError): return True def blocking_fault_list(faults, cp): try: + faults = tuple(faults) + if not faults: + return False allowed = _diagnostic_mask(cp) named = ((log.PandaState.FaultType.interruptRateCan1, 1 << 2), (log.PandaState.FaultType.interruptRateCan2, 1 << 3), diff --git a/openpilot/starpilot/aol/tests/test_bolt_profile_cache.py b/openpilot/starpilot/aol/tests/test_bolt_profile_cache.py new file mode 100644 index 0000000000..16fe6f2217 --- /dev/null +++ b/openpilot/starpilot/aol/tests/test_bolt_profile_cache.py @@ -0,0 +1,41 @@ +"""Static Bolt classification stays exact after saved/manual profile changes.""" +import pytest +from opendbc.car.gm.values import CAR, _bolt_pedal_profile, is_bolt_pedal_profile +from opendbc.car.gm.tests.test_bolt_pedal import params +from openpilot.starpilot.aol.tests.test_gm import _configurations + + +def test_all_existing_gm_profiles_match_without_cache(): + for cp in _configurations(): + for stock in (False, True): + expected = _bolt_pedal_profile.__wrapped__(cp, stock_only=stock) + assert is_bolt_pedal_profile(cp, stock_only=stock) == expected + assert is_bolt_pedal_profile(cp.as_reader(), stock_only=stock) == expected + assert _bolt_pedal_profile.cache_info().currsize <= 8 + + +@pytest.mark.parametrize('field,value', [('brand', 'hyundai'), ('carFingerprint', 'unknown'), ('flags', 0), + ('passive', True), ('dashcamOnly', True), ('notCar', True), ('pcmCruise', True), + ('openpilotLongitudinalControl', False), ('alphaLongitudinalAvailable', True), ('networkLocation', 'gateway'), + ('safetyParam', 0), ('safetyModel', 'noOutput'), ('safetyConfigs', [])]) +def test_builder_and_reader_alias_requalify_after_mutation(field, value): + cp = params(CAR.CHEVROLET_BOLT_CC_2018_2021, pedal=True, camera=True) + alias = cp.as_reader() + assert is_bolt_pedal_profile(cp) + if field in ('safetyParam', 'safetyModel'): + setattr(cp.safetyConfigs[0], field, value) + else: + setattr(cp, field, value) + assert not _bolt_pedal_profile.__wrapped__(cp) + assert not is_bolt_pedal_profile(cp) + assert not is_bolt_pedal_profile(alias) + + +def test_other_brands_and_non_bolt_profiles_skip_serialization(): + cp = params(CAR.CHEVROLET_BOLT_CC_2018_2021, pedal=True, camera=True) + for field, value in [('brand', 'hyundai'), ('brand', 'honda'), ('carFingerprint', 'unknown')]: + cp.brand = 'gm' + setattr(cp, field, value) + previous = _bolt_pedal_profile.cache_info() + assert not is_bolt_pedal_profile(cp) + assert _bolt_pedal_profile.cache_info() == previous diff --git a/openpilot/starpilot/aol/tests/test_gm_diagnostic_fast_path.py b/openpilot/starpilot/aol/tests/test_gm_diagnostic_fast_path.py index 768f2c5605..c7858fa986 100644 --- a/openpilot/starpilot/aol/tests/test_gm_diagnostic_fast_path.py +++ b/openpilot/starpilot/aol/tests/test_gm_diagnostic_fast_path.py @@ -96,3 +96,11 @@ def test_malformed_torque_tuning_does_not_borrow_exemption(field): cp.lateralTuning.torque.latAccelFactor = 1. setattr(cp.lateralTuning.torque, field, float('nan')) assert _diagnostic_mask(cp) == original_mask(cp) == 0 + + +def test_empty_fault_reports_skip_all_vehicle_diagnostic_work(): + cp, _ = owner('bolt') + with patch('openpilot.starpilot.aol.panda_faults._diagnostic_mask', side_effect=AssertionError('empty fault report')): + assert not blocking_fault_mask(0, cp) + for faults in ([], (), iter(())): + assert not blocking_fault_list(faults, cp) diff --git a/prebuilt.json b/prebuilt.json index 8a57576ef4..0fdbb80449 100644 --- a/prebuilt.json +++ b/prebuilt.json @@ -1 +1 @@ -{"protected_inventory_sha256": "ef71deaf14fdac8142ecd52aad0b70bab7c5cc79b81ce899ba5b8bfa50c45fa8", "schema_version": 1} +{"protected_inventory_sha256": "b22ffad92c34c5e211191c3782f4ae02f0e7e2c80a08ee0ee1e0215b68cbbddf", "schema_version": 1}