Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
3d58d8c
Update values.py
alxs1234 Mar 28, 2026
e52bf4f
Update values.py
alxs1234 Mar 28, 2026
720baea
Update values.py
alxs1234 Mar 28, 2026
0e560dc
Update values.py
alxs1234 Mar 28, 2026
8b327d1
Update fingerprints.py
alxs1234 Mar 28, 2026
fb44e91
Add 2016 Jeep Grand Cherokee SRT
alxs1234 Mar 28, 2026
46e549b
Fix Values.py Spacing
alxs1234 Mar 30, 2026
2108939
Add 2016 Jeep Grand Cherokee SRT to params.toml
alxs1234 Mar 30, 2026
6ecafd4
Add 2016 Jeep Grand Cherokee SRT test route to routes.py
alxs1234 Mar 30, 2026
a270538
Merge branch 'master' into master
alxs1234 Mar 30, 2026
66912ce
Add support for Jeep Grand Cherokee SRT 2016
alxs1234 Mar 30, 2026
ee14723
Edit Jeep SRT Comment in values.py
alxs1234 Mar 30, 2026
63f8709
add SRT_CARS with tuned STEER_DELTA_UP for Jeep Grand Cherokee SRT
alxs1234 Mar 30, 2026
6b5b1d4
Adjust torque application when LKAS is inactive
alxs1234 Mar 30, 2026
a118654
SRT: soft torque ramp on engage and disengage to prevent EPS XBW fault
alxs1234 Mar 31, 2026
a11fedd
SRT: lkas_control_bit_cmd soft ramp disengage, SRT speed hysteresis
alxs1234 Apr 1, 2026
c5bdb64
SRT: add AUTO_HIGH_BEAM_ON and LKAS_DISABLED to DAS_6 HUD message
alxs1234 Apr 1, 2026
c5bf5b1
SRT: add chryslerSrt dedicated safety mode with rate_up/down=6, max_t…
alxs1234 Apr 1, 2026
9e53db7
SRT: add safety tests for chryslerSrt mode
alxs1234 Apr 1, 2026
5ab3b6b
SRT: use CHRYSLER_PARAM_SRT flag in chrysler safety mode instead of s…
alxs1234 Apr 1, 2026
66ddcac
Remove Chrysler SRT hooks from safety.h
alxs1234 Apr 1, 2026
896745c
SRT: skip cross-mode TX test for shared Pacifica addresses
alxs1234 Apr 1, 2026
83f3b7d
Chrysler: skip cross-mode TX test for shared SRT addresses
alxs1234 Apr 1, 2026
0eda12a
SRT: update LKAS_HEARTBIT with full SP signal definition
alxs1234 Apr 2, 2026
e0e691f
SRT: add LKAS_HEARTBIT forwarding from cam bus to bus 0
alxs1234 Apr 2, 2026
b4b187d
SRT: fix LKAS_HEARTBIT KeyError, point to chrysler_srt_generated DBC,…
alxs1234 Apr 2, 2026
0fa5f45
SRT: add LKAS_HEARTBIT to Chrysler TX whitelist
alxs1234 Apr 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions opendbc/car/car.capnp
Original file line number Diff line number Diff line change
Expand Up @@ -635,6 +635,7 @@ struct CarParams {
fcaGiorgio @32;
rivian @33;
volkswagenMeb @34;
chryslerSrt @35;
}

enum SteerControlType {
Expand Down
35 changes: 30 additions & 5 deletions opendbc/car/chrysler/carcontroller.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@
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 CUSW_CARS, RAM_CARS, CarControllerParams, ChryslerFlags
from opendbc.car.chrysler.values import CUSW_CARS, RAM_CARS, SRT_CARS, CarControllerParams, ChryslerFlags
from opendbc.car.interfaces import CarControllerBase


class CarController(CarControllerBase):
def __init__(self, dbc_names, CP):
super().__init__(dbc_names, CP)
self.apply_torque_last = 0
self.lkas_active_prev = False

self.hud_count = 0
self.last_lkas_falling_edge = 0
Expand Down Expand Up @@ -45,6 +46,12 @@ def update(self, CC, CS, now_nanos):
self.hud_count, CS.lkas_car_model, CS.auto_high_beam))
self.hud_count += 1

# LKAS heartbeat forwarding for SRT
if self.CP.carFingerprint in SRT_CARS and self.frame % 10 == 0:
heartbit_msg = chryslercan.create_lkas_heartbit(self.packer, self.CP, CS.lkas_heartbit)
if heartbit_msg is not None:
can_sends.append(heartbit_msg)

# steering
if self.frame % self.params.STEER_STEP == 0:

Expand All @@ -61,6 +68,9 @@ def update(self, CC, CS, now_nanos):
elif self.CP.carFingerprint in CUSW_CARS:
if CS.out.vEgo < (self.CP.minSteerSpeed - 2.0):
lkas_control_bit = False
elif self.CP.carFingerprint in SRT_CARS: # may merge with other class if it makes sense
if CS.out.vEgo < (self.CP.minSteerSpeed - 2.1):
lkas_control_bit = False

# EPS faults if LKAS re-enables too quickly
lkas_control_bit = lkas_control_bit and (self.frame - self.last_lkas_falling_edge > 200)
Expand All @@ -72,12 +82,27 @@ def update(self, CC, CS, now_nanos):
# steer torque
new_torque = int(round(CC.actuators.torque * self.params.STEER_MAX))
apply_torque = apply_meas_steer_torque_limits(new_torque, self.apply_torque_last, CS.out.steeringTorqueEps, self.params)
if not lkas_active or not lkas_control_bit:
apply_torque = 0
lkas_control_bit_cmd = lkas_control_bit
if self.CP.carFingerprint in SRT_CARS:
if not lkas_active or not lkas_control_bit:
if self.apply_torque_last != 0:
if self.apply_torque_last > 0:
apply_torque = max(self.apply_torque_last - self.params.STEER_DELTA_DOWN, 0)
else:
apply_torque = min(self.apply_torque_last + self.params.STEER_DELTA_DOWN, 0)
if apply_torque != 0:
lkas_control_bit_cmd = True
else:
apply_torque = 0
elif not self.lkas_active_prev:
apply_torque = apply_meas_steer_torque_limits(apply_torque, 0, CS.out.steeringTorqueEps, self.params)
else:
if not lkas_active or not lkas_control_bit:
apply_torque = 0
self.lkas_active_prev = lkas_active
self.apply_torque_last = apply_torque

can_sends.append(chryslercan.create_lkas_command(self.packer, self.CP, int(apply_torque), lkas_control_bit))

can_sends.append(chryslercan.create_lkas_command(self.packer, self.CP, int(apply_torque), lkas_control_bit_cmd))
self.frame += 1

new_actuators = CC.actuators.as_builder()
Expand Down
6 changes: 5 additions & 1 deletion opendbc/car/chrysler/carstate.py
Original file line number Diff line number Diff line change
@@ -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 CUSW_CARS, DBC, STEER_THRESHOLD, RAM_CARS
from opendbc.car.chrysler.values import CUSW_CARS, DBC, STEER_THRESHOLD, RAM_CARS, SRT_CARS
from opendbc.car.common.conversions import Conversions as CV
from opendbc.car.interfaces import CarStateBase

Expand All @@ -23,6 +23,7 @@ def __init__(self, CP):
self.shifter_values = can_define.dv["GEAR"]["PRNDL"]

self.distance_button = 0
self.lkas_heartbit = {}

def update(self, can_parsers) -> structs.CarState:
cp = can_parsers[Bus.pt]
Expand Down Expand Up @@ -98,6 +99,9 @@ def update(self, can_parsers) -> structs.CarState:
self.lkas_car_model = cp_cam.vl["DAS_6"]["CAR_MODEL"]
self.button_counter = cp.vl["CRUISE_BUTTONS"]["COUNTER"]

if self.CP.carFingerprint in SRT_CARS:
self.lkas_heartbit = cp_cam.vl["LKAS_HEARTBIT"]

ret.buttonEvents = create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise})

return ret
Expand Down
17 changes: 15 additions & 2 deletions opendbc/car/chrysler/chryslercan.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from opendbc.car import structs
from opendbc.car.crc import CRC8J1850
from opendbc.car.chrysler.values import CUSW_CARS, RAM_CARS
from opendbc.car.chrysler.values import CUSW_CARS, RAM_CARS, SRT_CARS

GearShifter = structs.CarState.GearShifter
VisualAlert = structs.CarControl.HUDControl.VisualAlert
Expand Down Expand Up @@ -50,9 +50,23 @@ def create_lkas_hud(packer, CP, lkas_active, hud_alert, hud_count, car_model, au

if CP.carFingerprint in RAM_CARS:
values['AUTO_HIGH_BEAM_ON'] = auto_high_beam
if CP.carFingerprint in SRT_CARS:
values['AUTO_HIGH_BEAM_ON'] = auto_high_beam
values['LKAS_DISABLED'] = 0 if lkas_active else 1

return packer.make_can_msg("DAS_6", 0, values)

def create_lkas_heartbit(packer, CP, lkas_heartbit):
if not lkas_heartbit or "LKAS_DISABLED" not in lkas_heartbit:
return None
values = {s: lkas_heartbit[s] for s in [
"LKAS_DISABLED",
"AUTO_HIGH_BEAM",
"FORWARD_1",
"FORWARD_2",
"FORWARD_3",
]}
return packer.make_can_msg("LKAS_HEARTBIT", 0, values)

def create_lkas_command(packer, CP, apply_torque, lkas_control_bit):
# LKAS_COMMAND Lane-keeping signal to turn the wheel
Expand All @@ -63,7 +77,6 @@ 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):
values = {
"ACC_Cancel": cancel,
Expand Down
23 changes: 23 additions & 0 deletions opendbc/car/chrysler/fingerprints.py
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,29 @@
b'68503664AC',
],
},
CAR.JEEP_GRAND_CHEROKEE_SRT_2016: {
(Ecu.combinationMeter, 0x742, None): [
b'68243353AG',
],
(Ecu.srs, 0x744, None): [
b'68309533AA',
],
(Ecu.abs, 0x747, None): [
b'68252642AF',
],
(Ecu.fwdRadar, 0x753, None): [
b'68251506AF',
],
(Ecu.eps, 0x75a, None): [
b'68252416AL',
],
(Ecu.engine, 0x7e0, None): [
b'68277171AG ',
],
(Ecu.transmission, 0x7e1, None): [
b'05035476AE',
],
},
CAR.RAM_1500_5TH_GEN: {
(Ecu.combinationMeter, 0x742, None): [
b'68294051AG',
Expand Down
6 changes: 4 additions & 2 deletions opendbc/car/chrysler/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from opendbc.car.chrysler.carcontroller import CarController
from opendbc.car.chrysler.carstate import CarState
from opendbc.car.chrysler.radar_interface import RadarInterface
from opendbc.car.chrysler.values import CAR, CUSW_CARS, RAM_HD, RAM_DT, RAM_CARS, ChryslerFlags, ChryslerSafetyFlags
from opendbc.car.chrysler.values import CAR, CUSW_CARS, RAM_HD, RAM_DT, RAM_CARS, SRT_CARS, ChryslerFlags, ChryslerSafetyFlags
from opendbc.car.interfaces import CarInterfaceBase


Expand Down Expand Up @@ -34,6 +34,8 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_lo
ret.safetyConfigs[0].safetyParam |= ChryslerSafetyFlags.RAM_DT.value
elif candidate in CUSW_CARS:
ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.chryslerCusw)]
elif candidate in SRT_CARS:
ret.safetyConfigs[0].safetyParam |= ChryslerSafetyFlags.SRT.value

CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
if candidate not in RAM_CARS:
Expand All @@ -55,7 +57,7 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_lo
elif candidate == CAR.JEEP_CHEROKEE_5TH_GEN:
ret.steerActuatorDelay = 0.15

elif candidate in (CAR.JEEP_GRAND_CHEROKEE, CAR.JEEP_GRAND_CHEROKEE_2019):
elif candidate in (CAR.JEEP_GRAND_CHEROKEE, CAR.JEEP_GRAND_CHEROKEE_2019, CAR.JEEP_GRAND_CHEROKEE_SRT_2016):
ret.steerActuatorDelay = 0.2

ret.lateralTuning.init('pid')
Expand Down
12 changes: 12 additions & 0 deletions opendbc/car/chrysler/values.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
class ChryslerSafetyFlags(IntFlag):
RAM_DT = 1
RAM_HD = 2
SRT = 4


class ChryslerFlags(IntFlag):
Expand Down Expand Up @@ -82,6 +83,12 @@ class CAR(Platforms):
JEEP_GRAND_CHEROKEE.specs,
)

JEEP_GRAND_CHEROKEE_SRT_2016 = ChryslerPlatformConfig( # SRT Trim Specs
[ChryslerCarDocs("Jeep Grand Cherokee SRT 2016-18")],
ChryslerCarSpecs(mass=1836.0, wheelbase=2.70, steerRatio=13.0),
{Bus.pt: 'chrysler_srt_generated'},
)

# Ram
RAM_1500_5TH_GEN = ChryslerPlatformConfig(
[ChryslerCarDocs("Ram 1500 2019-24", car_parts=CarParts.common([CarHarness.ram]))],
Expand Down Expand Up @@ -115,6 +122,10 @@ def __init__(self, CP):
self.STEER_DELTA_UP = 4
self.STEER_DELTA_DOWN = 4
self.STEER_MAX = 250 # TODO: Some CUSW will go to 261, some not quite, exact boundaries not yet determined
elif CP.carFingerprint in SRT_CARS:
self.STEER_DELTA_UP = 6
self.STEER_DELTA_DOWN = 6
self.STEER_MAX = 261
else:
self.STEER_DELTA_UP = 3
self.STEER_DELTA_DOWN = 3
Expand All @@ -127,6 +138,7 @@ def __init__(self, CP):
RAM_HD = {CAR.RAM_HD_5TH_GEN, }
RAM_CARS = RAM_DT | RAM_HD
CUSW_CARS = {CAR.JEEP_CHEROKEE_5TH_GEN, }
SRT_CARS = {CAR.JEEP_GRAND_CHEROKEE_SRT_2016, }


CHRYSLER_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
Expand Down
1 change: 1 addition & 0 deletions opendbc/car/tests/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class CarTestRoute(NamedTuple):
CarTestRoute("c5e3aa51055c8f47|2023-12-06--20-01-44", CHRYSLER.JEEP_CHEROKEE_5TH_GEN),
CarTestRoute("0c94aa1e1296d7c6/2021-05-05--19-48-37", CHRYSLER.JEEP_GRAND_CHEROKEE),
CarTestRoute("91dfedae61d7bd75/2021-05-22--20-07-52", CHRYSLER.JEEP_GRAND_CHEROKEE_2019),
CarTestRoute("0d229e810a3e34c5/0000000d--f284666791", CHRYSLER.JEEP_GRAND_CHEROKEE_SRT_2016),
CarTestRoute("420a8e183f1aed48/2020-03-05--07-15-29", CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID), # 2017
CarTestRoute("43a685a66291579b/2021-05-27--19-47-29", CHRYSLER.CHRYSLER_PACIFICA_2018),
CarTestRoute("378472f830ee7395/2021-05-28--07-38-43", CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID),
Expand Down
3 changes: 2 additions & 1 deletion opendbc/car/torque_data/params.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,9 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
"HYUNDAI_SONATA" = [2.9638737459977467, 2.1259108157250735, 0.07813665616927593]
"HYUNDAI_SONATA_HYBRID" = [2.8990264092395734, 2.061410192222139, 0.0899805488717382]
"HYUNDAI_TUCSON_4TH_GEN" = [2.960174, 2.860284, 0.108745]
"JEEP_GRAND_CHEROKEE_2019" = [2.30972, 1.289689569171081, 0.117048]
"JEEP_GRAND_CHEROKEE" = [2.27116, 1.4057367824262523, 0.11725947414922003]
"JEEP_GRAND_CHEROKEE_2019" = [2.30972, 1.289689569171081, 0.117048]
"JEEP_GRAND_CHEROKEE_SRT_2016" = [2.27116, 1.4057367824262523, 0.11725947414922003]
"KIA_EV6" = [3.2, 2.093457, 0.005]
"KIA_K5_2021" = [2.405339728085138, 1.460032270828705, 0.11650989850813716]
"KIA_NIRO_EV" = [2.9215954981365337, 2.1500583840260044, 0.09236802474810267]
Expand Down
Loading
Loading