From fa83aef8bb71ebca07634a32fe8a035b5857e1c7 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Fri, 10 Oct 2025 00:09:59 -0500 Subject: [PATCH] Pedal Panda? --- panda/board/safety/safety_gm.h | 52 +++++++++------------------------- 1 file changed, 13 insertions(+), 39 deletions(-) diff --git a/panda/board/safety/safety_gm.h b/panda/board/safety/safety_gm.h index dfa936e69..34ed7052d 100644 --- a/panda/board/safety/safety_gm.h +++ b/panda/board/safety/safety_gm.h @@ -10,16 +10,16 @@ const SteeringLimits GM_STEERING_LIMITS = { }; const LongitudinalLimits GM_ASCM_LONG_LIMITS = { - .max_gas = 3072, - .min_gas = 1404, - .inactive_gas = 1404, + .max_gas = 7168, + .min_gas = 5500, + .inactive_gas = 5500, .max_brake = 400, }; const LongitudinalLimits GM_CAM_LONG_LIMITS = { - .max_gas = 3400, - .min_gas = 1514, - .inactive_gas = 1554, + .max_gas = 7496, + .min_gas = 5610, + .inactive_gas = 5650, .max_brake = 400, }; @@ -143,7 +143,7 @@ static void gm_rx_hook(const CANPacket_t *to_push) { } if ((addr == 0xC9) && ((gm_hw == GM_CAM) || (gm_hw == GM_SDGM))) { - brake_pressed = GET_BIT(to_push, 40U); + brake_pressed = GET_BIT(to_push, 40U) != 0U; } if (addr == 0xC9) { @@ -172,13 +172,6 @@ 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; } @@ -199,12 +192,6 @@ 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) { @@ -242,10 +229,10 @@ static bool gm_tx_hook(const CANPacket_t *to_send) { // GAS/REGEN: safety check if (addr == 0x2CB) { bool apply = GET_BIT(to_send, 0U); - int gas_regen = ((GET_BYTE(to_send, 2) & 0x7FU) << 5) + ((GET_BYTE(to_send, 3) & 0xF8U) >> 3); + int gas_regen = ((GET_BYTE(to_send, 1) & 0x1U) << 13) + ((GET_BYTE(to_send, 2) & 0xFFU) << 5) + ((GET_BYTE(to_send, 3) & 0xF8U) >> 3); bool violation = false; - // Allow apply bit in pre-enabled and overriding states, except for inactive gas // Allow apply bit in pre-enabled and overriding states + // Allow apply bit in pre-enabled and overriding states violation |= !controls_allowed && apply; violation |= longitudinal_gas_checks(gas_regen, *gm_long_limits); @@ -259,11 +246,6 @@ 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); @@ -306,13 +288,9 @@ static int gm_fwd_hook(int bus_num, int addr) { } if (bus_num == 2) { - // block lkas message and acc messages - // Block 0x370 only for experimental long without pedal interceptor + // block lkas message and acc messages if gm_cam_long, forward all others bool is_lkas_msg = (addr == 0x180); - bool is_acc_msg = (addr == 0x315) || (addr == 0x2CB); - if (gm_cam_long && !enable_gas_interceptor) { - is_acc_msg = is_acc_msg || (addr == 0x370); - } + bool is_acc_msg = (addr == 0x315) || (addr == 0x2CB) || (addr == 0x370); bool block_msg = is_lkas_msg || (is_acc_msg && gm_cam_long); if (!block_msg) { bus_fwd = 0; @@ -335,19 +313,15 @@ static safety_config gm_init(uint16_t param) { gm_force_ascm = GET_FLAG(param, GM_PARAM_HW_ASCM_LONG); if (gm_hw == GM_ASCM || gm_force_ascm) { - gm_long_limits = &GM_ASCM_LONG_LIMITS; + gm_long_limits = &GM_ASCM_LONG_LIMITS; } else if ((gm_hw == GM_CAM) || (gm_hw == GM_SDGM)) { - gm_long_limits = &GM_CAM_LONG_LIMITS; + gm_long_limits = &GM_CAM_LONG_LIMITS; } else { } 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);