From 8098eb454ca0370ed8bef512596a0e1a09d54a88 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Mon, 26 Oct 2026 14:00:50 -0500 Subject: [PATCH] Limit Steering Counter Repair to Bolt Pedal Profiles --- opendbc_repo/opendbc/car/gm/carcontroller.py | 9 ++++--- .../gm/tests/test_bolt_volt_configurations.py | 27 +++++++++++++++++++ prebuilt.json | 2 +- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/opendbc_repo/opendbc/car/gm/carcontroller.py b/opendbc_repo/opendbc/car/gm/carcontroller.py index e6da94741e..7b84b2025a 100644 --- a/opendbc_repo/opendbc/car/gm/carcontroller.py +++ b/opendbc_repo/opendbc/car/gm/carcontroller.py @@ -267,6 +267,7 @@ class CarController(CarControllerBase): self.long_pitch_input = None self.bolt_removed_cancel_credit_used = 0 self.bolt_pedal_removed = is_bolt_pedal_removed_profile(CP) or is_bolt_pedal_removed_profile(CP, stock_only=True) + self.bolt_steering_ack_counter = is_bolt_pedal_profile(CP) or is_bolt_pedal_profile(CP, stock_only=True) self.bolt_present_no_acc_stock = is_bolt_present_no_acc_pedal_profile(CP, stock_only=True) self.truck_tuning = TruckTuning() if truck_tuning_supported(CP) else None self.truck_tuning_input = None @@ -604,9 +605,11 @@ class CarController(CarControllerBase): if CS.loopback_lka_steering_cmd_ts_nanos == 0 or out_of_sync: steer_step = self.params.STEER_STEP - if CS.loopback_lka_steering_cmd_updated: - # Batched or duplicate acknowledgements must not advance a local count. - self.lka_steering_cmd_counter = (CS.loopback_lka_steering_cmd_counter + 1) % 4 + if self.bolt_steering_ack_counter: + if CS.loopback_lka_steering_cmd_updated: + self.lka_steering_cmd_counter = (CS.loopback_lka_steering_cmd_counter + 1) % 4 + else: + self.lka_steering_cmd_counter += 1 if CS.loopback_lka_steering_cmd_updated else 0 # Avoid GM EPS faults when transmitting messages too close together: skip this transmit if we # received the ASCMLKASteeringCmd loopback confirmation too recently diff --git a/opendbc_repo/opendbc/car/gm/tests/test_bolt_volt_configurations.py b/opendbc_repo/opendbc/car/gm/tests/test_bolt_volt_configurations.py index b44620a184..32907f4dbf 100644 --- a/opendbc_repo/opendbc/car/gm/tests/test_bolt_volt_configurations.py +++ b/opendbc_repo/opendbc/car/gm/tests/test_bolt_volt_configurations.py @@ -94,6 +94,33 @@ class TestBoltVoltConfigurations(unittest.TestCase): self.assertEqual((data[0] >> 4) & 3, expected) self.assertFalse(data[0] & 8) + def test_nonpedal_gm_preserves_legacy_loopback_counter_progression(self): + for identity in (CAR.CHEVROLET_VOLT, CAR.CHEVROLET_VOLT_CAMERA, CAR.CHEVROLET_VOLT_2019, + CAR.CHEVROLET_BOLT_EUV): + for alpha in (False, True): + with self.subTest(identity=identity, alpha=alpha): + cp = ordinary_params(identity, alpha=alpha, radar=True) + cs = CarState(cp) + parsers = cs.get_can_parsers(cp) + packer = CANPacker(DBC[identity][Bus.pt]) + controller = CarController(DBC[identity], cp) + self.assertFalse(controller.bolt_steering_ack_counter) + control = structs.CarControl() + expected = 0 + for step, received in enumerate(([3], [0, 1], [0, 0], [1], [], [2, 3], [0])): + now = 1_000_000_000 + step * 100_000_000 + packets = [packer.make_can_msg("ASCMLKASteeringCmd", 128, {"RollingCounter": value}) for value in received] + for parser in parsers.values(): + parser.update([(now - 20_000_000, packets)]) + cs.out = cs.update(parsers).as_reader() + expected += bool(received) + controller.frame = 20 + step * 10 + _, commands = controller.update(control.as_reader(), cs, now) + steering = [message for message in commands if message[0] == 0x180 and message[2] == 0] + self.assertEqual(len(steering), 1) + self.assertEqual((steering[0][1][0] >> 4) & 3, expected % 4) + self.assertFalse(steering[0][1][0] & 8) + def test_all_bolt_pedal_generations_withdraw_on_missing_stale_or_future_gear(self): for candidate in PEDAL_BOLT_CAR: for alpha in (False, True): diff --git a/prebuilt.json b/prebuilt.json index 31285023fa..f5e26550b1 100644 --- a/prebuilt.json +++ b/prebuilt.json @@ -1 +1 @@ -{"protected_inventory_sha256": "470c96defd2caf79d968f376298c74b5d1074d38bbac81a0c1dca0048efe7d7b", "schema_version": 1} +{"protected_inventory_sha256": "a9f832c3ebc38987657921c543c1cad657a126d8a667f556f52a639c38ed8d2f", "schema_version": 1}