Improve tests (#456)
* much more thorough Honda-Bosch tests and better test inheritance. Also fix counter test bug * Fixed other counters too * remove unnecessary functionmaster
parent
fb02390d4c
commit
11ef24bc16
|
@ -13,12 +13,12 @@ def make_msg(bus, addr, length=8):
|
|||
|
||||
return to_send
|
||||
|
||||
def test_relay_malfunction(test, addr):
|
||||
# input is a test class and the address that, if seen on bus 0, triggers
|
||||
def test_relay_malfunction(test, addr, bus=0):
|
||||
# input is a test class and the address that, if seen on specified bus, triggers
|
||||
# the relay_malfunction protection logic: both tx_hook and fwd_hook are
|
||||
# expected to return failure
|
||||
test.assertFalse(test.safety.get_relay_malfunction())
|
||||
test.safety.safety_rx_hook(make_msg(0, addr, 8))
|
||||
test.safety.safety_rx_hook(make_msg(bus, addr, 8))
|
||||
test.assertTrue(test.safety.get_relay_malfunction())
|
||||
for a in range(1, 0x800):
|
||||
for b in range(0, 3):
|
||||
|
|
|
@ -60,7 +60,6 @@ bool get_honda_brake_pressed_prev(void);
|
|||
int get_honda_gas_prev(void);
|
||||
void set_honda_fwd_brake(bool);
|
||||
void set_honda_alt_brake_msg(bool);
|
||||
void set_honda_hw(int);
|
||||
int get_honda_hw(void);
|
||||
|
||||
void init_tests_cadillac(void);
|
||||
|
|
|
@ -259,10 +259,6 @@ void set_honda_alt_brake_msg(bool c){
|
|||
honda_alt_brake_msg = c;
|
||||
}
|
||||
|
||||
void set_honda_hw(int c){
|
||||
honda_hw = c;
|
||||
}
|
||||
|
||||
int get_honda_hw(void) {
|
||||
return honda_hw;
|
||||
}
|
||||
|
|
|
@ -42,15 +42,16 @@ def chrysler_checksum(msg, len_msg):
|
|||
return ~checksum & 0xFF
|
||||
|
||||
class TestChryslerSafety(unittest.TestCase):
|
||||
cnt_torque_meas = 0
|
||||
cnt_gas = 0
|
||||
cnt_cruise = 0
|
||||
cnt_brake = 0
|
||||
|
||||
@classmethod
|
||||
def setUp(cls):
|
||||
cls.safety = libpandasafety_py.libpandasafety
|
||||
cls.safety.set_safety_hooks(Panda.SAFETY_CHRYSLER, 0)
|
||||
cls.safety.init_tests_chrysler()
|
||||
cls.cnt_torque_meas = 0
|
||||
cls.cnt_gas = 0
|
||||
cls.cnt_cruise = 0
|
||||
cls.cnt_brake = 0
|
||||
|
||||
def _button_msg(self, buttons):
|
||||
to_send = make_msg(0, 571)
|
||||
|
@ -62,7 +63,7 @@ class TestChryslerSafety(unittest.TestCase):
|
|||
to_send[0].RDLR = 0x380000 if active else 0
|
||||
to_send[0].RDHR |= (self.cnt_cruise % 16) << 20
|
||||
to_send[0].RDHR |= chrysler_checksum(to_send[0], 8) << 24
|
||||
self.cnt_cruise += 1
|
||||
self.__class__.cnt_cruise += 1
|
||||
return to_send
|
||||
|
||||
def _speed_msg(self, speed):
|
||||
|
@ -76,7 +77,7 @@ class TestChryslerSafety(unittest.TestCase):
|
|||
to_send = make_msg(0, 308)
|
||||
to_send[0].RDHR = (gas & 0x7F) << 8
|
||||
to_send[0].RDHR |= (self.cnt_gas % 16) << 20
|
||||
self.cnt_gas += 1
|
||||
self.__class__.cnt_gas += 1
|
||||
return to_send
|
||||
|
||||
def _brake_msg(self, brake):
|
||||
|
@ -84,7 +85,7 @@ class TestChryslerSafety(unittest.TestCase):
|
|||
to_send[0].RDLR = 5 if brake else 0
|
||||
to_send[0].RDHR |= (self.cnt_brake % 16) << 20
|
||||
to_send[0].RDHR |= chrysler_checksum(to_send[0], 8) << 24
|
||||
self.cnt_brake += 1
|
||||
self.__class__.cnt_brake += 1
|
||||
return to_send
|
||||
|
||||
def _set_prev_torque(self, t):
|
||||
|
@ -97,7 +98,7 @@ class TestChryslerSafety(unittest.TestCase):
|
|||
to_send[0].RDHR = ((torque + 1024) >> 8) + (((torque + 1024) & 0xff) << 8)
|
||||
to_send[0].RDHR |= (self.cnt_torque_meas % 16) << 20
|
||||
to_send[0].RDHR |= chrysler_checksum(to_send[0], 8) << 24
|
||||
self.cnt_torque_meas += 1
|
||||
self.__class__.cnt_torque_meas += 1
|
||||
return to_send
|
||||
|
||||
def _torque_msg(self, torque):
|
||||
|
|
|
@ -10,7 +10,10 @@ from panda.tests.safety.common import test_relay_malfunction, make_msg, \
|
|||
MAX_BRAKE = 255
|
||||
|
||||
INTERCEPTOR_THRESHOLD = 328
|
||||
TX_MSGS = [[0xE4, 0], [0x194, 0], [0x1FA, 0], [0x200, 0], [0x30C, 0], [0x33D, 0]]
|
||||
N_TX_MSGS = [[0xE4, 0], [0x194, 0], [0x1FA, 0], [0x200, 0], [0x30C, 0], [0x33D, 0]]
|
||||
BH_TX_MSGS = [[0xE4, 0], [0x296, 1], [0x33D, 0]] # Bosch Harness
|
||||
BG_TX_MSGS = [[0xE4, 2], [0x296, 0], [0x33D, 2]] # Bosch Giraffe
|
||||
|
||||
|
||||
HONDA_N_HW = 0
|
||||
HONDA_BG_HW = 1
|
||||
|
@ -30,39 +33,41 @@ def honda_checksum(msg, addr, len_msg):
|
|||
|
||||
|
||||
class TestHondaSafety(unittest.TestCase):
|
||||
cnt_speed = 0
|
||||
cnt_gas = 0
|
||||
cnt_button = 0
|
||||
|
||||
@classmethod
|
||||
def setUp(cls):
|
||||
cls.safety = libpandasafety_py.libpandasafety
|
||||
cls.safety.set_safety_hooks(Panda.SAFETY_HONDA_NIDEC, 0)
|
||||
cls.safety.init_tests_honda()
|
||||
cls.cnt_speed = 0
|
||||
cls.cnt_gas = 0
|
||||
cls.cnt_button = 0
|
||||
|
||||
def _speed_msg(self, speed):
|
||||
to_send = make_msg(0, 0x158)
|
||||
bus = 1 if self.safety.get_honda_hw() == HONDA_BH_HW else 0
|
||||
to_send = make_msg(bus, 0x158)
|
||||
to_send[0].RDLR = speed
|
||||
to_send[0].RDHR |= (self.cnt_speed % 4) << 28
|
||||
to_send[0].RDHR |= honda_checksum(to_send[0], 0x158, 8) << 24
|
||||
self.cnt_speed += 1
|
||||
self.__class__.cnt_speed += 1
|
||||
return to_send
|
||||
|
||||
def _button_msg(self, buttons, addr):
|
||||
honda_hw = self.safety.get_honda_hw()
|
||||
bus = 1 if honda_hw == HONDA_BH_HW else 0
|
||||
bus = 1 if self.safety.get_honda_hw() == HONDA_BH_HW else 0
|
||||
to_send = make_msg(bus, addr)
|
||||
to_send[0].RDLR = buttons << 5
|
||||
to_send[0].RDHR |= (self.cnt_button % 4) << 28
|
||||
to_send[0].RDHR |= honda_checksum(to_send[0], addr, 8) << 24
|
||||
self.cnt_button += 1
|
||||
self.__class__.cnt_button += 1
|
||||
return to_send
|
||||
|
||||
def _brake_msg(self, brake):
|
||||
to_send = make_msg(0, 0x17C)
|
||||
bus = 1 if self.safety.get_honda_hw() == HONDA_BH_HW else 0
|
||||
to_send = make_msg(bus, 0x17C)
|
||||
to_send[0].RDHR = 0x200000 if brake else 0
|
||||
to_send[0].RDHR |= (self.cnt_gas % 4) << 28
|
||||
to_send[0].RDHR |= honda_checksum(to_send[0], 0x17C, 8) << 24
|
||||
self.cnt_gas += 1
|
||||
self.__class__.cnt_gas += 1
|
||||
return to_send
|
||||
|
||||
def _alt_brake_msg(self, brake):
|
||||
|
@ -71,11 +76,12 @@ class TestHondaSafety(unittest.TestCase):
|
|||
return to_send
|
||||
|
||||
def _gas_msg(self, gas):
|
||||
to_send = make_msg(0, 0x17C)
|
||||
bus = 1 if self.safety.get_honda_hw() == HONDA_BH_HW else 0
|
||||
to_send = make_msg(bus, 0x17C)
|
||||
to_send[0].RDLR = 1 if gas else 0
|
||||
to_send[0].RDHR |= (self.cnt_gas % 4) << 28
|
||||
to_send[0].RDHR |= honda_checksum(to_send[0], 0x17C, 8) << 24
|
||||
self.cnt_gas += 1
|
||||
self.__class__.cnt_gas += 1
|
||||
return to_send
|
||||
|
||||
def _send_brake_msg(self, brake):
|
||||
|
@ -91,16 +97,25 @@ class TestHondaSafety(unittest.TestCase):
|
|||
return to_send
|
||||
|
||||
def _send_steer_msg(self, steer):
|
||||
to_send = make_msg(0, 0xE4, 6)
|
||||
bus = 2 if self.safety.get_honda_hw() == HONDA_BG_HW else 0
|
||||
to_send = make_msg(bus, 0xE4, 6)
|
||||
to_send[0].RDLR = steer
|
||||
return to_send
|
||||
|
||||
def test_spam_can_buses(self):
|
||||
self.safety.set_honda_hw(HONDA_N_HW)
|
||||
test_spam_can_buses(self, TX_MSGS)
|
||||
hw_type = self.safety.get_honda_hw()
|
||||
if hw_type == HONDA_N_HW:
|
||||
tx_msgs = N_TX_MSGS
|
||||
elif hw_type == HONDA_BH_HW:
|
||||
tx_msgs = BH_TX_MSGS
|
||||
elif hw_type == HONDA_BG_HW:
|
||||
tx_msgs = BG_TX_MSGS
|
||||
test_spam_can_buses(self, tx_msgs)
|
||||
|
||||
def test_relay_malfunction(self):
|
||||
test_relay_malfunction(self, 0xE4)
|
||||
hw = self.safety.get_honda_hw()
|
||||
bus = 2 if hw == HONDA_BG_HW else 0
|
||||
test_relay_malfunction(self, 0xE4, bus=bus)
|
||||
|
||||
def test_default_controls_not_allowed(self):
|
||||
self.assertFalse(self.safety.get_controls_allowed())
|
||||
|
@ -111,19 +126,19 @@ class TestHondaSafety(unittest.TestCase):
|
|||
def test_resume_button(self):
|
||||
RESUME_BTN = 4
|
||||
self.safety.set_controls_allowed(0)
|
||||
self.safety.safety_rx_hook(self._button_msg(RESUME_BTN, 0x1A6))
|
||||
self.safety.safety_rx_hook(self._button_msg(RESUME_BTN, 0x296))
|
||||
self.assertTrue(self.safety.get_controls_allowed())
|
||||
|
||||
def test_set_button(self):
|
||||
SET_BTN = 3
|
||||
self.safety.set_controls_allowed(0)
|
||||
self.safety.safety_rx_hook(self._button_msg(SET_BTN, 0x1A6))
|
||||
self.safety.safety_rx_hook(self._button_msg(SET_BTN, 0x296))
|
||||
self.assertTrue(self.safety.get_controls_allowed())
|
||||
|
||||
def test_cancel_button(self):
|
||||
CANCEL_BTN = 2
|
||||
self.safety.set_controls_allowed(1)
|
||||
self.safety.safety_rx_hook(self._button_msg(CANCEL_BTN, 0x1A6))
|
||||
self.safety.safety_rx_hook(self._button_msg(CANCEL_BTN, 0x296))
|
||||
self.assertFalse(self.safety.get_controls_allowed())
|
||||
|
||||
def test_sample_speed(self):
|
||||
|
@ -215,29 +230,32 @@ class TestHondaSafety(unittest.TestCase):
|
|||
self.safety.set_gas_interceptor_detected(False)
|
||||
|
||||
def test_brake_safety_check(self):
|
||||
for fwd_brake in [False, True]:
|
||||
self.safety.set_honda_fwd_brake(fwd_brake)
|
||||
for brake in np.arange(0, MAX_BRAKE + 10, 1):
|
||||
for controls_allowed in [True, False]:
|
||||
self.safety.set_controls_allowed(controls_allowed)
|
||||
if fwd_brake:
|
||||
send = False # block openpilot brake msg when fwd'ing stock msg
|
||||
elif controls_allowed:
|
||||
send = MAX_BRAKE >= brake >= 0
|
||||
else:
|
||||
send = brake == 0
|
||||
self.assertEqual(send, self.safety.safety_tx_hook(self._send_brake_msg(brake)))
|
||||
self.safety.set_honda_fwd_brake(False)
|
||||
hw = self.safety.get_honda_hw()
|
||||
if hw == HONDA_N_HW:
|
||||
for fwd_brake in [False, True]:
|
||||
self.safety.set_honda_fwd_brake(fwd_brake)
|
||||
for brake in np.arange(0, MAX_BRAKE + 10, 1):
|
||||
for controls_allowed in [True, False]:
|
||||
self.safety.set_controls_allowed(controls_allowed)
|
||||
if fwd_brake:
|
||||
send = False # block openpilot brake msg when fwd'ing stock msg
|
||||
elif controls_allowed:
|
||||
send = MAX_BRAKE >= brake >= 0
|
||||
else:
|
||||
send = brake == 0
|
||||
self.assertEqual(send, self.safety.safety_tx_hook(self._send_brake_msg(brake)))
|
||||
self.safety.set_honda_fwd_brake(False)
|
||||
|
||||
def test_gas_interceptor_safety_check(self):
|
||||
for gas in np.arange(0, 4000, 100):
|
||||
for controls_allowed in [True, False]:
|
||||
self.safety.set_controls_allowed(controls_allowed)
|
||||
if controls_allowed:
|
||||
send = True
|
||||
else:
|
||||
send = gas == 0
|
||||
self.assertEqual(send, self.safety.safety_tx_hook(self._send_interceptor_msg(gas, 0x200)))
|
||||
if self.safety.get_honda_hw() == HONDA_N_HW:
|
||||
for gas in np.arange(0, 4000, 100):
|
||||
for controls_allowed in [True, False]:
|
||||
self.safety.set_controls_allowed(controls_allowed)
|
||||
if controls_allowed:
|
||||
send = True
|
||||
else:
|
||||
send = gas == 0
|
||||
self.assertEqual(send, self.safety.safety_tx_hook(self._send_interceptor_msg(gas, 0x200)))
|
||||
|
||||
def test_steer_safety_check(self):
|
||||
self.safety.set_controls_allowed(0)
|
||||
|
@ -245,12 +263,12 @@ class TestHondaSafety(unittest.TestCase):
|
|||
self.assertFalse(self.safety.safety_tx_hook(self._send_steer_msg(0x1000)))
|
||||
|
||||
def test_spam_cancel_safety_check(self):
|
||||
RESUME_BTN = 4
|
||||
SET_BTN = 3
|
||||
CANCEL_BTN = 2
|
||||
BUTTON_MSG = 0x296
|
||||
for hw in [HONDA_BG_HW, HONDA_BH_HW]:
|
||||
self.safety.set_honda_hw(hw)
|
||||
hw = self.safety.get_honda_hw()
|
||||
if hw != HONDA_N_HW:
|
||||
RESUME_BTN = 4
|
||||
SET_BTN = 3
|
||||
CANCEL_BTN = 2
|
||||
BUTTON_MSG = 0x296
|
||||
self.safety.set_controls_allowed(0)
|
||||
self.assertTrue(self.safety.safety_tx_hook(self._button_msg(CANCEL_BTN, BUTTON_MSG)))
|
||||
self.assertFalse(self.safety.safety_tx_hook(self._button_msg(RESUME_BTN, BUTTON_MSG)))
|
||||
|
@ -260,12 +278,16 @@ class TestHondaSafety(unittest.TestCase):
|
|||
self.assertTrue(self.safety.safety_tx_hook(self._button_msg(RESUME_BTN, BUTTON_MSG)))
|
||||
|
||||
def test_rx_hook(self):
|
||||
|
||||
# checksum checks
|
||||
SET_BTN = 3
|
||||
for msg in ["btn1", "btn2", "gas", "speed"]:
|
||||
self.safety.set_controls_allowed(1)
|
||||
if msg == "btn1":
|
||||
to_push = self._button_msg(SET_BTN, 0x1A6)
|
||||
if self.safety.get_honda_hw() == HONDA_N_HW:
|
||||
to_push = self._button_msg(SET_BTN, 0x1A6) # only in Honda_NIDEC
|
||||
else:
|
||||
continue
|
||||
if msg == "btn2":
|
||||
to_push = self._button_msg(SET_BTN, 0x296)
|
||||
if msg == "gas":
|
||||
|
@ -273,23 +295,23 @@ class TestHondaSafety(unittest.TestCase):
|
|||
if msg == "speed":
|
||||
to_push = self._speed_msg(0)
|
||||
self.assertTrue(self.safety.safety_rx_hook(to_push))
|
||||
to_push[0].RDHR = 0
|
||||
to_push[0].RDHR = 0 # invalidate checksum
|
||||
self.assertFalse(self.safety.safety_rx_hook(to_push))
|
||||
self.assertFalse(self.safety.get_controls_allowed())
|
||||
|
||||
# counter
|
||||
# reset wrong_counters to zero by sending valid messages
|
||||
for i in range(MAX_WRONG_COUNTERS + 1):
|
||||
self.cnt_speed = 0
|
||||
self.cnt_gas = 0
|
||||
self.cnt_button = 0
|
||||
self.__class__.cnt_speed += 1
|
||||
self.__class__.cnt_gas += 1
|
||||
self.__class__.cnt_button += 1
|
||||
if i < MAX_WRONG_COUNTERS:
|
||||
self.safety.set_controls_allowed(1)
|
||||
self.safety.safety_rx_hook(self._button_msg(SET_BTN, 0x1A6))
|
||||
self.safety.safety_rx_hook(self._button_msg(SET_BTN, 0x296))
|
||||
self.safety.safety_rx_hook(self._speed_msg(0))
|
||||
self.safety.safety_rx_hook(self._gas_msg(0))
|
||||
else:
|
||||
self.assertFalse(self.safety.safety_rx_hook(self._button_msg(SET_BTN, 0x1A6)))
|
||||
self.assertFalse(self.safety.safety_rx_hook(self._button_msg(SET_BTN, 0x296)))
|
||||
self.assertFalse(self.safety.safety_rx_hook(self._speed_msg(0)))
|
||||
self.assertFalse(self.safety.safety_rx_hook(self._gas_msg(0)))
|
||||
self.assertFalse(self.safety.get_controls_allowed())
|
||||
|
@ -297,10 +319,10 @@ class TestHondaSafety(unittest.TestCase):
|
|||
# restore counters for future tests with a couple of good messages
|
||||
for i in range(2):
|
||||
self.safety.set_controls_allowed(1)
|
||||
self.safety.safety_rx_hook(self._button_msg(SET_BTN, 0x1A6))
|
||||
self.safety.safety_rx_hook(self._button_msg(SET_BTN, 0x296))
|
||||
self.safety.safety_rx_hook(self._speed_msg(0))
|
||||
self.safety.safety_rx_hook(self._gas_msg(0))
|
||||
self.safety.safety_rx_hook(self._button_msg(SET_BTN, 0x1A6))
|
||||
self.safety.safety_rx_hook(self._button_msg(SET_BTN, 0x296))
|
||||
self.assertTrue(self.safety.get_controls_allowed())
|
||||
|
||||
|
||||
|
@ -309,8 +331,6 @@ class TestHondaSafety(unittest.TestCase):
|
|||
msgs = list(range(0x1, 0x800))
|
||||
fwd_brake = [False, True]
|
||||
|
||||
self.safety.set_honda_hw(HONDA_N_HW)
|
||||
|
||||
for f in fwd_brake:
|
||||
self.safety.set_honda_fwd_brake(f)
|
||||
blocked_msgs = [0xE4, 0x194, 0x33D]
|
||||
|
@ -332,5 +352,43 @@ class TestHondaSafety(unittest.TestCase):
|
|||
self.safety.set_honda_fwd_brake(False)
|
||||
|
||||
|
||||
class TestHondaBoschGiraffeSafety(TestHondaSafety):
|
||||
@classmethod
|
||||
def setUp(cls):
|
||||
TestHondaSafety.setUp()
|
||||
cls.safety = libpandasafety_py.libpandasafety
|
||||
cls.safety.set_safety_hooks(Panda.SAFETY_HONDA_BOSCH_GIRAFFE, 0)
|
||||
cls.safety.init_tests_honda()
|
||||
|
||||
def test_fwd_hook(self):
|
||||
buss = range(0x0, 0x3)
|
||||
msgs = range(0x1, 0x800)
|
||||
hw = self.safety.get_honda_hw()
|
||||
bus_rdr_cam = 2 if hw == HONDA_BH_HW else 1
|
||||
bus_rdr_car = 0 if hw == HONDA_BH_HW else 2
|
||||
bus_pt = 1 if hw == HONDA_BH_HW else 0
|
||||
|
||||
blocked_msgs = [0xE4, 0x33D]
|
||||
for b in buss:
|
||||
for m in msgs:
|
||||
if b == bus_pt:
|
||||
fwd_bus = -1
|
||||
elif b == bus_rdr_cam:
|
||||
fwd_bus = -1 if m in blocked_msgs else bus_rdr_car
|
||||
elif b == bus_rdr_car:
|
||||
fwd_bus = bus_rdr_cam
|
||||
|
||||
# assume len 8
|
||||
self.assertEqual(fwd_bus, self.safety.safety_fwd_hook(b, make_msg(b, m, 8)))
|
||||
|
||||
|
||||
class TestHondaBoschHarnessSafety(TestHondaBoschGiraffeSafety):
|
||||
@classmethod
|
||||
def setUp(cls):
|
||||
TestHondaBoschGiraffeSafety.setUp()
|
||||
cls.safety = libpandasafety_py.libpandasafety
|
||||
cls.safety.set_safety_hooks(Panda.SAFETY_HONDA_BOSCH_HARNESS, 0)
|
||||
cls.safety.init_tests_honda()
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
|
@ -1,50 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
import unittest
|
||||
from panda import Panda
|
||||
from panda.tests.safety import libpandasafety_py
|
||||
from panda.tests.safety.common import make_msg, test_spam_can_buses
|
||||
from panda.tests.safety.test_honda import HONDA_BG_HW, HONDA_BH_HW
|
||||
|
||||
MAX_BRAKE = 255
|
||||
|
||||
H_TX_MSGS = [[0xE4, 0], [0x296, 1], [0x33D, 0]] # Bosch Harness
|
||||
G_TX_MSGS = [[0xE4, 2], [0x296, 0], [0x33D, 2]] # Bosch Giraffe
|
||||
|
||||
|
||||
class TestHondaSafety(unittest.TestCase):
|
||||
@classmethod
|
||||
def setUp(cls):
|
||||
cls.safety = libpandasafety_py.libpandasafety
|
||||
cls.safety.set_safety_hooks(Panda.SAFETY_HONDA_BOSCH_GIRAFFE, 0)
|
||||
cls.safety.init_tests_honda()
|
||||
|
||||
def test_spam_can_buses(self):
|
||||
for hw in [HONDA_BG_HW, HONDA_BH_HW]:
|
||||
self.safety.set_honda_hw(hw)
|
||||
test_spam_can_buses(self, H_TX_MSGS if hw == HONDA_BH_HW else G_TX_MSGS)
|
||||
|
||||
def test_fwd_hook(self):
|
||||
buss = range(0x0, 0x3)
|
||||
msgs = range(0x1, 0x800)
|
||||
for hw in [HONDA_BG_HW, HONDA_BH_HW]:
|
||||
self.safety.set_honda_hw(hw)
|
||||
bus_rdr_cam = 2 if hw == HONDA_BH_HW else 1
|
||||
bus_rdr_car = 0 if hw == HONDA_BH_HW else 2
|
||||
bus_pt = 1 if hw == HONDA_BH_HW else 0
|
||||
|
||||
blocked_msgs = [0xE4, 0x33D]
|
||||
for b in buss:
|
||||
for m in msgs:
|
||||
if b == bus_pt:
|
||||
fwd_bus = -1
|
||||
elif b == bus_rdr_cam:
|
||||
fwd_bus = -1 if m in blocked_msgs else bus_rdr_car
|
||||
elif b == bus_rdr_car:
|
||||
fwd_bus = bus_rdr_cam
|
||||
|
||||
# assume len 8
|
||||
self.assertEqual(fwd_bus, self.safety.safety_fwd_hook(b, make_msg(b, m, 8)))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
|
@ -41,14 +41,15 @@ def subaru_checksum(msg, addr, len_msg):
|
|||
|
||||
|
||||
class TestSubaruSafety(unittest.TestCase):
|
||||
cnt_gas = 0
|
||||
cnt_torque_driver = 0
|
||||
cnt_cruise = 0
|
||||
|
||||
@classmethod
|
||||
def setUp(cls):
|
||||
cls.safety = libpandasafety_py.libpandasafety
|
||||
cls.safety.set_safety_hooks(Panda.SAFETY_SUBARU, 0)
|
||||
cls.safety.init_tests_subaru()
|
||||
cls.cnt_gas = 0
|
||||
cls.cnt_torque_driver = 0
|
||||
cls.cnt_cruise = 0
|
||||
|
||||
def _set_prev_torque(self, t):
|
||||
self.safety.set_subaru_desired_torque_last(t)
|
||||
|
@ -61,7 +62,7 @@ class TestSubaruSafety(unittest.TestCase):
|
|||
to_send[0].RDLR = ((t & 0x7FF) << 16)
|
||||
to_send[0].RDLR |= (self.cnt_torque_driver & 0xF) << 8
|
||||
to_send[0].RDLR |= subaru_checksum(to_send, 0x119, 8)
|
||||
self.cnt_torque_driver += 1
|
||||
self.__class__.cnt_torque_driver += 1
|
||||
else:
|
||||
to_send = make_msg(0, 0x371)
|
||||
to_send[0].RDLR = (t & 0x7) << 29
|
||||
|
@ -84,7 +85,7 @@ class TestSubaruSafety(unittest.TestCase):
|
|||
to_send[0].RDHR = gas & 0xFF
|
||||
to_send[0].RDLR |= (self.cnt_gas & 0xF) << 8
|
||||
to_send[0].RDLR |= subaru_checksum(to_send, 0x40, 8)
|
||||
self.cnt_gas += 1
|
||||
self.__class__.cnt_gas += 1
|
||||
else:
|
||||
to_send = make_msg(0, 0x140)
|
||||
to_send[0].RDLR = gas & 0xFF
|
||||
|
@ -96,7 +97,7 @@ class TestSubaruSafety(unittest.TestCase):
|
|||
to_send[0].RDHR = cruise << 9
|
||||
to_send[0].RDLR |= (self.cnt_cruise & 0xF) << 8
|
||||
to_send[0].RDLR |= subaru_checksum(to_send, 0x240, 8)
|
||||
self.cnt_cruise += 1
|
||||
self.__class__.cnt_cruise += 1
|
||||
else:
|
||||
to_send = make_msg(0, 0x144)
|
||||
to_send[0].RDHR = cruise << 17
|
||||
|
|
|
@ -61,17 +61,18 @@ def volkswagen_mqb_crc(msg, addr, len_msg):
|
|||
return volkswagen_crc_8h2f(msg_bytes[1:len_msg] + magic_pad.to_bytes(1, 'little'))
|
||||
|
||||
class TestVolkswagenMqbSafety(unittest.TestCase):
|
||||
cnt_eps_01 = 0
|
||||
cnt_esp_05 = 0
|
||||
cnt_motor_20 = 0
|
||||
cnt_acc_06 = 0
|
||||
cnt_hca_01 = 0
|
||||
cnt_gra_acc_01 = 0
|
||||
|
||||
@classmethod
|
||||
def setUp(cls):
|
||||
cls.safety = libpandasafety_py.libpandasafety
|
||||
cls.safety.set_safety_hooks(Panda.SAFETY_VOLKSWAGEN_MQB, 0)
|
||||
cls.safety.init_tests_volkswagen()
|
||||
cls.cnt_eps_01 = 0
|
||||
cls.cnt_esp_05 = 0
|
||||
cls.cnt_motor_20 = 0
|
||||
cls.cnt_acc_06 = 0
|
||||
cls.cnt_hca_01 = 0
|
||||
cls.cnt_gra_acc_01 = 0
|
||||
|
||||
def _set_prev_torque(self, t):
|
||||
self.safety.set_volkswagen_desired_torque_last(t)
|
||||
|
@ -91,7 +92,7 @@ class TestVolkswagenMqbSafety(unittest.TestCase):
|
|||
to_send[0].RDLR = (0x1 << 26) if brake else 0
|
||||
to_send[0].RDLR |= (self.cnt_esp_05 % 16) << 8
|
||||
to_send[0].RDLR |= volkswagen_mqb_crc(to_send[0], MSG_ESP_05, 8)
|
||||
self.cnt_esp_05 += 1
|
||||
self.__class__.cnt_esp_05 += 1
|
||||
return to_send
|
||||
|
||||
# Driver steering input torque
|
||||
|
@ -103,7 +104,7 @@ class TestVolkswagenMqbSafety(unittest.TestCase):
|
|||
to_send[0].RDHR |= 0x1 << 23
|
||||
to_send[0].RDLR |= (self.cnt_eps_01 % 16) << 8
|
||||
to_send[0].RDLR |= volkswagen_mqb_crc(to_send[0], MSG_EPS_01, 8)
|
||||
self.cnt_eps_01 += 1
|
||||
self.__class__.cnt_eps_01 += 1
|
||||
return to_send
|
||||
|
||||
# openpilot steering output torque
|
||||
|
@ -115,7 +116,7 @@ class TestVolkswagenMqbSafety(unittest.TestCase):
|
|||
to_send[0].RDLR |= 0x1 << 31
|
||||
to_send[0].RDLR |= (self.cnt_hca_01 % 16) << 8
|
||||
to_send[0].RDLR |= volkswagen_mqb_crc(to_send[0], MSG_HCA_01, 8)
|
||||
self.cnt_hca_01 += 1
|
||||
self.__class__.cnt_hca_01 += 1
|
||||
return to_send
|
||||
|
||||
# ACC engagement status
|
||||
|
@ -124,7 +125,7 @@ class TestVolkswagenMqbSafety(unittest.TestCase):
|
|||
to_send[0].RDHR = (status & 0x7) << 28
|
||||
to_send[0].RDLR |= (self.cnt_acc_06 % 16) << 8
|
||||
to_send[0].RDLR |= volkswagen_mqb_crc(to_send[0], MSG_ACC_06, 8)
|
||||
self.cnt_acc_06 += 1
|
||||
self.__class__.cnt_acc_06 += 1
|
||||
return to_send
|
||||
|
||||
# Driver throttle input
|
||||
|
@ -133,7 +134,7 @@ class TestVolkswagenMqbSafety(unittest.TestCase):
|
|||
to_send[0].RDLR = (gas & 0xFF) << 12
|
||||
to_send[0].RDLR |= (self.cnt_motor_20 % 16) << 8
|
||||
to_send[0].RDLR |= volkswagen_mqb_crc(to_send[0], MSG_MOTOR_20, 8)
|
||||
self.cnt_motor_20 += 1
|
||||
self.__class__.cnt_motor_20 += 1
|
||||
return to_send
|
||||
|
||||
# Cruise control buttons
|
||||
|
@ -142,7 +143,7 @@ class TestVolkswagenMqbSafety(unittest.TestCase):
|
|||
to_send[0].RDLR = 1 << bit
|
||||
to_send[0].RDLR |= (self.cnt_gra_acc_01 % 16) << 8
|
||||
to_send[0].RDLR |= volkswagen_mqb_crc(to_send[0], MSG_GRA_ACC_01, 8)
|
||||
self.cnt_gra_acc_01 += 1
|
||||
self.__class__.cnt_gra_acc_01 += 1
|
||||
return to_send
|
||||
|
||||
def test_spam_can_buses(self):
|
||||
|
@ -368,10 +369,10 @@ class TestVolkswagenMqbSafety(unittest.TestCase):
|
|||
# counter
|
||||
# reset wrong_counters to zero by sending valid messages
|
||||
for i in range(MAX_WRONG_COUNTERS + 1):
|
||||
self.cnt_eps_01 = 0
|
||||
self.cnt_esp_05 = 0
|
||||
self.cnt_motor_20 = 0
|
||||
self.cnt_acc_06 = 0
|
||||
self.__class__.cnt_eps_01 += 1
|
||||
self.__class__.cnt_esp_05 += 1
|
||||
self.__class__.cnt_motor_20 += 1
|
||||
self.__class__.cnt_acc_06 += 1
|
||||
if i < MAX_WRONG_COUNTERS:
|
||||
self.safety.set_controls_allowed(1)
|
||||
self.safety.safety_rx_hook(self._eps_01_msg(0))
|
||||
|
|
Loading…
Reference in New Issue