From bba72c85c7dd210a66ab659db3111f5ef9d10660 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Wed, 11 Feb 2026 19:18:36 -0600 Subject: [PATCH] Volt? --- panda/board/safety/safety_gm.h | 15 +++++++++++---- selfdrive/car/gm/carstate.py | 12 +++++++++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/panda/board/safety/safety_gm.h b/panda/board/safety/safety_gm.h index 27b167f47..50c5cde3d 100644 --- a/panda/board/safety/safety_gm.h +++ b/panda/board/safety/safety_gm.h @@ -212,10 +212,17 @@ static void gm_rx_hook(const CANPacket_t *to_push) { generic_rx_checks(stock_ecu_detected); } - // Cruise check for Gen2 Bolt (ASCMActiveCruiseControlStatus on bus 2) - if (gm_bolt_2022_pedal && (GET_ADDR(to_push) == 0x370) && (GET_BUS(to_push) == 2U)) { + // Cruise check for ASCMActiveCruiseControlStatus on bus 2. + // Keep kaofui behavior for non-Bolt paths; Bolt pedal path keeps local tracking. + if ((GET_ADDR(to_push) == 0x370) && (GET_BUS(to_push) == 2U)) { bool cruise_engaged = (GET_BYTE(to_push, 2) >> 7) != 0U; // ACCCmdActive - cruise_engaged_prev = cruise_engaged; + if (gm_bolt_2022_pedal) { + cruise_engaged_prev = cruise_engaged; + } else if (gm_pcm_cruise && gm_has_acc) { + pcm_cruise_check(cruise_engaged); + } else { + cruise_engaged_prev = cruise_engaged; + } } } @@ -361,6 +368,7 @@ static safety_config gm_init(uint16_t param) { gm_pedal_long = GET_FLAG(param, GM_PARAM_PEDAL_LONG); gm_cc_long = GET_FLAG(param, GM_PARAM_CC_LONG); + enable_gas_interceptor = GET_FLAG(param, GM_PARAM_PEDAL_INTERCEPTOR); gm_cam_long = GET_FLAG(param, GM_PARAM_HW_CAM_LONG) && !gm_cc_long; gm_bolt_2022_pedal = GET_FLAG(param, GM_PARAM_BOLT_2022_PEDAL); if (gm_hw == GM_CAM && enable_gas_interceptor && gm_bolt_2022_pedal) { @@ -369,7 +377,6 @@ static safety_config gm_init(uint16_t param) { gm_pcm_cruise = (((gm_hw == GM_CAM) || (gm_hw == GM_SDGM)) && (!gm_cam_long || gm_cc_long) && !gm_force_ascm && !gm_pedal_long); gm_skip_relay_check = GET_FLAG(param, GM_PARAM_NO_CAMERA); gm_has_acc = !GET_FLAG(param, GM_PARAM_NO_ACC); - enable_gas_interceptor = GET_FLAG(param, GM_PARAM_PEDAL_INTERCEPTOR); gm_force_brake_c9 = GET_FLAG(param, GM_PARAM_FORCE_BRAKE_C9); gm_remote_start_boots_comma = GET_FLAG(param, GM_PARAM_REMOTE_START_BOOTS_COMMA); diff --git a/selfdrive/car/gm/carstate.py b/selfdrive/car/gm/carstate.py index e5ba43391..cf335f82f 100644 --- a/selfdrive/car/gm/carstate.py +++ b/selfdrive/car/gm/carstate.py @@ -99,9 +99,15 @@ class CarState(CarStateBase): ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(pt_cp.vl["ECMPRDNL2"]["PRNDL2"], None)) if self.CP.flags & GMFlags.NO_ACCELERATOR_POS_MSG.value: - ret.brake = pt_cp.vl["EBCMBrakePedalPosition"]["BrakePedalPosition"] / 0xd0 + if self.CP.carFingerprint in kaofui_state_cars: + ret.brake = pt_cp.vl.get("EBCMBrakePedalPosition", {}).get("BrakePedalPosition", 0) / 0xd0 + else: + ret.brake = pt_cp.vl["EBCMBrakePedalPosition"]["BrakePedalPosition"] / 0xd0 else: - ret.brake = pt_cp.vl["ECMAcceleratorPos"]["BrakePedalPos"] + if self.CP.carFingerprint in kaofui_state_cars: + ret.brake = pt_cp.vl.get("ECMAcceleratorPos", {}).get("BrakePedalPos", 0) + else: + ret.brake = pt_cp.vl["ECMAcceleratorPos"]["BrakePedalPos"] if (self.CP.flags & GMFlags.FORCE_BRAKE_C9.value) or ((self.CP.networkLocation == NetworkLocation.fwdCamera) and (self.CP.carFingerprint != CAR.CHEVROLET_BLAZER)): ret.brakePressed = pt_cp.vl["ECMEngineStatus"]["BrakePressed"] != 0 else: @@ -109,7 +115,7 @@ class CarState(CarStateBase): # that the brake is being intermittently pressed without user interaction. # To avoid a cruise fault we need to use a conservative brake position threshold # https://static.nhtsa.gov/odi/tsbs/2017/MC-10137629-9999.pdf - analog_thresh = 0.10 if (self.CP.flags & GMFlags.NO_ACCELERATOR_POS_MSG.value) else 8 + analog_thresh = 0.15 if (self.CP.flags & GMFlags.NO_ACCELERATOR_POS_MSG.value) else 8 ret.brakePressed = ret.brake >= analog_thresh # Regen braking is braking