From ce3caf5a1127f4ca88b89c8de163d37584884f8b Mon Sep 17 00:00:00 2001 From: FrogAi <91348155+FrogAi@users.noreply.github.com> Date: Fri, 12 Jan 2024 22:39:30 -0700 Subject: [PATCH] Skip harness relay check if camera is missing Co-Authored-By: Eric Brown <13560103+nworb-cire@users.noreply.github.com> --- panda/board/safety.h | 2 +- panda/board/safety/safety_gm.h | 2 ++ panda/python/__init__.py | 1 + selfdrive/car/gm/carstate.py | 14 ++++++++++---- selfdrive/car/gm/interface.py | 7 +++++++ selfdrive/car/gm/values.py | 3 ++- 6 files changed, 23 insertions(+), 6 deletions(-) diff --git a/panda/board/safety.h b/panda/board/safety.h index 4f41e5b..aec3338 100644 --- a/panda/board/safety.h +++ b/panda/board/safety.h @@ -280,7 +280,7 @@ void generic_rx_checks(bool stock_ecu_detected) { regen_braking_prev = regen_braking; // check if stock ECU is on bus broken by car harness - if ((safety_mode_cnt > RELAY_TRNS_TIMEOUT) && stock_ecu_detected) { + if ((safety_mode_cnt > RELAY_TRNS_TIMEOUT) && stock_ecu_detected && !gm_skip_relay_check) { relay_malfunction_set(); } } diff --git a/panda/board/safety/safety_gm.h b/panda/board/safety/safety_gm.h index ec170cd..131b157 100644 --- a/panda/board/safety/safety_gm.h +++ b/panda/board/safety/safety_gm.h @@ -66,6 +66,7 @@ const uint16_t GM_PARAM_HW_CAM_LONG = 2; const uint16_t GM_PARAM_HW_SDGM = 4; const uint16_t GM_PARAM_CC_LONG = 8; const uint16_t GM_PARAM_HW_ASCM_LONG = 16; +const uint16_t GM_PARAM_NO_CAMERA = 32; const uint16_t GM_PARAM_NO_ACC = 64; const uint16_t GM_PARAM_PEDAL_LONG = 128; // TODO: this can be inferred const uint16_t GM_PARAM_PEDAL_INTERCEPTOR = 256; @@ -83,6 +84,7 @@ bool gm_pcm_cruise = false; bool gm_has_acc = true; bool gm_pedal_long = false; bool gm_cc_long = false; +bool gm_skip_relay_check = false; bool gm_force_ascm = false; static void handle_gm_wheel_buttons(CANPacket_t *to_push) { diff --git a/panda/python/__init__.py b/panda/python/__init__.py index a6b141a..69930f0 100644 --- a/panda/python/__init__.py +++ b/panda/python/__init__.py @@ -232,6 +232,7 @@ class Panda: FLAG_GM_HW_SDGM = 4 FLAG_GM_CC_LONG = 8 FLAG_GM_HW_ASCM_LONG = 16 + FLAG_GM_NO_CAMERA = 32 FLAG_GM_NO_ACC = 64 FLAG_GM_PEDAL_LONG = 128 FLAG_GM_GAS_INTERCEPTOR = 256 diff --git a/selfdrive/car/gm/carstate.py b/selfdrive/car/gm/carstate.py index 7dc30c4..a38c0a5 100644 --- a/selfdrive/car/gm/carstate.py +++ b/selfdrive/car/gm/carstate.py @@ -51,7 +51,7 @@ class CarState(CarStateBase): self.loopback_lka_steering_cmd_updated = len(loopback_cp.vl_all["ASCMLKASteeringCmd"]["RollingCounter"]) > 0 if self.loopback_lka_steering_cmd_updated: self.loopback_lka_steering_cmd_ts_nanos = loopback_cp.ts_nanos["ASCMLKASteeringCmd"]["RollingCounter"] - if self.CP.networkLocation == NetworkLocation.fwdCamera: + if self.CP.networkLocation == NetworkLocation.fwdCamera and not self.CP.flags & GMFlags.NO_CAMERA.value: self.pt_lka_steering_cmd_counter = pt_cp.vl["ASCMLKASteeringCmd"]["RollingCounter"] self.cam_lka_steering_cmd_counter = cam_cp.vl["ASCMLKASteeringCmd"]["RollingCounter"] @@ -71,7 +71,10 @@ class CarState(CarStateBase): else: ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(pt_cp.vl["ECMPRDNL2"]["PRNDL2"], None)) - ret.brake = pt_cp.vl["ECMAcceleratorPos"]["BrakePedalPos"] + if self.CP.flags & GMFlags.NO_ACCELERATOR_POS_MSG.value: + ret.brake = pt_cp.vl["EBCMBrakePedalPosition"]["BrakePedalPosition"] / 0xd0 + else: + ret.brake = pt_cp.vl["ECMAcceleratorPos"]["BrakePedalPos"] if self.CP.networkLocation == NetworkLocation.fwdCamera: ret.brakePressed = pt_cp.vl["ECMEngineStatus"]["BrakePressed"] != 0 else: @@ -138,7 +141,7 @@ class CarState(CarStateBase): ret.cruiseState.enabled = pt_cp.vl["AcceleratorPedal2"]["CruiseState"] != AccState.OFF ret.cruiseState.standstill = pt_cp.vl["AcceleratorPedal2"]["CruiseState"] == AccState.STANDSTILL - if self.CP.networkLocation == NetworkLocation.fwdCamera: + if self.CP.networkLocation == NetworkLocation.fwdCamera and not self.CP.flags & GMFlags.NO_CAMERA.value: if self.CP.carFingerprint not in CC_ONLY_CAR: ret.cruiseState.speed = cam_cp.vl["ASCMActiveCruiseControlStatus"]["ACCSpeedSetpoint"] * CV.KPH_TO_MS if self.CP.carFingerprint not in SDGM_CAR: @@ -176,7 +179,7 @@ class CarState(CarStateBase): @staticmethod def get_cam_can_parser(CP): messages = [] - if CP.networkLocation == NetworkLocation.fwdCamera: + if CP.networkLocation == NetworkLocation.fwdCamera and not CP.flags & GMFlags.NO_CAMERA.value: messages += [ ("ASCMLKASteeringCmd", 10), ] @@ -236,6 +239,9 @@ class CarState(CarStateBase): messages += [ ("ASCMLKASteeringCmd", 0), ] + if CP.flags & GMFlags.NO_ACCELERATOR_POS_MSG.value: + messages.remove(("ECMAcceleratorPos", 80)) + messages.append(("EBCMBrakePedalPosition", 100)) if CP.transmissionType == TransmissionType.direct: messages += [ diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index bd66676..d2c19f6 100644 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -22,6 +22,8 @@ BUTTONS_DICT = {CruiseButtons.RES_ACCEL: ButtonType.accelCruise, CruiseButtons.D ACCELERATOR_POS_MSG = 0xbe BSM_MSG = 0x142 +CAM_MSG = 0x320 # AEBCmd + # TODO: Is this always linked to camera presence? PEDAL_MSG = 0x201 NON_LINEAR_TORQUE_PARAMS = { @@ -365,6 +367,11 @@ class CarInterface(CarInterfaceBase): if candidate in CC_ONLY_CAR: ret.safetyConfigs[0].safetyParam |= Panda.FLAG_GM_NO_ACC + # Exception for flashed cars, or cars whose camera was removed + if (ret.networkLocation == NetworkLocation.fwdCamera or candidate in CC_ONLY_CAR) and CAM_MSG not in fingerprint[CanBus.CAMERA] and not candidate in SDGM_CAR: + ret.flags |= GMFlags.NO_CAMERA.value + ret.safetyConfigs[0].safetyParam |= Panda.FLAG_GM_NO_CAMERA + if ACCELERATOR_POS_MSG not in fingerprint[CanBus.POWERTRAIN]: ret.flags |= GMFlags.NO_ACCELERATOR_POS_MSG.value diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index da77af5..ef93928 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -1,6 +1,6 @@ from collections import defaultdict from dataclasses import dataclass -from enum import Enum, StrEnum +from enum import Enum, IntFlag, StrEnum from typing import Dict, List, Union from cereal import car @@ -179,6 +179,7 @@ class CanBus: class GMFlags(IntFlag): PEDAL_LONG = 1 CC_LONG = 2 + NO_CAMERA = 4 NO_ACCELERATOR_POS_MSG = 8