diff --git a/opendbc_repo/opendbc/safety/modes/chrysler.h b/opendbc_repo/opendbc/safety/modes/chrysler.h index b22ac706c7..f091cdb1f6 100644 --- a/opendbc_repo/opendbc/safety/modes/chrysler.h +++ b/opendbc_repo/opendbc/safety/modes/chrysler.h @@ -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 = ¤t_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; diff --git a/opendbc_repo/opendbc/safety/modes/chrysler_platform.h b/opendbc_repo/opendbc/safety/modes/chrysler_platform.h new file mode 100644 index 0000000000..98a1ae2359 --- /dev/null +++ b/opendbc_repo/opendbc/safety/modes/chrysler_platform.h @@ -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))) diff --git a/opendbc_repo/opendbc/safety/tests/test_chrysler_aol.py b/opendbc_repo/opendbc/safety/tests/test_chrysler_aol.py index 1191f71171..78b7cb0b2f 100644 --- a/opendbc_repo/opendbc/safety/tests/test_chrysler_aol.py +++ b/opendbc_repo/opendbc/safety/tests/test_chrysler_aol.py @@ -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())