Skip to content

Commit 9a44499

Browse files
authored
Fix Subaru Legacy Torque driver bug (#454)
* Fix Subaru Legacy Torque driver bug
1 parent dfa6b07 commit 9a44499

File tree

4 files changed

+26
-19
lines changed

4 files changed

+26
-19
lines changed

board/safety/safety_subaru.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,12 @@ static int subaru_rx_hook(CAN_FIFOMailBox_TypeDef *to_push) {
5252
if (bus == 0) {
5353
if (((addr == 0x119) && subaru_global) ||
5454
((addr == 0x371) && !subaru_global)) {
55-
int bit_shift = subaru_global ? 16 : 29;
56-
int torque_driver_new = ((GET_BYTES_04(to_push) >> bit_shift) & 0x7FF);
55+
int torque_driver_new;
56+
if (subaru_global) {
57+
torque_driver_new = ((GET_BYTES_04(to_push) >> 16) & 0x7FF);
58+
} else {
59+
torque_driver_new = (GET_BYTE(to_push, 3) >> 5) + (GET_BYTE(to_push, 4) << 3);
60+
}
5761
torque_driver_new = to_signed(torque_driver_new, 11);
5862
update_sample(&subaru_torque_driver, torque_driver_new);
5963
}

tests/safety/libpandasafety_py.py

-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@
8989
void set_subaru_desired_torque_last(int t);
9090
void set_subaru_rt_torque_last(int t);
9191
bool get_subaru_global(void);
92-
void set_subaru_torque_driver(int min, int max);
9392
9493
void init_tests_volkswagen(void);
9594
int get_volkswagen_gas_prev(void);

tests/safety/test.c

-5
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,6 @@ void set_chrysler_torque_meas(int min, int max){
142142
chrysler_torque_meas.max = max;
143143
}
144144

145-
void set_subaru_torque_driver(int min, int max){
146-
subaru_torque_driver.min = min;
147-
subaru_torque_driver.max = max;
148-
}
149-
150145
void set_volkswagen_torque_driver(int min, int max){
151146
volkswagen_torque_driver.min = min;
152147
volkswagen_torque_driver.max = max;

tests/safety/test_subaru.py

+20-11
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ def _torque_driver_msg(self, torque):
4848
to_send[0].RDLR = ((t & 0x7FF) << 16)
4949
else:
5050
to_send = make_msg(0, 0x371)
51-
to_send[0].RDLR = ((t & 0x7FF) << 29)
51+
to_send[0].RDLR = (t & 0x7) << 29
52+
to_send[0].RDHR = (t >> 3) & 0xFF
5253
return to_send
5354

5455
def _torque_msg(self, torque):
@@ -79,6 +80,11 @@ def _cruise_msg(self, cruise):
7980
to_send[0].RDHR = cruise << 17
8081
return to_send
8182

83+
def _set_torque_driver(self, min_t, max_t):
84+
for i in range(0, 5):
85+
self.safety.safety_rx_hook(self._torque_driver_msg(min_t))
86+
self.safety.safety_rx_hook(self._torque_driver_msg(max_t))
87+
8288
def test_spam_can_buses(self):
8389
test_spam_can_buses(self, TX_MSGS if self.safety.get_subaru_global() else TX_L_MSGS)
8490

@@ -118,7 +124,7 @@ def test_manually_enable_controls_allowed(self):
118124
test_manually_enable_controls_allowed(self)
119125

120126
def test_non_realtime_limit_up(self):
121-
self.safety.set_subaru_torque_driver(0, 0)
127+
self._set_torque_driver(0, 0)
122128
self.safety.set_controls_allowed(True)
123129

124130
self._set_prev_torque(0)
@@ -133,7 +139,7 @@ def test_non_realtime_limit_up(self):
133139
self.assertFalse(self.safety.safety_tx_hook(self._torque_msg(-MAX_RATE_UP - 1)))
134140

135141
def test_non_realtime_limit_down(self):
136-
self.safety.set_subaru_torque_driver(0, 0)
142+
self._set_torque_driver(0, 0)
137143
self.safety.set_controls_allowed(True)
138144

139145
def test_against_torque_driver(self):
@@ -142,33 +148,36 @@ def test_against_torque_driver(self):
142148
for sign in [-1, 1]:
143149
for t in np.arange(0, DRIVER_TORQUE_ALLOWANCE + 1, 1):
144150
t *= -sign
145-
self.safety.set_subaru_torque_driver(t, t)
151+
self._set_torque_driver(t, t)
146152
self._set_prev_torque(MAX_STEER * sign)
147153
self.assertTrue(self.safety.safety_tx_hook(self._torque_msg(MAX_STEER * sign)))
148154

149-
self.safety.set_subaru_torque_driver(DRIVER_TORQUE_ALLOWANCE + 1, DRIVER_TORQUE_ALLOWANCE + 1)
155+
self._set_torque_driver(DRIVER_TORQUE_ALLOWANCE + 1, DRIVER_TORQUE_ALLOWANCE + 1)
150156
self.assertFalse(self.safety.safety_tx_hook(self._torque_msg(-MAX_STEER)))
151157

158+
# arbitrary high driver torque to ensure max steer torque is allowed
159+
max_driver_torque = int(MAX_STEER / DRIVER_TORQUE_FACTOR + DRIVER_TORQUE_ALLOWANCE + 1)
160+
152161
# spot check some individual cases
153162
for sign in [-1, 1]:
154163
driver_torque = (DRIVER_TORQUE_ALLOWANCE + 10) * sign
155164
torque_desired = (MAX_STEER - 10 * DRIVER_TORQUE_FACTOR) * sign
156165
delta = 1 * sign
157166
self._set_prev_torque(torque_desired)
158-
self.safety.set_subaru_torque_driver(-driver_torque, -driver_torque)
167+
self._set_torque_driver(-driver_torque, -driver_torque)
159168
self.assertTrue(self.safety.safety_tx_hook(self._torque_msg(torque_desired)))
160169
self._set_prev_torque(torque_desired + delta)
161-
self.safety.set_subaru_torque_driver(-driver_torque, -driver_torque)
170+
self._set_torque_driver(-driver_torque, -driver_torque)
162171
self.assertFalse(self.safety.safety_tx_hook(self._torque_msg(torque_desired + delta)))
163172

164173
self._set_prev_torque(MAX_STEER * sign)
165-
self.safety.set_subaru_torque_driver(-MAX_STEER * sign, -MAX_STEER * sign)
174+
self._set_torque_driver(-max_driver_torque * sign, -max_driver_torque * sign)
166175
self.assertTrue(self.safety.safety_tx_hook(self._torque_msg((MAX_STEER - MAX_RATE_DOWN) * sign)))
167176
self._set_prev_torque(MAX_STEER * sign)
168-
self.safety.set_subaru_torque_driver(-MAX_STEER * sign, -MAX_STEER * sign)
177+
self._set_torque_driver(-max_driver_torque * sign, -max_driver_torque * sign)
169178
self.assertTrue(self.safety.safety_tx_hook(self._torque_msg(0)))
170179
self._set_prev_torque(MAX_STEER * sign)
171-
self.safety.set_subaru_torque_driver(-MAX_STEER * sign, -MAX_STEER * sign)
180+
self._set_torque_driver(-max_driver_torque * sign, -max_driver_torque * sign)
172181
self.assertFalse(self.safety.safety_tx_hook(self._torque_msg((MAX_STEER - MAX_RATE_DOWN + 1) * sign)))
173182

174183

@@ -178,7 +187,7 @@ def test_realtime_limits(self):
178187
for sign in [-1, 1]:
179188
self.safety.init_tests_subaru()
180189
self._set_prev_torque(0)
181-
self.safety.set_subaru_torque_driver(0, 0)
190+
self._set_torque_driver(0, 0)
182191
for t in np.arange(0, MAX_RT_DELTA, 1):
183192
t *= sign
184193
self.assertTrue(self.safety.safety_tx_hook(self._torque_msg(t)))

0 commit comments

Comments
 (0)