Limit Steering Counter Repair to Bolt Pedal Profiles

This commit is contained in:
firestar5683
2026-10-26 14:00:50 -05:00
parent 6e88336f3a
commit 8098eb454c
3 changed files with 34 additions and 4 deletions
+6 -3
View File
@@ -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
@@ -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):
+1 -1
View File
@@ -1 +1 @@
{"protected_inventory_sha256": "470c96defd2caf79d968f376298c74b5d1074d38bbac81a0c1dca0048efe7d7b", "schema_version": 1}
{"protected_inventory_sha256": "a9f832c3ebc38987657921c543c1cad657a126d8a667f556f52a639c38ed8d2f", "schema_version": 1}