From d732fe98ff075d2503c2b89c6d614f250435c128 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Tue, 20 May 2025 00:54:25 -0500 Subject: [PATCH] Update carcontroller.py --- selfdrive/car/gm/carcontroller.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/selfdrive/car/gm/carcontroller.py b/selfdrive/car/gm/carcontroller.py index 90769560fc..b5379c0a1a 100644 --- a/selfdrive/car/gm/carcontroller.py +++ b/selfdrive/car/gm/carcontroller.py @@ -59,6 +59,7 @@ class CarController(CarControllerBase): self.accel_g = 0.0 self.regen_paddle_pressed = False self.aego = 0.0 + self.regen_disable_until = 0 # frame index until which regen spoof is blocked after a fault def calc_pedal_command(self, accel: float, long_active: bool, car_velocity) -> Tuple[float, bool]: if not long_active: @@ -122,11 +123,16 @@ class CarController(CarControllerBase): self.regen_paddle_pressed ) - # Send regen paddle and PRNDL2 commands at ~40Hz, avoiding steer frame timing - steer_phase = self.last_steer_frame % 5 - send_paddle_and_prndl2 = (self.frame % 5) != steer_phase # Avoid steer frame - send_every_other = self.frame % 2 == 0 # ~50Hz -> ~40Hz - send_prndl_frame = send_paddle_and_prndl2 and send_every_other + # If longActive just dropped (EPS error), block regen spoof for a cooldown period + if not CC.longActive and getattr(self, "last_regen_active", False): + # block for 50 frames (~0.5s) + self.regen_disable_until = self.frame + 50 + + regen_active = regen_active and (self.frame >= self.regen_disable_until) + + # Send regen paddle and PRNDL2 commands at ~66Hz, avoiding steer frame timing + steer_phase = self.last_steer_frame % 3 + send_prndl_frame = (self.frame % 3) != steer_phase press_regen_paddle = None if regen_active and send_prndl_frame: @@ -134,6 +140,11 @@ class CarController(CarControllerBase): elif not regen_active and getattr(self, "last_regen_active", False): press_regen_paddle = False + # Enforce at least 3-frame gap after last steer to avoid EPS faults + frames_since_last_steer = self.frame - self.last_steer_frame + if frames_since_last_steer < 3: + press_regen_paddle = None + if press_regen_paddle is not None: can_sends.append(gmcan.create_prndl2_command(self.packer_pt, CanBus.POWERTRAIN, press_regen_paddle)) can_sends.append(gmcan.create_regen_paddle_command(self.packer_pt, CanBus.POWERTRAIN, press_regen_paddle))