Skip to content

Commit c7d0d5f

Browse files
authored
Volkswagen safety updates: Phase 3 (commaai#462)
* Torque limit bump, change signal for ACC state tracking
1 parent 4368748 commit c7d0d5f

File tree

3 files changed

+31
-31
lines changed

3 files changed

+31
-31
lines changed

board/safety/safety_volkswagen.h

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Safety-relevant steering constants for Volkswagen
2-
const int VOLKSWAGEN_MAX_STEER = 250; // 2.5 Nm (EPS side max of 3.0Nm with fault if violated)
2+
const int VOLKSWAGEN_MAX_STEER = 300; // 3.0 Nm (EPS side max of 3.0Nm with fault if violated)
33
const int VOLKSWAGEN_MAX_RT_DELTA = 75; // 4 max rate up * 50Hz send rate * 250000 RT interval / 1000000 = 50 ; 50 * 1.5 for safety pad = 75
44
const uint32_t VOLKSWAGEN_RT_INTERVAL = 250000; // 250ms between real time checks
55
const int VOLKSWAGEN_MAX_RATE_UP = 4; // 2.0 Nm/s RoC limit (EPS rack has own soft-limit of 5.0 Nm/s)
@@ -11,8 +11,8 @@ const int VOLKSWAGEN_DRIVER_TORQUE_FACTOR = 3;
1111
#define MSG_ESP_19 0x0B2 // RX from ABS, for wheel speeds
1212
#define MSG_EPS_01 0x09F // RX from EPS, for driver steering torque
1313
#define MSG_ESP_05 0x106 // RX from ABS, for brake switch state
14+
#define MSG_TSK_06 0x120 // RX from ECU, for ACC status from drivetrain coordinator
1415
#define MSG_MOTOR_20 0x121 // RX from ECU, for driver throttle input
15-
#define MSG_ACC_06 0x122 // RX from ACC radar, for status and engagement
1616
#define MSG_HCA_01 0x126 // TX by OP, Heading Control Assist steering torque
1717
#define MSG_GRA_ACC_01 0x12B // TX by OP, ACC control buttons for cancel/resume
1818
#define MSG_LDW_02 0x397 // TX by OP, Lane line recognition and text alerts
@@ -25,8 +25,8 @@ AddrCheckStruct volkswagen_mqb_rx_checks[] = {
2525
{.addr = {MSG_ESP_19}, .bus = 0, .check_checksum = false, .max_counter = 0U, .expected_timestep = 10000U},
2626
{.addr = {MSG_EPS_01}, .bus = 0, .check_checksum = true, .max_counter = 15U, .expected_timestep = 10000U},
2727
{.addr = {MSG_ESP_05}, .bus = 0, .check_checksum = true, .max_counter = 15U, .expected_timestep = 20000U},
28+
{.addr = {MSG_TSK_06}, .bus = 0, .check_checksum = true, .max_counter = 15U, .expected_timestep = 20000U},
2829
{.addr = {MSG_MOTOR_20}, .bus = 0, .check_checksum = true, .max_counter = 15U, .expected_timestep = 20000U},
29-
{.addr = {MSG_ACC_06}, .bus = 0, .check_checksum = true, .max_counter = 15U, .expected_timestep = 20000U},
3030
};
3131
const int VOLKSWAGEN_MQB_RX_CHECKS_LEN = sizeof(volkswagen_mqb_rx_checks) / sizeof(volkswagen_mqb_rx_checks[0]);
3232

@@ -72,12 +72,12 @@ static uint8_t volkswagen_mqb_compute_crc(CAN_FIFOMailBox_TypeDef *to_push) {
7272
case MSG_ESP_05:
7373
crc ^= (uint8_t[]){0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07}[counter];
7474
break;
75+
case MSG_TSK_06:
76+
crc ^= (uint8_t[]){0xC4,0xE2,0x4F,0xE4,0xF8,0x2F,0x56,0x81,0x9F,0xE5,0x83,0x44,0x05,0x3F,0x97,0xDF}[counter];
77+
break;
7578
case MSG_MOTOR_20:
7679
crc ^= (uint8_t[]){0xE9,0x65,0xAE,0x6B,0x7B,0x35,0xE5,0x5F,0x4E,0xC7,0x86,0xA2,0xBB,0xDD,0xEB,0xB4}[counter];
7780
break;
78-
case MSG_ACC_06:
79-
crc ^= (uint8_t[]){0x37,0x7D,0xF3,0xA9,0x18,0x46,0x6D,0x4D,0x3D,0x71,0x92,0x9C,0xE5,0x32,0x10,0xB9}[counter];
80-
break;
8181
default: // Undefined CAN message, CRC check expected to fail
8282
break;
8383
}
@@ -128,10 +128,10 @@ static int volkswagen_mqb_rx_hook(CAN_FIFOMailBox_TypeDef *to_push) {
128128
update_sample(&volkswagen_torque_driver, torque_driver_new);
129129
}
130130

131-
// Update ACC status from radar for controls-allowed state
132-
// Signal: ACC_06.ACC_Status_ACC
133-
if ((bus == 0) && (addr == MSG_ACC_06)) {
134-
int acc_status = (GET_BYTE(to_push, 7) & 0x70) >> 4;
131+
// Update ACC status from drivetrain coordinator for controls-allowed state
132+
// Signal: TSK_06.TSK_Status
133+
if ((bus == 0) && (addr == MSG_TSK_06)) {
134+
int acc_status = (GET_BYTE(to_push, 3) & 0x7);
135135
controls_allowed = ((acc_status == 3) || (acc_status == 4) || (acc_status == 5)) ? 1 : 0;
136136
}
137137

tests/safety/test_volkswagen_mqb.py

+20-20
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
MAX_RATE_UP = 4
1111
MAX_RATE_DOWN = 10
12-
MAX_STEER = 250
12+
MAX_STEER = 300
1313
MAX_RT_DELTA = 75
1414
RT_INTERVAL = 250000
1515

@@ -19,8 +19,8 @@
1919
MSG_ESP_19 = 0xB2 # RX from ABS, for wheel speeds
2020
MSG_EPS_01 = 0x9F # RX from EPS, for driver steering torque
2121
MSG_ESP_05 = 0x106 # RX from ABS, for brake light state
22+
MSG_TSK_06 = 0x120 # RX from ECU, for ACC status from drivetrain coordinator
2223
MSG_MOTOR_20 = 0x121 # RX from ECU, for driver throttle input
23-
MSG_ACC_06 = 0x122 # RX from ACC radar, for status and engagement
2424
MSG_HCA_01 = 0x126 # TX by OP, Heading Control Assist steering torque
2525
MSG_GRA_ACC_01 = 0x12B # TX by OP, ACC control buttons for cancel/resume
2626
MSG_LDW_02 = 0x397 # TX by OP, Lane line recognition and text alerts
@@ -48,10 +48,10 @@ def volkswagen_mqb_crc(msg, addr, len_msg):
4848
magic_pad = b'\xF5\xF5\xF5\xF5\xF5\xF5\xF5\xF5\xF5\xF5\xF5\xF5\xF5\xF5\xF5\xF5'[counter]
4949
elif addr == MSG_ESP_05:
5050
magic_pad = b'\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07'[counter]
51+
elif addr == MSG_TSK_06:
52+
magic_pad = b'\xC4\xE2\x4F\xE4\xF8\x2F\x56\x81\x9F\xE5\x83\x44\x05\x3F\x97\xDF'[counter]
5153
elif addr == MSG_MOTOR_20:
5254
magic_pad = b'\xE9\x65\xAE\x6B\x7B\x35\xE5\x5F\x4E\xC7\x86\xA2\xBB\xDD\xEB\xB4'[counter]
53-
elif addr == MSG_ACC_06:
54-
magic_pad = b'\x37\x7D\xF3\xA9\x18\x46\x6D\x4D\x3D\x71\x92\x9C\xE5\x32\x10\xB9'[counter]
5555
elif addr == MSG_HCA_01:
5656
magic_pad = b'\xDA\xDA\xDA\xDA\xDA\xDA\xDA\xDA\xDA\xDA\xDA\xDA\xDA\xDA\xDA\xDA'[counter]
5757
elif addr == MSG_GRA_ACC_01:
@@ -63,8 +63,8 @@ def volkswagen_mqb_crc(msg, addr, len_msg):
6363
class TestVolkswagenMqbSafety(unittest.TestCase):
6464
cnt_eps_01 = 0
6565
cnt_esp_05 = 0
66+
cnt_tsk_06 = 0
6667
cnt_motor_20 = 0
67-
cnt_acc_06 = 0
6868
cnt_hca_01 = 0
6969
cnt_gra_acc_01 = 0
7070

@@ -120,12 +120,12 @@ def _hca_01_msg(self, torque):
120120
return to_send
121121

122122
# ACC engagement status
123-
def _acc_06_msg(self, status):
124-
to_send = make_msg(0, MSG_ACC_06)
125-
to_send[0].RDHR = (status & 0x7) << 28
126-
to_send[0].RDLR |= (self.cnt_acc_06 % 16) << 8
127-
to_send[0].RDLR |= volkswagen_mqb_crc(to_send[0], MSG_ACC_06, 8)
128-
self.__class__.cnt_acc_06 += 1
123+
def _tsk_06_msg(self, status):
124+
to_send = make_msg(0, MSG_TSK_06)
125+
to_send[0].RDLR = (status & 0x7) << 24
126+
to_send[0].RDLR |= (self.cnt_tsk_06 % 16) << 8
127+
to_send[0].RDLR |= volkswagen_mqb_crc(to_send[0], MSG_TSK_06, 8)
128+
self.__class__.cnt_tsk_06 += 1
129129
return to_send
130130

131131
# Driver throttle input
@@ -162,12 +162,12 @@ def test_default_controls_not_allowed(self):
162162

163163
def test_enable_control_allowed_from_cruise(self):
164164
self.safety.set_controls_allowed(0)
165-
self.safety.safety_rx_hook(self._acc_06_msg(3))
165+
self.safety.safety_rx_hook(self._tsk_06_msg(3))
166166
self.assertTrue(self.safety.get_controls_allowed())
167167

168168
def test_disable_control_allowed_from_cruise(self):
169169
self.safety.set_controls_allowed(1)
170-
self.safety.safety_rx_hook(self._acc_06_msg(1))
170+
self.safety.safety_rx_hook(self._tsk_06_msg(1))
171171
self.assertFalse(self.safety.get_controls_allowed())
172172

173173
def test_sample_speed(self):
@@ -351,16 +351,16 @@ def test_rx_hook(self):
351351
# TODO: Would be ideal to check ESP_19 as well, but it has no checksum
352352
# or counter, and I'm not sure if we can easily validate Panda's simple
353353
# temporal reception-rate check here.
354-
for msg in [MSG_EPS_01, MSG_ESP_05, MSG_MOTOR_20, MSG_ACC_06]:
354+
for msg in [MSG_EPS_01, MSG_ESP_05, MSG_TSK_06, MSG_MOTOR_20]:
355355
self.safety.set_controls_allowed(1)
356356
if msg == MSG_EPS_01:
357357
to_push = self._eps_01_msg(0)
358358
if msg == MSG_ESP_05:
359359
to_push = self._esp_05_msg(False)
360+
if msg == MSG_TSK_06:
361+
to_push = self._tsk_06_msg(3)
360362
if msg == MSG_MOTOR_20:
361363
to_push = self._motor_20_msg(0)
362-
if msg == MSG_ACC_06:
363-
to_push = self._acc_06_msg(3)
364364
self.assertTrue(self.safety.safety_rx_hook(to_push))
365365
to_push[0].RDHR ^= 0xFF
366366
self.assertFalse(self.safety.safety_rx_hook(to_push))
@@ -371,28 +371,28 @@ def test_rx_hook(self):
371371
for i in range(MAX_WRONG_COUNTERS + 1):
372372
self.__class__.cnt_eps_01 += 1
373373
self.__class__.cnt_esp_05 += 1
374+
self.__class__.cnt_tsk_06 += 1
374375
self.__class__.cnt_motor_20 += 1
375-
self.__class__.cnt_acc_06 += 1
376376
if i < MAX_WRONG_COUNTERS:
377377
self.safety.set_controls_allowed(1)
378378
self.safety.safety_rx_hook(self._eps_01_msg(0))
379379
self.safety.safety_rx_hook(self._esp_05_msg(False))
380+
self.safety.safety_rx_hook(self._tsk_06_msg(3))
380381
self.safety.safety_rx_hook(self._motor_20_msg(0))
381-
self.safety.safety_rx_hook(self._acc_06_msg(3))
382382
else:
383383
self.assertFalse(self.safety.safety_rx_hook(self._eps_01_msg(0)))
384384
self.assertFalse(self.safety.safety_rx_hook(self._esp_05_msg(False)))
385+
self.assertFalse(self.safety.safety_rx_hook(self._tsk_06_msg(3)))
385386
self.assertFalse(self.safety.safety_rx_hook(self._motor_20_msg(0)))
386-
self.assertFalse(self.safety.safety_rx_hook(self._acc_06_msg(3)))
387387
self.assertFalse(self.safety.get_controls_allowed())
388388

389389
# restore counters for future tests with a couple of good messages
390390
for i in range(2):
391391
self.safety.set_controls_allowed(1)
392392
self.safety.safety_rx_hook(self._eps_01_msg(0))
393393
self.safety.safety_rx_hook(self._esp_05_msg(False))
394+
self.safety.safety_rx_hook(self._tsk_06_msg(3))
394395
self.safety.safety_rx_hook(self._motor_20_msg(0))
395-
self.safety.safety_rx_hook(self._acc_06_msg(3))
396396
self.assertTrue(self.safety.get_controls_allowed())
397397

398398
def test_fwd_hook(self):

tests/safety_replay/test_safety_replay.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
("02ec6bea180a4d36|2019-04-17--11-21-35.bz2", Panda.SAFETY_HYUNDAI, 0), # HYUNDAI.SANTA_FE
1919
("6fb4948a7ebe670e|2019-11-12--00-35-53.bz2", Panda.SAFETY_CHRYSLER, 0), # CHRYSLER.PACIFICA_2018_HYBRID
2020
("791340bc01ed993d|2019-04-08--10-26-00.bz2", Panda.SAFETY_SUBARU, 0), # SUBARU.IMPREZA
21-
("b0c9d2329ad1606b|2019-11-17--17-06-13.bz2", Panda.SAFETY_VOLKSWAGEN_MQB, 0), # VOLKSWAGEN.GOLF
21+
("76b83eb0245de90e|2020-03-05--19-16-05.bz2", Panda.SAFETY_VOLKSWAGEN_MQB, 0), # VOLKSWAGEN.GOLF
2222
("fbbfa6af821552b9|2020-03-03--08-09-43.bz2", Panda.SAFETY_NISSAN, 0), # NISSAN.XTRAIL
2323
]
2424

0 commit comments

Comments
 (0)