diff --git a/panda/board/obj/bootstub.panda.bin b/panda/board/obj/bootstub.panda.bin index 64a211688..ac228d7a0 100755 Binary files a/panda/board/obj/bootstub.panda.bin and b/panda/board/obj/bootstub.panda.bin differ diff --git a/panda/board/obj/bootstub.panda_h7.bin b/panda/board/obj/bootstub.panda_h7.bin index d71ae3b44..89be15112 100755 Binary files a/panda/board/obj/bootstub.panda_h7.bin and b/panda/board/obj/bootstub.panda_h7.bin differ diff --git a/panda/board/obj/panda.bin.signed b/panda/board/obj/panda.bin.signed index c3fe43669..f267f4e25 100644 Binary files a/panda/board/obj/panda.bin.signed and b/panda/board/obj/panda.bin.signed differ diff --git a/panda/board/obj/panda_h7.bin.signed b/panda/board/obj/panda_h7.bin.signed index 9b9b3c1e4..a1403eb22 100644 Binary files a/panda/board/obj/panda_h7.bin.signed and b/panda/board/obj/panda_h7.bin.signed differ diff --git a/panda/board/safety/safety_gm.h b/panda/board/safety/safety_gm.h index 34ed7052d..bc7b2d374 100644 --- a/panda/board/safety/safety_gm.h +++ b/panda/board/safety/safety_gm.h @@ -10,14 +10,14 @@ const SteeringLimits GM_STEERING_LIMITS = { }; const LongitudinalLimits GM_ASCM_LONG_LIMITS = { - .max_gas = 7168, + .max_gas = 8191, .min_gas = 5500, .inactive_gas = 5500, .max_brake = 400, }; const LongitudinalLimits GM_CAM_LONG_LIMITS = { - .max_gas = 7496, + .max_gas = 8848, .min_gas = 5610, .inactive_gas = 5650, .max_brake = 400, @@ -172,6 +172,13 @@ static void gm_rx_hook(const CANPacket_t *to_push) { } } + // Cruise check for ACC models with pedal interceptor - block stock ACC + if ((addr == 0x1C4) && gm_has_acc && enable_gas_interceptor) { + // When pedal interceptor is active on ACC models, ignore stock cruise state + // to prevent conflicts between pedal interceptor and stock ACC + cruise_engaged_prev = false; + } + if (addr == 0xBD) { regen_braking = (GET_BYTE(to_push, 0) >> 4) != 0U; } @@ -192,6 +199,12 @@ 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) + int addr = GET_ADDR(to_push); + if ((addr == 0x370) && (GET_BUS(to_push) == 2U)) { + bool cruise_engaged = (GET_BYTE(to_push, 2) >> 7) != 0U; // ACCCmdActive + cruise_engaged_prev = cruise_engaged; + } } static bool gm_tx_hook(const CANPacket_t *to_send) { @@ -246,6 +259,11 @@ static bool gm_tx_hook(const CANPacket_t *to_send) { int button = (GET_BYTE(to_send, 5) >> 4) & 0x7U; bool allowed_btn = (button == GM_BTN_CANCEL) && cruise_engaged_prev; + // For ACC cars with pedal interceptor, allow cancel even if cruise_engaged_prev is false + // (since we set it to false to prevent conflicts, but still need to cancel cruise) + if (gm_hw == GM_CAM && enable_gas_interceptor && button == GM_BTN_CANCEL) { + allowed_btn = true; + } // For standard CC, allow spamming of SET / RESUME if (gm_cc_long) { allowed_btn |= cruise_engaged_prev && (button == GM_BTN_SET || button == GM_BTN_RESUME || button == GM_BTN_UNPRESS); @@ -288,9 +306,13 @@ static int gm_fwd_hook(int bus_num, int addr) { } if (bus_num == 2) { - // block lkas message and acc messages if gm_cam_long, forward all others + // block lkas message and acc messages + // Block 0x370 only for experimental long without pedal interceptor bool is_lkas_msg = (addr == 0x180); - bool is_acc_msg = (addr == 0x315) || (addr == 0x2CB) || (addr == 0x370); + bool is_acc_msg = (addr == 0x315) || (addr == 0x2CB); + if (gm_cam_long && !enable_gas_interceptor) { + is_acc_msg = is_acc_msg || (addr == 0x370); + } bool block_msg = is_lkas_msg || (is_acc_msg && gm_cam_long); if (!block_msg) { bus_fwd = 0; @@ -322,6 +344,10 @@ 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); gm_cam_long = GET_FLAG(param, GM_PARAM_HW_CAM_LONG) && !gm_cc_long; + // Block ACC messages when pedal interceptor is active on ACC models + if (gm_hw == GM_CAM && enable_gas_interceptor) { + gm_cam_long = true; + } gm_pcm_cruise = ((gm_hw == GM_CAM) && (!gm_cam_long || gm_cc_long) && !gm_force_ascm && !gm_pedal_long) || (gm_hw == GM_SDGM); gm_skip_relay_check = GET_FLAG(param, GM_PARAM_NO_CAMERA); gm_has_acc = !GET_FLAG(param, GM_PARAM_NO_ACC); diff --git a/selfdrive/car/gm/carstate.py b/selfdrive/car/gm/carstate.py index bde897ca1..c6977b5bb 100644 --- a/selfdrive/car/gm/carstate.py +++ b/selfdrive/car/gm/carstate.py @@ -163,7 +163,7 @@ class CarState(CarStateBase): if self.CP.carFingerprint in CC_ONLY_CAR: ret.accFaulted = False ret.cruiseState.speed = pt_cp.vl["ECMCruiseControl"]["CruiseSetSpeed"] * CV.KPH_TO_MS - # Try ECM first for cars that might have it (like most GMs), fall back to ASCM + # Try ASCM first for cars that might have it (like misfingerprinted Bolts), fall back to ECM try: ret.cruiseState.enabled = cam_cp.vl["ASCMActiveCruiseControlStatus"]["ACCCmdActive"] != 0 except: diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index 21c0188f3..4402c38c2 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -42,8 +42,8 @@ class CarControllerParams: self.MAX_BRAKE = 400 # ~ -4.0 m/s^2 with regen if CP.carFingerprint in CAMERA_ACC_CAR and CP.carFingerprint not in CC_ONLY_CAR: - self.MAX_GAS = 7496 - self.MAX_GAS_PLUS = 7496 + self.MAX_GAS = 8848 + self.MAX_GAS_PLUS = 8848 self.MAX_ACC_REGEN = 5610 self.INACTIVE_REGEN = 5650 # Camera ACC vehicles have no regen while enabled. @@ -52,17 +52,17 @@ class CarControllerParams: self.BRAKE_SWITCH_MAX = self.MAX_ACC_REGEN if CP.carFingerprint in EV_CAR else self.ZERO_GAS elif CP.carFingerprint in SDGM_CAR: - self.MAX_GAS = 7168 - self.MAX_GAS_PLUS = 7168 - self.MAX_ACC_REGEN = 5500 - self.INACTIVE_REGEN = 5500 + self.MAX_GAS = 7496 + self.MAX_GAS_PLUS = 7496 + self.MAX_ACC_REGEN = 5610 + self.INACTIVE_REGEN = 5650 max_regen_acceleration = 0. self.BRAKE_SWITCH = self.ZERO_GAS else: - self.MAX_GAS = 7168 # Safety limit, not ACC max. Stock ACC >8192 from standstill. - self.MAX_GAS_PLUS = 7168 # 8292 uses new bit, possible but not tested. Matches Twilsonco tw-main max - self.MAX_ACC_REGEN = 5500 # Max ACC regen is slightly less than max paddle regen + self.MAX_GAS = 8191 # Safety limit, not ACC max. Stock ACC >8192 from standstill. + self.MAX_GAS_PLUS = 8191 # 8292 uses new bit, possible but not tested. Matches Twilsonco tw-main max + self.MAX_ACC_REGEN = 7110 # Max ACC regen is slightly less than max paddle regen self.INACTIVE_REGEN = 5500 # ICE has much less engine braking force compared to regen in EVs, # lower threshold removes some braking deadzone