15
15
DRIVER_TORQUE_ALLOWANCE = 60 ;
16
16
DRIVER_TORQUE_FACTOR = 10 ;
17
17
18
+ SPEED_THRESHOLD = 20 # 1kph (see dbc file)
19
+
18
20
TX_MSGS = [[0x122 , 0 ], [0x221 , 0 ], [0x322 , 0 ]]
19
21
TX_L_MSGS = [[0x164 , 0 ], [0x221 , 0 ], [0x322 , 0 ]]
20
22
@@ -44,6 +46,8 @@ class TestSubaruSafety(unittest.TestCase):
44
46
cnt_gas = 0
45
47
cnt_torque_driver = 0
46
48
cnt_cruise = 0
49
+ cnt_speed = 0
50
+ cnt_brake = 0
47
51
48
52
@classmethod
49
53
def setUp (cls ):
@@ -69,6 +73,24 @@ def _torque_driver_msg(self, torque):
69
73
to_send [0 ].RDHR = (t >> 3 ) & 0xFF
70
74
return to_send
71
75
76
+ def _speed_msg (self , speed ):
77
+ speed &= 0x1FFF
78
+ to_send = make_msg (0 , 0x13a )
79
+ to_send [0 ].RDLR = speed << 12
80
+ to_send [0 ].RDHR = speed << 6
81
+ to_send [0 ].RDLR |= (self .cnt_speed & 0xF ) << 8
82
+ to_send [0 ].RDLR |= subaru_checksum (to_send , 0x13a , 8 )
83
+ self .__class__ .cnt_speed += 1
84
+ return to_send
85
+
86
+ def _brake_msg (self , brake ):
87
+ to_send = make_msg (0 , 0x139 )
88
+ to_send [0 ].RDHR = (brake << 4 ) & 0xFFF
89
+ to_send [0 ].RDLR |= (self .cnt_brake & 0xF ) << 8
90
+ to_send [0 ].RDLR |= subaru_checksum (to_send , 0x139 , 8 )
91
+ self .__class__ .cnt_brake += 1
92
+ return to_send
93
+
72
94
def _torque_msg (self , torque ):
73
95
t = twos_comp (torque , 13 )
74
96
if self .safety .get_subaru_global ():
@@ -133,6 +155,33 @@ def test_disengage_on_gas(self):
133
155
self .safety .safety_rx_hook (self ._gas_msg (1 ))
134
156
self .assertFalse (self .safety .get_controls_allowed ())
135
157
158
+ def test_allow_brake_at_zero_speed (self ):
159
+ # Brake was already pressed
160
+ if (self .safety .get_subaru_global ()):
161
+ self .safety .safety_rx_hook (self ._brake_msg (1 ))
162
+ self .safety .set_controls_allowed (1 )
163
+ self .safety .safety_rx_hook (self ._brake_msg (1 ))
164
+ self .assertTrue (self .safety .get_controls_allowed ())
165
+ self .safety .safety_rx_hook (self ._brake_msg (0 ))
166
+ self .assertTrue (self .safety .get_controls_allowed ())
167
+ # rising edge of brake should disengage
168
+ self .safety .safety_rx_hook (self ._brake_msg (1 ))
169
+ self .assertFalse (self .safety .get_controls_allowed ())
170
+ self .safety .safety_rx_hook (self ._brake_msg (0 )) # reset no brakes
171
+
172
+ def test_not_allow_brake_when_moving (self ):
173
+ # Brake was already pressed
174
+ if (self .safety .get_subaru_global ()):
175
+ self .safety .safety_rx_hook (self ._brake_msg (1 ))
176
+ self .safety .set_controls_allowed (1 )
177
+ self .safety .safety_rx_hook (self ._speed_msg (SPEED_THRESHOLD ))
178
+ self .safety .safety_rx_hook (self ._brake_msg (1 ))
179
+ self .assertTrue (self .safety .get_controls_allowed ())
180
+ self .safety .safety_rx_hook (self ._speed_msg (SPEED_THRESHOLD + 1 ))
181
+ self .safety .safety_rx_hook (self ._brake_msg (1 ))
182
+ self .assertFalse (self .safety .get_controls_allowed ())
183
+ self .safety .safety_rx_hook (self ._speed_msg (0 ))
184
+
136
185
def test_steer_safety_check (self ):
137
186
for enabled in [0 , 1 ]:
138
187
for t in range (- 3000 , 3000 ):
0 commit comments