| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "safety_declarations.h" | ||
| 4 | |||
| 5 | typedef struct { | ||
| 6 | const int EPS_2; | ||
| 7 | const int ESP_1; | ||
| 8 | const int ESP_8; | ||
| 9 | const int ECM_5; | ||
| 10 | const int DAS_3; | ||
| 11 | const int DAS_6; | ||
| 12 | const int LKAS_COMMAND; | ||
| 13 | const int CRUISE_BUTTONS; | ||
| 14 | } ChryslerAddrs; | ||
| 15 | |||
| 16 | typedef enum { | ||
| 17 | CHRYSLER_RAM_DT, | ||
| 18 | CHRYSLER_RAM_HD, | ||
| 19 | CHRYSLER_PACIFICA, // plus Jeep | ||
| 20 | } ChryslerPlatform; | ||
| 21 | static ChryslerPlatform chrysler_platform; | ||
| 22 | static const ChryslerAddrs *chrysler_addrs; | ||
| 23 | |||
| 24 | 157 | static uint32_t chrysler_get_checksum(const CANPacket_t *to_push) { | |
| 25 | 157 | int checksum_byte = GET_LEN(to_push) - 1U; | |
| 26 | 157 | return (uint8_t)(GET_BYTE(to_push, checksum_byte)); | |
| 27 | } | ||
| 28 | |||
| 29 | 157 | static uint32_t chrysler_compute_checksum(const CANPacket_t *to_push) { | |
| 30 | // TODO: clean this up | ||
| 31 | // http://illmatics.com/Remote%20Car%20Hacking.pdf | ||
| 32 | 157 | uint8_t checksum = 0xFFU; | |
| 33 | 157 | int len = GET_LEN(to_push); | |
| 34 |
2/2✓ Branch 0 taken 1099 times.
✓ Branch 1 taken 157 times.
|
1256 | for (int j = 0; j < (len - 1); j++) { |
| 35 | 1099 | uint8_t shift = 0x80U; | |
| 36 | 1099 | uint8_t curr = (uint8_t)GET_BYTE(to_push, j); | |
| 37 |
2/2✓ Branch 0 taken 8792 times.
✓ Branch 1 taken 1099 times.
|
9891 | for (int i=0; i<8; i++) { |
| 38 | 8792 | uint8_t bit_sum = curr & shift; | |
| 39 | 8792 | uint8_t temp_chk = checksum & 0x80U; | |
| 40 |
2/2✓ Branch 0 taken 355 times.
✓ Branch 1 taken 8437 times.
|
8792 | if (bit_sum != 0U) { |
| 41 | 355 | bit_sum = 0x1C; | |
| 42 |
2/2✓ Branch 0 taken 126 times.
✓ Branch 1 taken 229 times.
|
355 | if (temp_chk != 0U) { |
| 43 | 126 | bit_sum = 1; | |
| 44 | } | ||
| 45 | 355 | checksum = checksum << 1; | |
| 46 | 355 | temp_chk = checksum | 1U; | |
| 47 | 355 | bit_sum ^= temp_chk; | |
| 48 | } else { | ||
| 49 |
2/2✓ Branch 0 taken 4261 times.
✓ Branch 1 taken 4176 times.
|
8437 | if (temp_chk != 0U) { |
| 50 | 4261 | bit_sum = 0x1D; | |
| 51 | } | ||
| 52 | 8437 | checksum = checksum << 1; | |
| 53 | 8437 | bit_sum ^= checksum; | |
| 54 | } | ||
| 55 | 8792 | checksum = bit_sum; | |
| 56 | 8792 | shift = shift >> 1; | |
| 57 | } | ||
| 58 | } | ||
| 59 | 157 | return (uint8_t)(~checksum); | |
| 60 | } | ||
| 61 | |||
| 62 | 157 | static uint8_t chrysler_get_counter(const CANPacket_t *to_push) { | |
| 63 | 157 | return (uint8_t)(GET_BYTE(to_push, 6) >> 4); | |
| 64 | } | ||
| 65 | |||
| 66 | 25480 | static void chrysler_rx_hook(const CANPacket_t *to_push) { | |
| 67 | 25480 | const int bus = GET_BUS(to_push); | |
| 68 | 25480 | const int addr = GET_ADDR(to_push); | |
| 69 | |||
| 70 | // Measured EPS torque | ||
| 71 |
4/4✓ Branch 0 taken 8572 times.
✓ Branch 1 taken 16908 times.
✓ Branch 2 taken 42 times.
✓ Branch 3 taken 8530 times.
|
25480 | if ((bus == 0) && (addr == chrysler_addrs->EPS_2)) { |
| 72 | 42 | int torque_meas_new = ((GET_BYTE(to_push, 4) & 0x7U) << 8) + GET_BYTE(to_push, 5) - 1024U; | |
| 73 | 42 | update_sample(&torque_meas, torque_meas_new); | |
| 74 | } | ||
| 75 | |||
| 76 | // enter controls on rising edge of ACC, exit controls on ACC off | ||
| 77 |
2/2✓ Branch 0 taken 8494 times.
✓ Branch 1 taken 16986 times.
|
25480 | const int das_3_bus = (chrysler_platform == CHRYSLER_PACIFICA) ? 0 : 2; |
| 78 |
4/4✓ Branch 0 taken 8506 times.
✓ Branch 1 taken 16974 times.
✓ Branch 2 taken 21 times.
✓ Branch 3 taken 8485 times.
|
25480 | if ((bus == das_3_bus) && (addr == chrysler_addrs->DAS_3)) { |
| 79 | 21 | bool cruise_engaged = GET_BIT(to_push, 21U); | |
| 80 | 21 | pcm_cruise_check(cruise_engaged); | |
| 81 | } | ||
| 82 | |||
| 83 | // TODO: use the same message for both | ||
| 84 | // update vehicle moving | ||
| 85 |
6/6✓ Branch 0 taken 16986 times.
✓ Branch 1 taken 8494 times.
✓ Branch 2 taken 5710 times.
✓ Branch 3 taken 11276 times.
✓ Branch 4 taken 14 times.
✓ Branch 5 taken 5696 times.
|
25480 | if ((chrysler_platform != CHRYSLER_PACIFICA) && (bus == 0) && (addr == chrysler_addrs->ESP_8)) { |
| 86 | 14 | vehicle_moving = ((GET_BYTE(to_push, 4) << 8) + GET_BYTE(to_push, 5)) != 0U; | |
| 87 | } | ||
| 88 |
6/6✓ Branch 0 taken 8494 times.
✓ Branch 1 taken 16986 times.
✓ Branch 2 taken 2862 times.
✓ Branch 3 taken 5632 times.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 2854 times.
|
25480 | if ((chrysler_platform == CHRYSLER_PACIFICA) && (bus == 0) && (addr == 514)) { |
| 89 | 8 | int speed_l = (GET_BYTE(to_push, 0) << 4) + (GET_BYTE(to_push, 1) >> 4); | |
| 90 | 8 | int speed_r = (GET_BYTE(to_push, 2) << 4) + (GET_BYTE(to_push, 3) >> 4); | |
| 91 |
3/4✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
|
8 | vehicle_moving = (speed_l != 0) || (speed_r != 0); |
| 92 | } | ||
| 93 | |||
| 94 | // exit controls on rising edge of gas press | ||
| 95 |
4/4✓ Branch 0 taken 8572 times.
✓ Branch 1 taken 16908 times.
✓ Branch 2 taken 30 times.
✓ Branch 3 taken 8542 times.
|
25480 | if ((bus == 0) && (addr == chrysler_addrs->ECM_5)) { |
| 96 | 30 | gas_pressed = GET_BYTE(to_push, 0U) != 0U; | |
| 97 | } | ||
| 98 | |||
| 99 | // exit controls on rising edge of brake press | ||
| 100 |
4/4✓ Branch 0 taken 8572 times.
✓ Branch 1 taken 16908 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 8536 times.
|
25480 | if ((bus == 0) && (addr == chrysler_addrs->ESP_1)) { |
| 101 | 36 | brake_pressed = ((GET_BYTE(to_push, 0U) & 0xFU) >> 2U) == 1U; | |
| 102 | } | ||
| 103 | |||
| 104 |
4/4✓ Branch 0 taken 8572 times.
✓ Branch 1 taken 16908 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 8569 times.
|
25480 | generic_rx_checks((bus == 0) && (addr == chrysler_addrs->LKAS_COMMAND)); |
| 105 | 25480 | } | |
| 106 | |||
| 107 | 10816 | static bool chrysler_tx_hook(const CANPacket_t *to_send) { | |
| 108 | const SteeringLimits CHRYSLER_STEERING_LIMITS = { | ||
| 109 | .max_steer = 261, | ||
| 110 | .max_rt_delta = 112, | ||
| 111 | .max_rt_interval = 250000, | ||
| 112 | .max_rate_up = 3, | ||
| 113 | .max_rate_down = 3, | ||
| 114 | .max_torque_error = 80, | ||
| 115 | .type = TorqueMotorLimited, | ||
| 116 | }; | ||
| 117 | |||
| 118 | const SteeringLimits CHRYSLER_RAM_DT_STEERING_LIMITS = { | ||
| 119 | .max_steer = 350, | ||
| 120 | .max_rt_delta = 112, | ||
| 121 | .max_rt_interval = 250000, | ||
| 122 | .max_rate_up = 6, | ||
| 123 | .max_rate_down = 6, | ||
| 124 | .max_torque_error = 80, | ||
| 125 | .type = TorqueMotorLimited, | ||
| 126 | }; | ||
| 127 | |||
| 128 | const SteeringLimits CHRYSLER_RAM_HD_STEERING_LIMITS = { | ||
| 129 | .max_steer = 361, | ||
| 130 | .max_rt_delta = 182, | ||
| 131 | .max_rt_interval = 250000, | ||
| 132 | .max_rate_up = 14, | ||
| 133 | .max_rate_down = 14, | ||
| 134 | .max_torque_error = 80, | ||
| 135 | .type = TorqueMotorLimited, | ||
| 136 | }; | ||
| 137 | |||
| 138 | 10816 | bool tx = true; | |
| 139 | 10816 | int addr = GET_ADDR(to_send); | |
| 140 | |||
| 141 | // STEERING | ||
| 142 |
2/2✓ Branch 0 taken 10789 times.
✓ Branch 1 taken 27 times.
|
10816 | if (addr == chrysler_addrs->LKAS_COMMAND) { |
| 143 | 10789 | int start_byte = (chrysler_platform == CHRYSLER_PACIFICA) ? 0 : 1; | |
| 144 | 10789 | int desired_torque = ((GET_BYTE(to_send, start_byte) & 0x7U) << 8) | GET_BYTE(to_send, start_byte + 1); | |
| 145 | 10789 | desired_torque -= 1024; | |
| 146 | |||
| 147 |
2/2✓ Branch 0 taken 6974 times.
✓ Branch 1 taken 3815 times.
|
17763 | const SteeringLimits limits = (chrysler_platform == CHRYSLER_PACIFICA) ? CHRYSLER_STEERING_LIMITS : |
| 148 |
2/2✓ Branch 0 taken 3570 times.
✓ Branch 1 taken 3404 times.
|
6974 | (chrysler_platform == CHRYSLER_RAM_DT) ? CHRYSLER_RAM_DT_STEERING_LIMITS : CHRYSLER_RAM_HD_STEERING_LIMITS; |
| 149 | |||
| 150 |
2/2✓ Branch 0 taken 3815 times.
✓ Branch 1 taken 6974 times.
|
10789 | bool steer_req = (chrysler_platform == CHRYSLER_PACIFICA) ? GET_BIT(to_send, 4U) : (GET_BYTE(to_send, 3) & 0x7U) == 2U; |
| 151 |
2/2✓ Branch 1 taken 6562 times.
✓ Branch 2 taken 4227 times.
|
10789 | if (steer_torque_cmd_checks(desired_torque, steer_req, limits)) { |
| 152 | 6562 | tx = false; | |
| 153 | } | ||
| 154 | } | ||
| 155 | |||
| 156 | // FORCE CANCEL: only the cancel button press is allowed | ||
| 157 |
2/2✓ Branch 0 taken 24 times.
✓ Branch 1 taken 10792 times.
|
10816 | if (addr == chrysler_addrs->CRUISE_BUTTONS) { |
| 158 | 24 | const bool is_cancel = GET_BYTE(to_send, 0) == 1U; | |
| 159 | 24 | const bool is_resume = GET_BYTE(to_send, 0) == 0x10U; | |
| 160 |
6/6✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 3 times.
✓ Branch 5 taken 3 times.
|
24 | const bool allowed = is_cancel || (is_resume && controls_allowed); |
| 161 |
2/2✓ Branch 0 taken 15 times.
✓ Branch 1 taken 9 times.
|
24 | if (!allowed) { |
| 162 | 15 | tx = false; | |
| 163 | } | ||
| 164 | } | ||
| 165 | |||
| 166 | 10816 | return tx; | |
| 167 | } | ||
| 168 | |||
| 169 | 25344 | static int chrysler_fwd_hook(int bus_num, int addr) { | |
| 170 | 25344 | int bus_fwd = -1; | |
| 171 | |||
| 172 | // forward to camera | ||
| 173 |
2/2✓ Branch 0 taken 8448 times.
✓ Branch 1 taken 16896 times.
|
25344 | if (bus_num == 0) { |
| 174 | 8448 | bus_fwd = 2; | |
| 175 | } | ||
| 176 | |||
| 177 | // forward all messages from camera except LKAS messages | ||
| 178 |
4/4✓ Branch 0 taken 25335 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 25326 times.
|
25344 | const bool is_lkas = ((addr == chrysler_addrs->LKAS_COMMAND) || (addr == chrysler_addrs->DAS_6)); |
| 179 |
4/4✓ Branch 0 taken 8448 times.
✓ Branch 1 taken 16896 times.
✓ Branch 2 taken 8442 times.
✓ Branch 3 taken 6 times.
|
25344 | if ((bus_num == 2) && !is_lkas){ |
| 180 | 8442 | bus_fwd = 0; | |
| 181 | } | ||
| 182 | |||
| 183 | 25344 | return bus_fwd; | |
| 184 | } | ||
| 185 | |||
| 186 | 99 | static safety_config chrysler_init(uint16_t param) { | |
| 187 | |||
| 188 | 99 | const uint32_t CHRYSLER_PARAM_RAM_DT = 1U; // set for Ram DT platform | |
| 189 | |||
| 190 | // CAN messages for Chrysler/Jeep platforms | ||
| 191 | static const ChryslerAddrs CHRYSLER_ADDRS = { | ||
| 192 | .EPS_2 = 0x220, // EPS driver input torque | ||
| 193 | .ESP_1 = 0x140, // Brake pedal and vehicle speed | ||
| 194 | .ESP_8 = 0x11C, // Brake pedal and vehicle speed | ||
| 195 | .ECM_5 = 0x22F, // Throttle position sensor | ||
| 196 | .DAS_3 = 0x1F4, // ACC engagement states from DASM | ||
| 197 | .DAS_6 = 0x2A6, // LKAS HUD and auto headlight control from DASM | ||
| 198 | .LKAS_COMMAND = 0x292, // LKAS controls from DASM | ||
| 199 | .CRUISE_BUTTONS = 0x23B, // Cruise control buttons | ||
| 200 | }; | ||
| 201 | |||
| 202 | // CAN messages for the 5th gen RAM DT platform | ||
| 203 | static const ChryslerAddrs CHRYSLER_RAM_DT_ADDRS = { | ||
| 204 | .EPS_2 = 0x31, // EPS driver input torque | ||
| 205 | .ESP_1 = 0x83, // Brake pedal and vehicle speed | ||
| 206 | .ESP_8 = 0x79, // Brake pedal and vehicle speed | ||
| 207 | .ECM_5 = 0x9D, // Throttle position sensor | ||
| 208 | .DAS_3 = 0x99, // ACC engagement states from DASM | ||
| 209 | .DAS_6 = 0xFA, // LKAS HUD and auto headlight control from DASM | ||
| 210 | .LKAS_COMMAND = 0xA6, // LKAS controls from DASM | ||
| 211 | .CRUISE_BUTTONS = 0xB1, // Cruise control buttons | ||
| 212 | }; | ||
| 213 | |||
| 214 | static RxCheck chrysler_ram_dt_rx_checks[] = { | ||
| 215 | {.msg = {{CHRYSLER_RAM_DT_ADDRS.EPS_2, 0, 8, .check_checksum = true, .max_counter = 15U, .frequency = 100U}, { 0 }, { 0 }}}, | ||
| 216 | {.msg = {{CHRYSLER_RAM_DT_ADDRS.ESP_1, 0, 8, .check_checksum = true, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, | ||
| 217 | {.msg = {{CHRYSLER_RAM_DT_ADDRS.ESP_8, 0, 8, .check_checksum = true, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, | ||
| 218 | {.msg = {{CHRYSLER_RAM_DT_ADDRS.ECM_5, 0, 8, .check_checksum = true, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, | ||
| 219 | {.msg = {{CHRYSLER_RAM_DT_ADDRS.DAS_3, 2, 8, .check_checksum = true, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, | ||
| 220 | }; | ||
| 221 | |||
| 222 | static RxCheck chrysler_rx_checks[] = { | ||
| 223 | {.msg = {{CHRYSLER_ADDRS.EPS_2, 0, 8, .check_checksum = true, .max_counter = 15U, .frequency = 100U}, { 0 }, { 0 }}}, | ||
| 224 | {.msg = {{CHRYSLER_ADDRS.ESP_1, 0, 8, .check_checksum = true, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, | ||
| 225 | //{.msg = {{ESP_8, 0, 8, .check_checksum = true, .max_counter = 15U, .frequency = 50U}}}, | ||
| 226 | {.msg = {{514, 0, 8, .check_checksum = false, .max_counter = 0U, .frequency = 100U}, { 0 }, { 0 }}}, | ||
| 227 | {.msg = {{CHRYSLER_ADDRS.ECM_5, 0, 8, .check_checksum = true, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, | ||
| 228 | {.msg = {{CHRYSLER_ADDRS.DAS_3, 0, 8, .check_checksum = true, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, | ||
| 229 | }; | ||
| 230 | |||
| 231 | static const CanMsg CHRYSLER_TX_MSGS[] = { | ||
| 232 | {CHRYSLER_ADDRS.CRUISE_BUTTONS, 0, 3}, | ||
| 233 | {CHRYSLER_ADDRS.LKAS_COMMAND, 0, 6}, | ||
| 234 | {CHRYSLER_ADDRS.DAS_6, 0, 8}, | ||
| 235 | }; | ||
| 236 | |||
| 237 | static const CanMsg CHRYSLER_RAM_DT_TX_MSGS[] = { | ||
| 238 | {CHRYSLER_RAM_DT_ADDRS.CRUISE_BUTTONS, 2, 3}, | ||
| 239 | {CHRYSLER_RAM_DT_ADDRS.LKAS_COMMAND, 0, 8}, | ||
| 240 | {CHRYSLER_RAM_DT_ADDRS.DAS_6, 0, 8}, | ||
| 241 | }; | ||
| 242 | |||
| 243 | #ifdef ALLOW_DEBUG | ||
| 244 | // CAN messages for the 5th gen RAM HD platform | ||
| 245 | static const ChryslerAddrs CHRYSLER_RAM_HD_ADDRS = { | ||
| 246 | .EPS_2 = 0x220, // EPS driver input torque | ||
| 247 | .ESP_1 = 0x140, // Brake pedal and vehicle speed | ||
| 248 | .ESP_8 = 0x11C, // Brake pedal and vehicle speed | ||
| 249 | .ECM_5 = 0x22F, // Throttle position sensor | ||
| 250 | .DAS_3 = 0x1F4, // ACC engagement states from DASM | ||
| 251 | .DAS_6 = 0x275, // LKAS HUD and auto headlight control from DASM | ||
| 252 | .LKAS_COMMAND = 0x276, // LKAS controls from DASM | ||
| 253 | .CRUISE_BUTTONS = 0x23A, // Cruise control buttons | ||
| 254 | }; | ||
| 255 | |||
| 256 | static RxCheck chrysler_ram_hd_rx_checks[] = { | ||
| 257 | {.msg = {{CHRYSLER_RAM_HD_ADDRS.EPS_2, 0, 8, .check_checksum = true, .max_counter = 15U, .frequency = 100U}, { 0 }, { 0 }}}, | ||
| 258 | {.msg = {{CHRYSLER_RAM_HD_ADDRS.ESP_1, 0, 8, .check_checksum = true, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, | ||
| 259 | {.msg = {{CHRYSLER_RAM_HD_ADDRS.ESP_8, 0, 8, .check_checksum = true, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, | ||
| 260 | {.msg = {{CHRYSLER_RAM_HD_ADDRS.ECM_5, 0, 8, .check_checksum = true, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, | ||
| 261 | {.msg = {{CHRYSLER_RAM_HD_ADDRS.DAS_3, 2, 8, .check_checksum = true, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}}, | ||
| 262 | }; | ||
| 263 | |||
| 264 | static const CanMsg CHRYSLER_RAM_HD_TX_MSGS[] = { | ||
| 265 | {CHRYSLER_RAM_HD_ADDRS.CRUISE_BUTTONS, 2, 3}, | ||
| 266 | {CHRYSLER_RAM_HD_ADDRS.LKAS_COMMAND, 0, 8}, | ||
| 267 | {CHRYSLER_RAM_HD_ADDRS.DAS_6, 0, 8}, | ||
| 268 | }; | ||
| 269 | |||
| 270 | 99 | const uint32_t CHRYSLER_PARAM_RAM_HD = 2U; // set for Ram HD platform | |
| 271 | 99 | bool enable_ram_hd = GET_FLAG(param, CHRYSLER_PARAM_RAM_HD); | |
| 272 | #endif | ||
| 273 | |||
| 274 | safety_config ret; | ||
| 275 | |||
| 276 | 99 | bool enable_ram_dt = GET_FLAG(param, CHRYSLER_PARAM_RAM_DT); | |
| 277 | |||
| 278 |
2/2✓ Branch 0 taken 33 times.
✓ Branch 1 taken 66 times.
|
99 | if (enable_ram_dt) { |
| 279 | 33 | chrysler_platform = CHRYSLER_RAM_DT; | |
| 280 | 33 | chrysler_addrs = &CHRYSLER_RAM_DT_ADDRS; | |
| 281 | 33 | ret = BUILD_SAFETY_CFG(chrysler_ram_dt_rx_checks, CHRYSLER_RAM_DT_TX_MSGS); | |
| 282 | #ifdef ALLOW_DEBUG | ||
| 283 |
2/2✓ Branch 0 taken 33 times.
✓ Branch 1 taken 33 times.
|
66 | } else if (enable_ram_hd) { |
| 284 | 33 | chrysler_platform = CHRYSLER_RAM_HD; | |
| 285 | 33 | chrysler_addrs = &CHRYSLER_RAM_HD_ADDRS; | |
| 286 | 33 | ret = BUILD_SAFETY_CFG(chrysler_ram_hd_rx_checks, CHRYSLER_RAM_HD_TX_MSGS); | |
| 287 | #endif | ||
| 288 | } else { | ||
| 289 | 33 | chrysler_platform = CHRYSLER_PACIFICA; | |
| 290 | 33 | chrysler_addrs = &CHRYSLER_ADDRS; | |
| 291 | 33 | ret = BUILD_SAFETY_CFG(chrysler_rx_checks, CHRYSLER_TX_MSGS); | |
| 292 | } | ||
| 293 | 99 | return ret; | |
| 294 | } | ||
| 295 | |||
| 296 | const safety_hooks chrysler_hooks = { | ||
| 297 | .init = chrysler_init, | ||
| 298 | .rx = chrysler_rx_hook, | ||
| 299 | .tx = chrysler_tx_hook, | ||
| 300 | .fwd = chrysler_fwd_hook, | ||
| 301 | .get_counter = chrysler_get_counter, | ||
| 302 | .get_checksum = chrysler_get_checksum, | ||
| 303 | .compute_checksum = chrysler_compute_checksum, | ||
| 304 | }; | ||
| 305 |