From a868fc6650a722f4a7d216c4ff24a915ade7de3c Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Thu, 22 Jan 2026 00:29:40 -0600 Subject: [PATCH] Buttons --- opendbc/gm_global_a_powertrain_generated.dbc | 1 + opendbc/gm_global_a_powertrain_volt.dbc | 1 + selfdrive/car/gm/carcontroller.py | 6 ++++-- selfdrive/car/gm/carstate.py | 4 ++++ selfdrive/car/gm/gmcan.py | 4 ++-- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/opendbc/gm_global_a_powertrain_generated.dbc b/opendbc/gm_global_a_powertrain_generated.dbc index aba27f0df..fca2ce69c 100644 --- a/opendbc/gm_global_a_powertrain_generated.dbc +++ b/opendbc/gm_global_a_powertrain_generated.dbc @@ -171,6 +171,7 @@ BO_ 481 ASCMSteeringButton: 7 K124_ASCM SG_ DistanceButton : 22|1@0+ (1,0) [0|0] "" NEO SG_ LKAButton : 23|1@0+ (1,0) [0|0] "" NEO SG_ ACCAlwaysOne : 24|1@0+ (1,0) [0|1] "" XXX + SG_ ACCHiddenBit : 30|1@0+ (1,0) [0|1] "" XXX SG_ ACCButtons : 46|3@0+ (1,0) [0|0] "" NEO SG_ DriveModeButton : 39|1@0+ (1,0) [0|1] "" XXX SG_ RollingCounter : 33|2@0+ (1,0) [0|3] "" NEO diff --git a/opendbc/gm_global_a_powertrain_volt.dbc b/opendbc/gm_global_a_powertrain_volt.dbc index 9361c7569..f49f69124 100644 --- a/opendbc/gm_global_a_powertrain_volt.dbc +++ b/opendbc/gm_global_a_powertrain_volt.dbc @@ -165,6 +165,7 @@ BO_ 481 ASCMSteeringButton: 7 K124_ASCM SG_ DistanceButton : 22|1@0+ (1,0) [0|0] "" NEO SG_ LKAButton : 23|1@0+ (1,0) [0|0] "" NEO SG_ ACCAlwaysOne : 24|1@0+ (1,0) [0|1] "" XXX + SG_ ACCHiddenBit : 30|1@0+ (1,0) [0|1] "" XXX SG_ ACCButtons : 46|3@0+ (1,0) [0|0] "" NEO SG_ DriveModeButton : 39|1@0+ (1,0) [0|1] "" XXX SG_ RollingCounter : 33|2@0+ (1,0) [0|3] "" NEO diff --git a/selfdrive/car/gm/carcontroller.py b/selfdrive/car/gm/carcontroller.py index 611b8a2f2..e52dde502 100644 --- a/selfdrive/car/gm/carcontroller.py +++ b/selfdrive/car/gm/carcontroller.py @@ -304,7 +304,8 @@ class CarController(CarControllerBase): self.malibu_cancel_phase = (phase_map[CS.steering_button_checksum] + 1) % 4 else: self.malibu_cancel_phase = (self.malibu_cancel_phase + 1) % 4 - can_sends.append(gmcan.create_buttons_malibu_cancel(CanBus.POWERTRAIN, self.malibu_cancel_phase)) + can_sends.append(gmcan.create_buttons_malibu_cancel( + CanBus.POWERTRAIN, self.malibu_cancel_phase, CS.steering_button_prefix)) self.malibu_cancel_frame += 1 else: if (self.frame - self.last_button_frame) * DT_CTRL > 0.04: @@ -325,7 +326,8 @@ class CarController(CarControllerBase): self.malibu_cancel_phase = (phase_map[CS.steering_button_checksum] + 1) % 4 else: self.malibu_cancel_phase = (self.malibu_cancel_phase + 1) % 4 - can_sends.append(gmcan.create_buttons_malibu_cancel(CanBus.POWERTRAIN, self.malibu_cancel_phase)) + can_sends.append(gmcan.create_buttons_malibu_cancel( + CanBus.POWERTRAIN, self.malibu_cancel_phase, CS.steering_button_prefix)) self.malibu_cancel_frame += 1 else: if (self.frame - self.last_button_frame) * DT_CTRL > 0.04: diff --git a/selfdrive/car/gm/carstate.py b/selfdrive/car/gm/carstate.py index 307661503..294df7979 100644 --- a/selfdrive/car/gm/carstate.py +++ b/selfdrive/car/gm/carstate.py @@ -27,6 +27,7 @@ class CarState(CarStateBase): self.cam_lka_steering_cmd_counter = 0 self.buttons_counter = 0 self.steering_button_checksum = 0 + self.steering_button_prefix = 0x01 self.prev_distance_button = 0 self.distance_button = 0 @@ -44,6 +45,9 @@ class CarState(CarStateBase): self.distance_button = pt_cp.vl["ASCMSteeringButton"]["DistanceButton"] self.buttons_counter = pt_cp.vl["ASCMSteeringButton"]["RollingCounter"] self.steering_button_checksum = pt_cp.vl["ASCMSteeringButton"]["SteeringButtonChecksum"] + acc_always_one = pt_cp.vl["ASCMSteeringButton"]["ACCAlwaysOne"] + acc_hidden_bit = pt_cp.vl["ASCMSteeringButton"].get("ACCHiddenBit", 0) + self.steering_button_prefix = (int(acc_always_one) & 1) | ((int(acc_hidden_bit) & 1) << 6) self.pscm_status = copy.copy(pt_cp.vl["PSCMStatus"]) # This is to avoid a fault where you engage while still moving backwards after shifting to D. # An Equinox has been seen with an unsupported status (3), so only check if either wheel is in reverse (2) diff --git a/selfdrive/car/gm/gmcan.py b/selfdrive/car/gm/gmcan.py index 58d9275b2..f1a3cd7a5 100644 --- a/selfdrive/car/gm/gmcan.py +++ b/selfdrive/car/gm/gmcan.py @@ -24,10 +24,10 @@ def create_buttons(packer, bus, idx, button): return packer.make_can_msg("ASCMSteeringButton", bus, values) -def create_buttons_malibu_cancel(bus, phase): +def create_buttons_malibu_cancel(bus, phase, prefix=0x41): # Malibu Hybrid CC cancel frames use a 4-value pattern in the last 2 bytes. data = bytearray(7) - data[3] = 0x41 # ACCAlwaysOne + data[3] = prefix & 0xFF data[4] = 0x00 cancel_bytes = (0x60, 0xAF, 0x65, 0x9E, 0x6A, 0x8D, 0x6F, 0x7C) idx = (phase % 4) * 2