Qualify Chrysler native guards without changing safety limits

This commit is contained in:
firestar5683
2026-10-22 23:04:49 -05:00
parent 482e3cd7f2
commit edb618e910
3 changed files with 77 additions and 44 deletions
+5 -44
View File
@@ -2,43 +2,9 @@
#include "opendbc/safety/declarations.h"
#include "opendbc/safety/modes/chrysler_common.h"
#include "opendbc/safety/modes/chrysler_platform.h"
#include "opendbc/safety/modes/chrysler_aol.h"
// Chrysler Pacifica/Jeep addresses
#define CHRYSLER_EPS_2 0x220 // EPS driver input torque
#define CHRYSLER_ESP_1 0x140 // Brake pedal and vehicle speed
#define CHRYSLER_ESP_8 0x11C // Brake pedal and vehicle speed
#define CHRYSLER_ECM_5 0x22F // Throttle position sensor
#define CHRYSLER_DAS_3 0x1F4 // ACC engagement states from DASM
#define CHRYSLER_DAS_6 0x2A6 // LKAS HUD and auto headlight control from DASM
#define CHRYSLER_LKAS_COMMAND 0x292 // LKAS controls from DASM
#define CHRYSLER_CRUISE_BUTTONS 0x23B // Cruise control buttons
// RAM DT addresses
#define CHRYSLER_RAM_DT_EPS_2 0x31
#define CHRYSLER_RAM_DT_ESP_1 0x83
#define CHRYSLER_RAM_DT_ESP_8 0x79
#define CHRYSLER_RAM_DT_ECM_5 0x9D
#define CHRYSLER_RAM_DT_DAS_3 0x99
#define CHRYSLER_RAM_DT_DAS_6 0xFA
#define CHRYSLER_RAM_DT_LKAS_COMMAND 0xA6
#define CHRYSLER_RAM_DT_CRUISE_BUTTONS 0xB1
// RAM HD addresses
#define CHRYSLER_RAM_HD_EPS_2 0x220
#define CHRYSLER_RAM_HD_ESP_1 0x140
#define CHRYSLER_RAM_HD_ESP_8 0x11C
#define CHRYSLER_RAM_HD_ECM_5 0x22F
#define CHRYSLER_RAM_HD_DAS_3 0x1F4
#define CHRYSLER_RAM_HD_DAS_6 0x275
#define CHRYSLER_RAM_HD_LKAS_COMMAND 0x276
#define CHRYSLER_RAM_HD_CRUISE_BUTTONS 0x23A
typedef enum {
CHRYSLER_RAM_DT,
CHRYSLER_RAM_HD,
CHRYSLER_PACIFICA, // plus Jeep
} ChryslerPlatform;
static ChryslerPlatform chrysler_platform;
static bool chrysler_jeep_hold;
static bool chrysler_hold_armed;
static bool chrysler_hold_cancelled;
@@ -56,8 +22,8 @@ static bool chrysler_hold_ready(void) {
for (int i = 0; i < current_safety_config.rx_checks_len; i++) {
const RxStatus *status = &current_safety_config.rx_checks[i].status;
healthy &= status->msg_seen && status->valid_checksum && status->valid_quality_flag &&
status->wrong_counters < MAX_WRONG_COUNTERS && !status->lagging &&
safety_get_ts_elapsed(now, status->last_timestamp) <= 1000000U;
(status->wrong_counters < MAX_WRONG_COUNTERS) && !status->lagging &&
(safety_get_ts_elapsed(now, status->last_timestamp) <= 1000000U);
}
return chrysler_jeep_hold && healthy && chrysler_hold_gear_seen && chrysler_hold_drive &&
safety_get_ts_elapsed(now, chrysler_hold_gear_timestamp) <= 100000U &&
@@ -65,15 +31,10 @@ static bool chrysler_hold_ready(void) {
((chrysler_hold_stock[5] & 0xC0U) == 0U);
}
#define CHRYSLER_ADDR(name) ((uint32_t)((chrysler_platform == CHRYSLER_RAM_DT) ? CHRYSLER_RAM_DT_##name : \
((chrysler_platform == CHRYSLER_RAM_HD) ? CHRYSLER_RAM_HD_##name : CHRYSLER_##name)))
static uint8_t chrysler_get_counter(const CANPacket_t *msg) {
return (uint8_t)(msg->data[6] >> 4);
}
#include "opendbc/safety/modes/chrysler_aol.h"
static void chrysler_rx_hook(const CANPacket_t *msg) {
chrysler_aol_rx(msg);
// Measured EPS torque
@@ -129,7 +90,7 @@ static void chrysler_hold_cancel_rx(const CANPacket_t *msg) {
// its known size and advancing counter without inventing a CRC contract.
const uint8_t counter = (uint8_t)(msg->data[3] >> 4);
const bool valid = (GET_LEN(msg) == 5U) &&
(!chrysler_hold_gear_initialized || counter == ((chrysler_hold_gear_counter + 1U) & 0xFU));
(!chrysler_hold_gear_initialized || (counter == ((chrysler_hold_gear_counter + 1U) & 0xFU)));
chrysler_hold_gear_initialized = true;
chrysler_hold_gear_counter = counter;
chrysler_hold_gear_seen = valid;
@@ -0,0 +1,43 @@
#pragma once
// Platform declarations shared by the stock and optional AOL owners.
// Chrysler Pacifica/Jeep addresses
#define CHRYSLER_EPS_2 0x220U // EPS driver input torque
#define CHRYSLER_ESP_1 0x140U // Brake pedal and vehicle speed
#define CHRYSLER_ESP_8 0x11CU // Brake pedal and vehicle speed
#define CHRYSLER_ECM_5 0x22FU // Throttle position sensor
#define CHRYSLER_DAS_3 0x1F4U // ACC engagement states from DASM
#define CHRYSLER_DAS_6 0x2A6U // LKAS HUD and auto headlight control from DASM
#define CHRYSLER_LKAS_COMMAND 0x292U // LKAS controls from DASM
#define CHRYSLER_CRUISE_BUTTONS 0x23BU // Cruise control buttons
// RAM DT addresses
#define CHRYSLER_RAM_DT_EPS_2 0x31U
#define CHRYSLER_RAM_DT_ESP_1 0x83U
#define CHRYSLER_RAM_DT_ESP_8 0x79U
#define CHRYSLER_RAM_DT_ECM_5 0x9DU
#define CHRYSLER_RAM_DT_DAS_3 0x99U
#define CHRYSLER_RAM_DT_DAS_6 0xFAU
#define CHRYSLER_RAM_DT_LKAS_COMMAND 0xA6U
#define CHRYSLER_RAM_DT_CRUISE_BUTTONS 0xB1U
// RAM HD addresses
#define CHRYSLER_RAM_HD_EPS_2 0x220U
#define CHRYSLER_RAM_HD_ESP_1 0x140U
#define CHRYSLER_RAM_HD_ESP_8 0x11CU
#define CHRYSLER_RAM_HD_ECM_5 0x22FU
#define CHRYSLER_RAM_HD_DAS_3 0x1F4U
#define CHRYSLER_RAM_HD_DAS_6 0x275U
#define CHRYSLER_RAM_HD_LKAS_COMMAND 0x276U
#define CHRYSLER_RAM_HD_CRUISE_BUTTONS 0x23AU
typedef enum {
CHRYSLER_RAM_DT,
CHRYSLER_RAM_HD,
CHRYSLER_PACIFICA, // plus Jeep
} ChryslerPlatform;
static ChryslerPlatform chrysler_platform;
#define CHRYSLER_ADDR(name) ((uint32_t)((chrysler_platform == CHRYSLER_RAM_DT) ? CHRYSLER_RAM_DT_##name : \
((chrysler_platform == CHRYSLER_RAM_HD) ? CHRYSLER_RAM_HD_##name : CHRYSLER_##name)))
@@ -223,3 +223,32 @@ class TestChryslerAolSafety(unittest.TestCase):
self.feed(26, active=False, brake=True)
self.assertEqual(self.native.aol_get_permission_mask(), 1)
self.assertFalse(self.native.get_controls_allowed())
def test_malformed_physical_buttons_require_fresh_engagement(self):
for candidate in CHRYSLER_AOL_CARS:
for fault in ('checksum', 'short', 'long'):
with self.subTest(candidate=candidate, fault=fault):
self.arm(candidate)
address, data, bus = self.packer.make_can_msg('CRUISE_BUTTONS', 0, {})
if fault == 'checksum':
invalid = bytearray(data)
invalid[-1] ^= 1
data = bytes(invalid)
elif fault == 'short':
data = data[:2]
else:
data += b'\x00'
self.native.safety_rx_hook(self.packet((address, data, bus)))
self.assertEqual(self.native.aol_get_permission_mask(), 0)
self.assertFalse(self.native.safety_tx_hook(self.packet(create_lkas_command(self.packer, self.cp, 3, True))))
# Fresh healthy source traffic alone cannot undo the physical inhibit.
self.feed(23)
self.native.aol_set_host_request(1)
self.assertEqual(self.native.aol_get_permission_mask(), 0)
self.assertFalse(self.native.get_controls_allowed())
self.feed(24, active=True)
self.native.aol_set_host_request(1)
self.assertEqual(self.native.aol_get_permission_mask(), 1)
self.feed(25, active=False, brake=True)
self.assertEqual(self.native.aol_get_permission_mask(), 1)
self.assertFalse(self.native.get_controls_allowed())