diff --git a/opendbc_repo/opendbc/car/chrysler/carcontroller.py b/opendbc_repo/opendbc/car/chrysler/carcontroller.py index 8a2e9582c..bed77c827 100644 --- a/opendbc_repo/opendbc/car/chrysler/carcontroller.py +++ b/opendbc_repo/opendbc/car/chrysler/carcontroller.py @@ -2,7 +2,7 @@ from opendbc.can import CANPacker from opendbc.car import Bus, DT_CTRL from opendbc.car.lateral import apply_meas_steer_torque_limits from opendbc.car.chrysler import chryslercan -from opendbc.car.chrysler.values import RAM_CARS, CarControllerParams, ChryslerFlags +from opendbc.car.chrysler.values import RAM_CARS, RAM_DT, CarControllerParams, ChryslerFlags from opendbc.car.interfaces import CarControllerBase @@ -31,12 +31,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, CS.button_counter + 1, das_bus, CS.button_message, 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, CS.button_counter + 1, das_bus, CS.button_message, resume=True)) # HUD alerts if self.frame % 25 == 0: @@ -50,7 +50,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/opendbc_repo/opendbc/car/chrysler/carstate.py b/opendbc_repo/opendbc/car/chrysler/carstate.py index 2eed3db9e..7c8fd5054 100644 --- a/opendbc_repo/opendbc/car/chrysler/carstate.py +++ b/opendbc_repo/opendbc/car/chrysler/carstate.py @@ -1,6 +1,6 @@ from opendbc.can import CANDefine, CANParser from opendbc.car import Bus, create_button_events, structs -from opendbc.car.chrysler.values import DBC, STEER_THRESHOLD, RAM_CARS +from opendbc.car.chrysler.values import DBC, STEER_THRESHOLD, RAM_CARS, ChryslerFrogPilotFlags from opendbc.car.common.conversions import Conversions as CV from opendbc.car.interfaces import CarStateBase @@ -24,6 +24,9 @@ class CarState(CarStateBase): self.distance_button = 0 + # RealFast variables + self.button_message = "CRUISE_BUTTONS_ALT" if FPCP.flags & ChryslerFrogPilotFlags.RAM_HD_ALT_BUTTONS else "CRUISE_BUTTONS" + def update(self, can_parsers) -> structs.CarState: cp = can_parsers[Bus.pt] cp_cam = can_parsers[Bus.cam] @@ -31,7 +34,7 @@ class CarState(CarStateBase): ret = structs.CarState() 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"], @@ -93,7 +96,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"] ret.buttonEvents = create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}) diff --git a/opendbc_repo/opendbc/car/chrysler/chryslercan.py b/opendbc_repo/opendbc/car/chrysler/chryslercan.py index 677582ef4..1fbd84c83 100644 --- a/opendbc_repo/opendbc/car/chrysler/chryslercan.py +++ b/opendbc_repo/opendbc/car/chrysler/chryslercan.py @@ -64,13 +64,13 @@ def create_lkas_command(packer, CP, apply_torque, 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, frame, bus, button_message, cancel=False, resume=False): values = { "ACC_Cancel": cancel, "ACC_Resume": resume, "COUNTER": frame % 0x10, } - return packer.make_can_msg("CRUISE_BUTTONS", bus, values) + return packer.make_can_msg(button_message, bus, values) def chrysler_checksum(address: int, sig, d: bytearray) -> int: diff --git a/opendbc_repo/opendbc/car/chrysler/fingerprints.py b/opendbc_repo/opendbc/car/chrysler/fingerprints.py index 97557a141..79f990859 100644 --- a/opendbc_repo/opendbc/car/chrysler/fingerprints.py +++ b/opendbc_repo/opendbc/car/chrysler/fingerprints.py @@ -441,6 +441,7 @@ FW_VERSIONS = { b'68453483AC', b'68453483AD', b'68453487AD', + b'68453485AC', b'68453491AC', b'68453491AD', b'68453499AD', @@ -461,6 +462,7 @@ FW_VERSIONS = { b'68510282AG', b'68510282AH', b'68510283AG', + b'68510283AH', b'68527346AE', b'68527361AD', b'68527375AD', @@ -555,6 +557,7 @@ FW_VERSIONS = { b'68552788AA', b'68552789AA', b'68552790AA', + b'68552791AA', b'68552791AB', b'68552794AA', b'68552794AD', @@ -575,6 +578,7 @@ FW_VERSIONS = { b'05036067AE ', b'05036193AA ', b'05149368AA ', + b'05149390AA ', b'05149374AA ', b'05149591AD ', b'05149591AE ', @@ -590,6 +594,7 @@ FW_VERSIONS = { b'05190346AD', b'68378695AI ', b'68378695AJ ', + b'68378696AI ', b'68378695AK ', b'68378696AJ ', b'68378696AK ', @@ -626,6 +631,7 @@ FW_VERSIONS = { b'68500630AE', b'68500630AF', b'68500631AE', + b'68500631AF', b'68502719AC ', b'68502722AC ', b'68502733AC ', @@ -667,6 +673,7 @@ FW_VERSIONS = { b'68360085AL', b'68360085AO', b'68360086AH', + b'68360086AL', b'68360086AK', b'68360086AN', b'68384328AD', @@ -685,6 +692,7 @@ FW_VERSIONS = { b'68502994AC', b'68502994AD', b'68502996AD', + b'68502996AC', b'68520867AE', b'68520867AF', b'68520870AC', @@ -701,14 +709,22 @@ 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'68620923AC', b'68628474AB', ], (Ecu.srs, 0x744, None): [ + b'68346749AB', b'68399794AC', b'68428503AA', b'68428505AA', @@ -722,6 +738,7 @@ FW_VERSIONS = { b'68504022AC', b'68530686AB', b'68530686AC', + b'68530686AD', b'68544596AC', b'68641704AA', ], @@ -744,14 +761,19 @@ FW_VERSIONS = { b'52370131AF', b'52370231AF', b'52370231AG', + b'52370231AK', b'52370491AA', b'52370931CT', b'52401032AE', b'52421132AF', b'52421332AF', + b'52421332AG', b'68527616AD ', + b'68528545AF', b'M2370131MB', b'M2421132MB', + b'52421232AF', + b'52421492AA', ], }, CAR.DODGE_DURANGO: { diff --git a/opendbc_repo/opendbc/car/chrysler/interface.py b/opendbc_repo/opendbc/car/chrysler/interface.py index 0be2ccacb..b131e1b6e 100755 --- a/opendbc_repo/opendbc/car/chrysler/interface.py +++ b/opendbc_repo/opendbc/car/chrysler/interface.py @@ -62,9 +62,19 @@ class CarInterface(CarInterfaceBase): if any(fw.ecu == 'eps' and b"68" < fw.fwVersion[:4] <= b"6831" for fw in car_fw): ret.minSteerSpeed = 0. + # RealFast variables + ret.minEnableSpeed = 14.5 + ret.minSteerSpeed = 0.5 + elif candidate == CAR.RAM_HD_5TH_GEN: ret.steerActuatorDelay = 0.2 + # RealFast variables + ret.mass = 3405. + ret.minSteerSpeed = 16 + ret.steerRatio = 15.61 + ret.wheelbase = 3.785 + else: raise ValueError(f"Unsupported car: {candidate}") diff --git a/opendbc_repo/opendbc/car/chrysler/values.py b/opendbc_repo/opendbc/car/chrysler/values.py index 232e5712e..1d919631a 100644 --- a/opendbc_repo/opendbc/car/chrysler/values.py +++ b/opendbc_repo/opendbc/car/chrysler/values.py @@ -19,6 +19,11 @@ class ChryslerFlags(IntFlag): HIGHER_MIN_STEERING_SPEED = 1 +# FrogPilot variables +class ChryslerFrogPilotFlags(IntFlag): + RAM_HD_ALT_BUTTONS = 1 + + @dataclass class ChryslerCarDocs(CarDocs): package: str = "Adaptive Cruise Control (ACC)" @@ -104,7 +109,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 diff --git a/opendbc_repo/opendbc/safety/modes/chrysler.h b/opendbc_repo/opendbc/safety/modes/chrysler.h index e8e2ac0eb..70e2a3de1 100644 --- a/opendbc_repo/opendbc/safety/modes/chrysler.h +++ b/opendbc_repo/opendbc/safety/modes/chrysler.h @@ -11,6 +11,9 @@ typedef struct { const unsigned int DAS_6; const unsigned int LKAS_COMMAND; const unsigned int CRUISE_BUTTONS; + + // RealFast variables + const unsigned int CRUISE_BUTTONS_ALT; } ChryslerAddrs; typedef enum { @@ -145,7 +148,7 @@ static bool chrysler_tx_hook(const CANPacket_t *msg) { } // FORCE CANCEL: only the cancel button press is allowed - if (msg->addr == chrysler_addrs->CRUISE_BUTTONS) { + if (msg->addr == chrysler_addrs->CRUISE_BUTTONS || msg->addr == chrysler_addrs->CRUISE_BUTTONS_ALT) { const bool is_cancel = msg->data[0] == 1U; const bool is_resume = msg->data[0] == 0x10U; const bool allowed = is_cancel || (is_resume && controls_allowed); @@ -171,6 +174,9 @@ static safety_config chrysler_init(uint16_t param) { .DAS_6 = 0x2A6, // LKAS HUD and auto headlight control from DASM .LKAS_COMMAND = 0x292, // LKAS controls from DASM .CRUISE_BUTTONS = 0x23B, // Cruise control buttons + + // RealFast variables + .CRUISE_BUTTONS_ALT = 0x23B, // Cruise control buttons }; // CAN messages for the 5th gen RAM DT platform @@ -183,6 +189,9 @@ static safety_config chrysler_init(uint16_t param) { .DAS_6 = 0xFA, // LKAS HUD and auto headlight control from DASM .LKAS_COMMAND = 0xA6, // LKAS controls from DASM .CRUISE_BUTTONS = 0xB1, // Cruise control buttons + + // RealFast variables + .CRUISE_BUTTONS_ALT = 0xB1, // Cruise control buttons }; static RxCheck chrysler_ram_dt_rx_checks[] = { @@ -206,12 +215,18 @@ static safety_config chrysler_init(uint16_t param) { {CHRYSLER_ADDRS.CRUISE_BUTTONS, 0, 3, .check_relay = false}, {CHRYSLER_ADDRS.LKAS_COMMAND, 0, 6, .check_relay = true}, {CHRYSLER_ADDRS.DAS_6, 0, 8, .check_relay = true}, + + // RealFast variables + {CHRYSLER_ADDRS.CRUISE_BUTTONS_ALT, 2, 3, .check_relay = false}, }; static const CanMsg CHRYSLER_RAM_DT_TX_MSGS[] = { {CHRYSLER_RAM_DT_ADDRS.CRUISE_BUTTONS, 2, 3, .check_relay = false}, {CHRYSLER_RAM_DT_ADDRS.LKAS_COMMAND, 0, 8, .check_relay = true}, {CHRYSLER_RAM_DT_ADDRS.DAS_6, 0, 8, .check_relay = true}, + + // RealFast variables + {CHRYSLER_RAM_DT_ADDRS.CRUISE_BUTTONS_ALT, 2, 3, .check_relay = false}, }; #ifdef ALLOW_DEBUG @@ -225,6 +240,9 @@ static safety_config chrysler_init(uint16_t param) { .DAS_6 = 0x275, // LKAS HUD and auto headlight control from DASM .LKAS_COMMAND = 0x276, // LKAS controls from DASM .CRUISE_BUTTONS = 0x23A, // Cruise control buttons + + // RealFast variables + .CRUISE_BUTTONS_ALT = 0x23B, // Cruise control buttons }; static RxCheck chrysler_ram_hd_rx_checks[] = { @@ -239,6 +257,9 @@ static safety_config chrysler_init(uint16_t param) { {CHRYSLER_RAM_HD_ADDRS.CRUISE_BUTTONS, 2, 3, .check_relay = false}, {CHRYSLER_RAM_HD_ADDRS.LKAS_COMMAND, 0, 8, .check_relay = true}, {CHRYSLER_RAM_HD_ADDRS.DAS_6, 0, 8, .check_relay = true}, + + // RealFast variables + {CHRYSLER_RAM_HD_ADDRS.CRUISE_BUTTONS_ALT, 2, 3, .check_relay = false}, }; const uint32_t CHRYSLER_PARAM_RAM_HD = 2U; // set for Ram HD platform diff --git a/selfdrive/car/car_specific.py b/selfdrive/car/car_specific.py index 1e5107f8a..81f9778b8 100644 --- a/selfdrive/car/car_specific.py +++ b/selfdrive/car/car_specific.py @@ -1,6 +1,7 @@ from cereal import car, log import cereal.messaging as messaging from opendbc.car import DT_CTRL, structs +from opendbc.car.chrysler.values import RAM_DT from opendbc.car.gm.values import GMFlags from opendbc.car.interfaces import MAX_CTRL_SPEED @@ -58,10 +59,16 @@ class CarSpecificEvents: events = self.create_common_events(CS, CS_prev, extra_gears=extra_gears) # Low speed steer alert hysteresis logic - if self.CP.minSteerSpeed > 0. and CS.vEgo < (self.CP.minSteerSpeed + 0.5): - self.low_speed_alert = True - elif CS.vEgo > (self.CP.minSteerSpeed + 1.): - self.low_speed_alert = False + if self.CP.carFingerprint in RAM_DT: + if CS.vEgo >= self.CP.minEnableSpeed: + self.low_speed_alert = False + if (self.CP.minEnableSpeed >= 14.5) and (CS.gearShifter != GearShifter.drive): + self.low_speed_alert = True + else: + if self.CP.minSteerSpeed > 0. and CS.vEgo < (self.CP.minSteerSpeed + 0.5): + self.low_speed_alert = True + elif CS.vEgo > (self.CP.minSteerSpeed + 1.): + self.low_speed_alert = False if self.low_speed_alert: events.add(EventName.belowSteerSpeed) diff --git a/selfdrive/locationd/paramsd.py b/selfdrive/locationd/paramsd.py index b4084fe5b..a5a7228e1 100755 --- a/selfdrive/locationd/paramsd.py +++ b/selfdrive/locationd/paramsd.py @@ -57,6 +57,9 @@ class VehicleParamsLearner: self.reset(None) + # FrogPilot variables + self.CP = CP + def reset(self, t: float | None): self.kf.init_state(self.x_initial, covs=self.P_initial, filter_time=t) @@ -187,6 +190,10 @@ class VehicleParamsLearner: liveParameters.debugFilterState.value = x.tolist() liveParameters.debugFilterState.std = P.tolist() + # FrogPilot variables + if self.CP.carFingerprint == "RAM_HD": + liveParameters.valid = True + return msg