Skip to content

Commit dad5858

Browse files
authored
Chrysler: add brakepress cancellation (commaai#451)
1 parent db94a5b commit dad5858

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

board/safety/safety_chrysler.h

+12
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ 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
77
const int CHRYSLER_GAS_THRSLD = 30; // 7% more than 2m/s
8+
const int CHRYSLER_STANDSTILL_THRSLD = 10; // about 1m/s
89
const AddrBus CHRYSLER_TX_MSGS[] = {{571, 0}, {658, 0}, {678, 0}};
910

1011
// TODO: do checksum and counter checks
@@ -13,13 +14,15 @@ AddrCheckStruct chrysler_rx_checks[] = {
1314
{.addr = {514}, .bus = 0, .check_checksum = false, .max_counter = 0U, .expected_timestep = 10000U},
1415
{.addr = {500}, .bus = 0, .check_checksum = true, .max_counter = 15U, .expected_timestep = 20000U},
1516
{.addr = {308}, .bus = 0, .check_checksum = false, .max_counter = 15U, .expected_timestep = 20000U},
17+
{.addr = {320}, .bus = 0, .check_checksum = true, .max_counter = 15U, .expected_timestep = 20000U},
1618
};
1719
const int CHRYSLER_RX_CHECK_LEN = sizeof(chrysler_rx_checks) / sizeof(chrysler_rx_checks[0]);
1820

1921
int chrysler_rt_torque_last = 0;
2022
int chrysler_desired_torque_last = 0;
2123
int chrysler_cruise_engaged_last = 0;
2224
bool chrysler_gas_prev = false;
25+
bool chrysler_brake_prev = false;
2326
int chrysler_speed = 0;
2427
uint32_t chrysler_ts_last = 0;
2528
struct sample_t chrysler_torque_meas; // last few torques measured
@@ -113,6 +116,15 @@ static int chrysler_rx_hook(CAN_FIFOMailBox_TypeDef *to_push) {
113116
chrysler_gas_prev = gas;
114117
}
115118

119+
// exit controls on rising edge of brake press
120+
if ((addr == 320) && (bus == 0)) {
121+
bool brake = (GET_BYTE(to_push, 0) & 0x7) == 5;
122+
if (brake && (!chrysler_brake_prev || (chrysler_speed > CHRYSLER_STANDSTILL_THRSLD))) {
123+
controls_allowed = 0;
124+
}
125+
chrysler_brake_prev = brake;
126+
}
127+
116128
// check if stock camera ECU is on bus 0
117129
if ((safety_mode_cnt > RELAY_TRNS_TIMEOUT) && (bus == 0) && (addr == 0x292)) {
118130
relay_malfunction = true;

tests/safety/test_chrysler.py

+33
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ def setUp(cls):
5050
cls.cnt_torque_meas = 0
5151
cls.cnt_gas = 0
5252
cls.cnt_cruise = 0
53+
cls.cnt_brake = 0
5354

5455
def _button_msg(self, buttons):
5556
to_send = make_msg(0, 571)
@@ -78,6 +79,14 @@ def _gas_msg(self, gas):
7879
self.cnt_gas += 1
7980
return to_send
8081

82+
def _brake_msg(self, brake):
83+
to_send = make_msg(0, 320)
84+
to_send[0].RDLR = 5 if brake else 0
85+
to_send[0].RDHR |= (self.cnt_brake % 16) << 20
86+
to_send[0].RDHR |= chrysler_checksum(to_send[0], 8) << 24
87+
self.cnt_brake += 1
88+
return to_send
89+
8190
def _set_prev_torque(self, t):
8291
self.safety.set_chrysler_desired_torque_last(t)
8392
self.safety.set_chrysler_rt_torque_last(t)
@@ -139,6 +148,30 @@ def test_gas_disable(self):
139148
self.safety.safety_rx_hook(self._gas_msg(1))
140149
self.assertFalse(self.safety.get_controls_allowed())
141150

151+
def test_brake_disable(self):
152+
self.safety.safety_rx_hook(self._brake_msg(True))
153+
self.safety.safety_rx_hook(self._speed_msg(0))
154+
self.safety.set_controls_allowed(1)
155+
self.safety.safety_rx_hook(self._brake_msg(True))
156+
self.assertTrue(self.safety.get_controls_allowed())
157+
158+
self.safety.safety_rx_hook(self._brake_msg(False))
159+
self.safety.set_controls_allowed(1)
160+
self.safety.safety_rx_hook(self._brake_msg(True))
161+
self.assertFalse(self.safety.get_controls_allowed())
162+
163+
self.safety.safety_rx_hook(self._brake_msg(True))
164+
self.safety.safety_rx_hook(self._speed_msg(1))
165+
self.safety.set_controls_allowed(1)
166+
self.safety.safety_rx_hook(self._brake_msg(True))
167+
self.assertFalse(self.safety.get_controls_allowed())
168+
169+
self.safety.safety_rx_hook(self._speed_msg(1))
170+
self.safety.safety_rx_hook(self._brake_msg(False))
171+
self.safety.set_controls_allowed(1)
172+
self.safety.safety_rx_hook(self._brake_msg(True))
173+
self.assertFalse(self.safety.get_controls_allowed())
174+
142175
def test_non_realtime_limit_up(self):
143176
self.safety.set_controls_allowed(True)
144177

0 commit comments

Comments
 (0)