Skip to content

Commit b2ffaae

Browse files
authored
Chrysler: disengage on gas press (commaai#442)
* add gas cancellation for chrysler * added regr test too * also add bus checks to chrysler. SHould have been there already
1 parent 2ebbe36 commit b2ffaae

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
lines changed

board/safety/safety_chrysler.h

+22-3
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,23 @@ const uint32_t CHRYSLER_RT_INTERVAL = 250000; // 250ms between real time checks
44
const int CHRYSLER_MAX_RATE_UP = 3;
55
const int CHRYSLER_MAX_RATE_DOWN = 3;
66
const int CHRYSLER_MAX_TORQUE_ERROR = 80; // max torque cmd in excess of torque motor
7+
const int CHRYSLER_GAS_THRSLD = 30; // 7% more than 2m/s
78
const AddrBus CHRYSLER_TX_MSGS[] = {{571, 0}, {658, 0}, {678, 0}};
89

910
// TODO: do checksum and counter checks
1011
AddrCheckStruct chrysler_rx_checks[] = {
1112
{.addr = {544}, .bus = 0, .expected_timestep = 10000U},
13+
{.addr = {514}, .bus = 0, .expected_timestep = 10000U},
1214
{.addr = {500}, .bus = 0, .expected_timestep = 20000U},
15+
{.addr = {308}, .bus = 0, .expected_timestep = 20000U}, // verify ts
1316
};
1417
const int CHRYSLER_RX_CHECK_LEN = sizeof(chrysler_rx_checks) / sizeof(chrysler_rx_checks[0]);
1518

1619
int chrysler_rt_torque_last = 0;
1720
int chrysler_desired_torque_last = 0;
1821
int chrysler_cruise_engaged_last = 0;
22+
bool chrysler_gas_prev = false;
23+
int chrysler_speed = 0;
1924
uint32_t chrysler_ts_last = 0;
2025
struct sample_t chrysler_torque_meas; // last few torques measured
2126

@@ -29,15 +34,15 @@ static int chrysler_rx_hook(CAN_FIFOMailBox_TypeDef *to_push) {
2934
int addr = GET_ADDR(to_push);
3035

3136
// Measured eps torque
32-
if (addr == 544) {
37+
if ((addr == 544) && (bus == 0)) {
3338
int torque_meas_new = ((GET_BYTE(to_push, 4) & 0x7U) << 8) + GET_BYTE(to_push, 5) - 1024U;
3439

3540
// update array of samples
3641
update_sample(&chrysler_torque_meas, torque_meas_new);
3742
}
3843

3944
// enter controls on rising edge of ACC, exit controls on ACC off
40-
if (addr == 0x1F4) {
45+
if ((addr == 500) && (bus == 0)) {
4146
int cruise_engaged = ((GET_BYTE(to_push, 2) & 0x38) >> 3) == 7;
4247
if (cruise_engaged && !chrysler_cruise_engaged_last) {
4348
controls_allowed = 1;
@@ -48,7 +53,21 @@ static int chrysler_rx_hook(CAN_FIFOMailBox_TypeDef *to_push) {
4853
chrysler_cruise_engaged_last = cruise_engaged;
4954
}
5055

51-
// TODO: add gas pressed check
56+
// update speed
57+
if ((addr == 514) && (bus == 0)) {
58+
int speed_l = (GET_BYTE(to_push, 0) << 4) + (GET_BYTE(to_push, 1) >> 4);
59+
int speed_r = (GET_BYTE(to_push, 2) << 4) + (GET_BYTE(to_push, 3) >> 4);
60+
chrysler_speed = (speed_l + speed_r) / 2;
61+
}
62+
63+
// exit controls on rising edge of gas press
64+
if ((addr == 308) && (bus == 0)) {
65+
bool gas = (GET_BYTE(to_push, 5) & 0x7F) != 0;
66+
if (gas && !chrysler_gas_prev && (chrysler_speed > CHRYSLER_GAS_THRSLD)) {
67+
controls_allowed = 0;
68+
}
69+
chrysler_gas_prev = gas;
70+
}
5271

5372
// check if stock camera ECU is on bus 0
5473
if ((safety_mode_cnt > RELAY_TRNS_TIMEOUT) && (bus == 0) && (addr == 0x292)) {

tests/safety/test.c

+2
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,8 @@ void init_tests_hyundai(void){
312312

313313
void init_tests_chrysler(void){
314314
init_tests();
315+
chrysler_gas_prev = false;
316+
chrysler_speed = 0;
315317
chrysler_torque_meas.min = 0;
316318
chrysler_torque_meas.max = 0;
317319
chrysler_desired_torque_last = 0;

tests/safety/test_chrysler.py

+22
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,18 @@ def _button_msg(self, buttons):
2828
to_send[0].RDLR = buttons
2929
return to_send
3030

31+
def _speed_msg(self, speed):
32+
speed = int(speed / 0.071028)
33+
to_send = make_msg(0, 514, 4)
34+
to_send[0].RDLR = ((speed & 0xFF0) >> 4) + ((speed & 0xF) << 12) + \
35+
((speed & 0xFF0) << 12) + ((speed & 0xF) << 28)
36+
return to_send
37+
38+
def _gas_msg(self, gas):
39+
to_send = make_msg(0, 308)
40+
to_send[0].RDHR = (gas & 0x7F) << 8
41+
return to_send
42+
3143
def _set_prev_torque(self, t):
3244
self.safety.set_chrysler_desired_torque_last(t)
3345
self.safety.set_chrysler_rt_torque_last(t)
@@ -80,6 +92,16 @@ def test_disable_control_allowed_from_cruise(self):
8092
self.safety.safety_rx_hook(to_push)
8193
self.assertFalse(self.safety.get_controls_allowed())
8294

95+
def test_gas_disable(self):
96+
self.safety.set_controls_allowed(1)
97+
self.safety.safety_rx_hook(self._speed_msg(2.2))
98+
self.safety.safety_rx_hook(self._gas_msg(1))
99+
self.assertTrue(self.safety.get_controls_allowed())
100+
self.safety.safety_rx_hook(self._gas_msg(0))
101+
self.safety.safety_rx_hook(self._speed_msg(2.3))
102+
self.safety.safety_rx_hook(self._gas_msg(1))
103+
self.assertFalse(self.safety.get_controls_allowed())
104+
83105
def test_non_realtime_limit_up(self):
84106
self.safety.set_controls_allowed(True)
85107

0 commit comments

Comments
 (0)