From 98596435afc359067737d9ecf65995ab69762a39 Mon Sep 17 00:00:00 2001 From: FrogAi <91348155+FrogAi@users.noreply.github.com> Date: Fri, 5 Jul 2024 17:20:42 -0700 Subject: [PATCH] FrogPilot community - Added Realfast Tweaks and New Ram HDs Co-Authored-By: Vincent Wright <1850511+vincentw56@users.noreply.github.com> --- opendbc/chrysler_ram_hd_generated.dbc | 16 +++++++++++++++- panda/board/safety/safety_chrysler.h | 8 +++++++- selfdrive/car/chrysler/carcontroller.py | 13 +++++++++---- selfdrive/car/chrysler/carstate.py | 10 ++++++---- selfdrive/car/chrysler/chryslercan.py | 7 ++++--- selfdrive/car/chrysler/fingerprints.py | 12 ++++++++++++ selfdrive/car/chrysler/interface.py | 25 ++++++++++++++++++++----- selfdrive/car/chrysler/values.py | 3 ++- 8 files changed, 75 insertions(+), 19 deletions(-) diff --git a/opendbc/chrysler_ram_hd_generated.dbc b/opendbc/chrysler_ram_hd_generated.dbc index 697c3bf91..31e62ec65 100644 --- a/opendbc/chrysler_ram_hd_generated.dbc +++ b/opendbc/chrysler_ram_hd_generated.dbc @@ -90,9 +90,11 @@ BO_ 500 DAS_3: 8 XXX SG_ DISABLE_FUEL_SHUTOFF : 23|1@1+ (1,0) [0|0] "" XXX SG_ GR_MAX_REQ : 32|4@1+ (1,0) [0|0] "" XXX SG_ ACC_DECEL_REQ : 36|3@1+ (1,0) [0|0] "" XXX - SG_ ACC_FAULTED : 46|2@1+ (1,0) [0|0] "" XXX + SG_ STS : 46|2@1+ (1,0) [0|0] "" XXX + SG_ ACC_FAULTED : 47|1@0+ (1,0) [0|1] "" XXX SG_ COLLISION_BRK_PREP : 48|1@1+ (1,0) [0|0] "" XXX SG_ ACC_BRK_PREP : 49|1@1+ (1,0) [0|0] "" XXX + SG_ BRAKE_BOOL_1 : 36|1@0+ (1,0) [0|3] "" XXX SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX @@ -137,6 +139,18 @@ BO_ 570 CRUISE_BUTTONS: 3 XXX SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX +BO_ 571 CRUISE_BUTTONS_ALT: 3 XXX + SG_ ACC_Cancel : 0|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Distance_Dec : 1|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Accel : 2|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Decel : 3|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Resume : 4|1@0+ (1,0) [0|1] "" XXX + SG_ Cruise_OnOff : 6|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_OnOff : 7|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Distance_Inc : 8|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX + BO_ 625 DAS_5: 8 XXX SG_ FCW_STATE : 2|1@1+ (1,0) [0|0] "" XXX SG_ FCW_DISTANCE : 3|2@1+ (1,0) [0|0] "" XXX diff --git a/panda/board/safety/safety_chrysler.h b/panda/board/safety/safety_chrysler.h index be27832c9..60fac77bd 100644 --- a/panda/board/safety/safety_chrysler.h +++ b/panda/board/safety/safety_chrysler.h @@ -37,6 +37,7 @@ typedef struct { const int DAS_6; const int LKAS_COMMAND; const int CRUISE_BUTTONS; + const int CRUISE_BUTTONS_ALT; } ChryslerAddrs; // CAN messages for Chrysler/Jeep platforms @@ -49,6 +50,7 @@ const ChryslerAddrs CHRYSLER_ADDRS = { .DAS_6 = 0x2A6, // LKAS HUD and auto headlight control from DASM .LKAS_COMMAND = 0x292, // LKAS controls from DASM .CRUISE_BUTTONS = 0x23B, // Cruise control buttons + .CRUISE_BUTTONS_ALT = 0x23B, // Cruise control buttons }; // CAN messages for the 5th gen RAM DT platform @@ -61,6 +63,7 @@ const ChryslerAddrs CHRYSLER_RAM_DT_ADDRS = { .DAS_6 = 0xFA, // LKAS HUD and auto headlight control from DASM .LKAS_COMMAND = 0xA6, // LKAS controls from DASM .CRUISE_BUTTONS = 0xB1, // Cruise control buttons + .CRUISE_BUTTONS_ALT = 0xB1, // Cruise control buttons }; // CAN messages for the 5th gen RAM HD platform @@ -73,6 +76,7 @@ const ChryslerAddrs CHRYSLER_RAM_HD_ADDRS = { .DAS_6 = 0x275, // LKAS HUD and auto headlight control from DASM .LKAS_COMMAND = 0x276, // LKAS controls from DASM .CRUISE_BUTTONS = 0x23A, // Cruise control buttons + .CRUISE_BUTTONS_ALT = 0x23B, // Cruise control buttons }; const CanMsg CHRYSLER_TX_MSGS[] = { @@ -83,12 +87,14 @@ const CanMsg CHRYSLER_TX_MSGS[] = { const CanMsg CHRYSLER_RAM_DT_TX_MSGS[] = { {CHRYSLER_RAM_DT_ADDRS.CRUISE_BUTTONS, 2, 3}, + {CHRYSLER_RAM_DT_ADDRS.CRUISE_BUTTONS_ALT, 2, 3}, {CHRYSLER_RAM_DT_ADDRS.LKAS_COMMAND, 0, 8}, {CHRYSLER_RAM_DT_ADDRS.DAS_6, 0, 8}, }; const CanMsg CHRYSLER_RAM_HD_TX_MSGS[] = { {CHRYSLER_RAM_HD_ADDRS.CRUISE_BUTTONS, 2, 3}, + {CHRYSLER_RAM_HD_ADDRS.CRUISE_BUTTONS_ALT, 2, 3}, {CHRYSLER_RAM_HD_ADDRS.LKAS_COMMAND, 0, 8}, {CHRYSLER_RAM_HD_ADDRS.DAS_6, 0, 8}, }; @@ -234,7 +240,7 @@ static bool chrysler_tx_hook(const CANPacket_t *to_send) { } // FORCE CANCEL: only the cancel button press is allowed - if (addr == chrysler_addrs->CRUISE_BUTTONS) { + if ((addr == chrysler_addrs->CRUISE_BUTTONS) || (addr == CHRYSLER_RAM_HD_ADDRS.CRUISE_BUTTONS_ALT)) { const bool is_cancel = GET_BYTE(to_send, 0) == 1U; const bool is_resume = GET_BYTE(to_send, 0) == 0x10U; const bool allowed = is_cancel || (is_resume && controls_allowed); diff --git a/selfdrive/car/chrysler/carcontroller.py b/selfdrive/car/chrysler/carcontroller.py index 124b92f50..639e4a62f 100644 --- a/selfdrive/car/chrysler/carcontroller.py +++ b/selfdrive/car/chrysler/carcontroller.py @@ -2,7 +2,7 @@ from opendbc.can.packer import CANPacker from openpilot.common.realtime import DT_CTRL from openpilot.selfdrive.car import apply_meas_steer_torque_limits from openpilot.selfdrive.car.chrysler import chryslercan -from openpilot.selfdrive.car.chrysler.values import RAM_CARS, CarControllerParams, ChryslerFlags +from openpilot.selfdrive.car.chrysler.values import RAM_CARS, RAM_DT, CarControllerParams, ChryslerFlags from openpilot.selfdrive.car.interfaces import CarControllerBase @@ -32,12 +32,12 @@ class CarController(CarControllerBase): # ACC cancellation if CC.cruiseControl.cancel: self.last_button_frame = self.frame - can_sends.append(chryslercan.create_cruise_buttons(self.packer, CS.button_counter + 1, das_bus, cancel=True)) + can_sends.append(chryslercan.create_cruise_buttons(self.packer, self.CP, CS.button_counter + 1, das_bus, cancel=True)) # ACC resume from standstill elif CC.cruiseControl.resume: self.last_button_frame = self.frame - can_sends.append(chryslercan.create_cruise_buttons(self.packer, CS.button_counter + 1, das_bus, resume=True)) + can_sends.append(chryslercan.create_cruise_buttons(self.packer, self.CP, CS.button_counter + 1, das_bus, resume=True)) # HUD alerts if self.frame % 25 == 0: @@ -51,7 +51,12 @@ class CarController(CarControllerBase): # TODO: can we make this more sane? why is it different for all the cars? lkas_control_bit = self.lkas_control_bit_prev - if CS.out.vEgo > self.CP.minSteerSpeed: + if self.CP.carFingerprint in RAM_DT: + if self.CP.minEnableSpeed <= CS.out.vEgo <= self.CP.minEnableSpeed + 0.5: + lkas_control_bit = True + if (self.CP.minEnableSpeed >= 14.5) and (CS.out.gearShifter != 2): + lkas_control_bit = False + elif CS.out.vEgo > self.CP.minSteerSpeed: lkas_control_bit = True elif self.CP.flags & ChryslerFlags.HIGHER_MIN_STEERING_SPEED: if CS.out.vEgo < (self.CP.minSteerSpeed - 3.0): diff --git a/selfdrive/car/chrysler/carstate.py b/selfdrive/car/chrysler/carstate.py index 05d6c7802..8b5041891 100644 --- a/selfdrive/car/chrysler/carstate.py +++ b/selfdrive/car/chrysler/carstate.py @@ -3,7 +3,7 @@ from openpilot.common.conversions import Conversions as CV from opendbc.can.parser import CANParser from opendbc.can.can_define import CANDefine from openpilot.selfdrive.car.interfaces import CarStateBase -from openpilot.selfdrive.car.chrysler.values import DBC, STEER_THRESHOLD, RAM_CARS +from openpilot.selfdrive.car.chrysler.values import ChryslerFlags, DBC, STEER_THRESHOLD, RAM_CARS class CarState(CarStateBase): @@ -15,6 +15,7 @@ class CarState(CarStateBase): self.auto_high_beam = 0 self.button_counter = 0 self.lkas_car_model = -1 + self.button_message = "CRUISE_BUTTONS_ALT" if CP.flags & ChryslerFlags.RAM_HD_ALT_BUTTONS else "CRUISE_BUTTONS" if CP.carFingerprint in RAM_CARS: self.shifter_values = can_define.dv["Transmission_Status"]["Gear_State"] @@ -30,7 +31,7 @@ class CarState(CarStateBase): fp_ret = custom.FrogPilotCarState.new_message() self.prev_distance_button = self.distance_button - self.distance_button = cp.vl["CRUISE_BUTTONS"]["ACC_Distance_Dec"] + self.distance_button = cp.vl[self.button_message]["ACC_Distance_Dec"] # lock info ret.doorOpen = any([cp.vl["BCM_1"]["DOOR_OPEN_FL"], @@ -100,7 +101,7 @@ class CarState(CarStateBase): ret.rightBlindspot = cp.vl["BSM_1"]["RIGHT_STATUS"] == 1 self.lkas_car_model = cp_cam.vl["DAS_6"]["CAR_MODEL"] - self.button_counter = cp.vl["CRUISE_BUTTONS"]["COUNTER"] + self.button_counter = cp.vl[self.button_message]["COUNTER"] return ret, fp_ret @@ -114,6 +115,7 @@ class CarState(CarStateBase): @staticmethod def get_can_parser(CP): + button_message = "CRUISE_BUTTONS_ALT" if CP.flags & ChryslerFlags.RAM_HD_ALT_BUTTONS else "CRUISE_BUTTONS" messages = [ # sig_address, frequency ("ESP_1", 50), @@ -121,7 +123,7 @@ class CarState(CarStateBase): ("ESP_6", 50), ("STEERING", 100), ("ECM_5", 50), - ("CRUISE_BUTTONS", 50), + (button_message, 50), ("STEERING_LEVERS", 10), ("ORC_1", 2), ("BCM_1", 1), diff --git a/selfdrive/car/chrysler/chryslercan.py b/selfdrive/car/chrysler/chryslercan.py index 96439f35d..05b4bcab1 100644 --- a/selfdrive/car/chrysler/chryslercan.py +++ b/selfdrive/car/chrysler/chryslercan.py @@ -1,5 +1,5 @@ from cereal import car -from openpilot.selfdrive.car.chrysler.values import RAM_CARS +from openpilot.selfdrive.car.chrysler.values import ChryslerFlags, RAM_CARS GearShifter = car.CarState.GearShifter VisualAlert = car.CarControl.HUDControl.VisualAlert @@ -62,10 +62,11 @@ def create_lkas_command(packer, CP, apply_steer, lkas_control_bit): return packer.make_can_msg("LKAS_COMMAND", 0, values) -def create_cruise_buttons(packer, frame, bus, cancel=False, resume=False): +def create_cruise_buttons(packer, CP, frame, bus, cancel=False, resume=False): values = { "ACC_Cancel": cancel, "ACC_Resume": resume, "COUNTER": frame % 0x10, } - return packer.make_can_msg("CRUISE_BUTTONS", bus, values) + button_message = "CRUISE_BUTTONS_ALT" if CP.flags & ChryslerFlags.RAM_HD_ALT_BUTTONS else "CRUISE_BUTTONS" + return packer.make_can_msg(button_message, bus, values) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index 5072aad5c..da8ac55a0 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -535,6 +535,7 @@ FW_VERSIONS = { b'05149848AC ', b'05190341AD', b'68378695AJ ', + b'68378696AI ', b'68378696AJ ', b'68378701AI ', b'68378702AI ', @@ -591,6 +592,7 @@ FW_VERSIONS = { b'68360081AM', b'68360085AJ', b'68360085AL', + b'68360085AF', b'68360086AH', b'68360086AK', b'68384328AD', @@ -620,14 +622,21 @@ FW_VERSIONS = { (Ecu.combinationMeter, 0x742, None): [ b'68361606AH', b'68437735AC', + b'68437746AD', + b'68492682AD', + b'68525438AB', b'68492693AD', b'68525485AB', b'68525487AB', b'68525498AB', b'68528791AF', + b'68620919AB', + b'68620921AC', + b'68620923AB', b'68628474AB', ], (Ecu.srs, 0x744, None): [ + b'68346749AB', b'68399794AC', b'68428503AA', b'68428505AA', @@ -668,9 +677,12 @@ FW_VERSIONS = { b'52401032AE', b'52421132AF', b'52421332AF', + b'52421332AG', b'68527616AD ', b'M2370131MB', b'M2421132MB', + b'52421232AF', + b'52421492AA', ], }, CAR.DODGE_DURANGO: { diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index 41c1ab4cd..da7e52056 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -12,7 +12,6 @@ class CarInterface(CarInterfaceBase): @staticmethod def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs, params): ret.carName = "chrysler" - ret.dashcamOnly = candidate in RAM_HD # radar parsing needs some work, see https://github.com/commaai/openpilot/issues/26842 ret.radarUnavailable = True # DBC[candidate]['radar'] is None @@ -55,14 +54,24 @@ class CarInterface(CarInterfaceBase): elif candidate == CAR.RAM_1500_5TH_GEN: ret.steerActuatorDelay = 0.2 ret.wheelbase = 3.88 + ret.minSteerSpeed = 0.5 + ret.minEnableSpeed = 14.5 # Older EPS FW allow steer to zero if any(fw.ecu == 'eps' and b"68" < fw.fwVersion[:4] <= b"6831" for fw in car_fw): ret.minSteerSpeed = 0. elif candidate == CAR.RAM_HD_5TH_GEN: ret.steerActuatorDelay = 0.2 + ret.wheelbase = 3.785 + ret.steerRatio = 15.61 + ret.mass = 3405. + ret.minSteerSpeed = 16 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning, 1.0, False) + # Some RAM HD use Chrysler button address + if 570 not in fingerprint[0]: + ret.flags |= ChryslerFlags.RAM_HD_ALT_BUTTONS.value + else: raise ValueError(f"Unsupported car: {candidate}") @@ -85,10 +94,16 @@ class CarInterface(CarInterfaceBase): events = self.create_common_events(ret, extra_gears=[car.CarState.GearShifter.low]) # Low speed steer alert hysteresis logic - if self.CP.minSteerSpeed > 0. and ret.vEgo < (self.CP.minSteerSpeed + 0.5): - self.low_speed_alert = True - elif ret.vEgo > (self.CP.minSteerSpeed + 1.): - self.low_speed_alert = False + if self.CP.carFingerprint in RAM_DT: + if self.CS.out.vEgo >= self.CP.minEnableSpeed: + self.low_speed_alert = False + if (self.CP.minEnableSpeed >= 14.5) and (self.CS.out.gearShifter != car.CarState.GearShifter.drive): + self.low_speed_alert = True + else: + if self.CP.minSteerSpeed > 0. and ret.vEgo < (self.CP.minSteerSpeed + 0.5): + self.low_speed_alert = True + elif ret.vEgo > (self.CP.minSteerSpeed + 1.): + self.low_speed_alert = False if self.low_speed_alert: events.add(car.CarEvent.EventName.belowSteerSpeed) diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index 42ea94cf8..14209bfb3 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -13,6 +13,7 @@ Ecu = car.CarParams.Ecu class ChryslerFlags(IntFlag): # Detected flags HIGHER_MIN_STEERING_SPEED = 1 + RAM_HD_ALT_BUTTONS = 2 @dataclass class ChryslerCarDocs(CarDocs): @@ -100,7 +101,7 @@ class CarControllerParams: elif CP.carFingerprint in RAM_DT: self.STEER_DELTA_UP = 6 self.STEER_DELTA_DOWN = 6 - self.STEER_MAX = 261 # EPS allows more, up to 350? + self.STEER_MAX = 350 # EPS allows more, up to 350? else: self.STEER_DELTA_UP = 3 self.STEER_DELTA_DOWN = 3