You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
6.2 KiB
185 lines
6.2 KiB
#!/usr/bin/env python2
|
|
import unittest
|
|
import numpy as np
|
|
import libpandasafety_py
|
|
|
|
|
|
class TestHondaSafety(unittest.TestCase):
|
|
@classmethod
|
|
def setUp(cls):
|
|
cls.safety = libpandasafety_py.libpandasafety
|
|
cls.safety.honda_init(0)
|
|
cls.safety.init_tests_honda()
|
|
|
|
def _speed_msg(self, speed):
|
|
to_send = libpandasafety_py.ffi.new('CAN_FIFOMailBox_TypeDef *')
|
|
to_send[0].RIR = 0x158 << 21
|
|
to_send[0].RDLR = speed
|
|
|
|
return to_send
|
|
|
|
def _button_msg(self, buttons, msg):
|
|
to_send = libpandasafety_py.ffi.new('CAN_FIFOMailBox_TypeDef *')
|
|
to_send[0].RIR = msg << 21
|
|
to_send[0].RDLR = buttons << 5
|
|
|
|
return to_send
|
|
|
|
def _brake_msg(self, brake):
|
|
to_send = libpandasafety_py.ffi.new('CAN_FIFOMailBox_TypeDef *')
|
|
to_send[0].RIR = 0x17C << 21
|
|
to_send[0].RDHR = 0x200000 if brake else 0
|
|
|
|
return to_send
|
|
|
|
def _alt_brake_msg(self, brake):
|
|
to_send = libpandasafety_py.ffi.new('CAN_FIFOMailBox_TypeDef *')
|
|
to_send[0].RIR = 0x1BE << 21
|
|
to_send[0].RDLR = 0x10 if brake else 0
|
|
|
|
return to_send
|
|
|
|
def _gas_msg(self, gas):
|
|
to_send = libpandasafety_py.ffi.new('CAN_FIFOMailBox_TypeDef *')
|
|
to_send[0].RIR = 0x17C << 21
|
|
to_send[0].RDLR = 1 if gas else 0
|
|
|
|
return to_send
|
|
|
|
def _send_brake_msg(self, brake):
|
|
to_send = libpandasafety_py.ffi.new('CAN_FIFOMailBox_TypeDef *')
|
|
to_send[0].RIR = 0x1FA << 21
|
|
to_send[0].RDLR = brake
|
|
|
|
return to_send
|
|
|
|
def _send_gas_msg(self, gas):
|
|
to_send = libpandasafety_py.ffi.new('CAN_FIFOMailBox_TypeDef *')
|
|
to_send[0].RIR = 0x200 << 21
|
|
to_send[0].RDLR = gas
|
|
|
|
return to_send
|
|
|
|
def _send_steer_msg(self, steer):
|
|
to_send = libpandasafety_py.ffi.new('CAN_FIFOMailBox_TypeDef *')
|
|
to_send[0].RIR = 0xE4 << 21
|
|
to_send[0].RDLR = steer
|
|
|
|
return to_send
|
|
|
|
def test_default_controls_not_allowed(self):
|
|
self.assertFalse(self.safety.get_controls_allowed())
|
|
|
|
def test_resume_button(self):
|
|
RESUME_BTN = 4
|
|
self.safety.set_controls_allowed(0)
|
|
self.safety.honda_rx_hook(self._button_msg(RESUME_BTN, 0x1A6))
|
|
self.assertTrue(self.safety.get_controls_allowed())
|
|
|
|
def test_set_button(self):
|
|
SET_BTN = 3
|
|
self.safety.set_controls_allowed(0)
|
|
self.safety.honda_rx_hook(self._button_msg(SET_BTN, 0x1A6))
|
|
self.assertTrue(self.safety.get_controls_allowed())
|
|
|
|
def test_cancel_button(self):
|
|
CANCEL_BTN = 2
|
|
self.safety.set_controls_allowed(1)
|
|
self.safety.honda_rx_hook(self._button_msg(CANCEL_BTN, 0x1A6))
|
|
self.assertFalse(self.safety.get_controls_allowed())
|
|
|
|
def test_sample_speed(self):
|
|
self.assertEqual(0, self.safety.get_ego_speed())
|
|
self.safety.honda_rx_hook(self._speed_msg(100))
|
|
self.assertEqual(100, self.safety.get_ego_speed())
|
|
|
|
def test_prev_brake(self):
|
|
self.assertFalse(self.safety.get_brake_prev())
|
|
self.safety.honda_rx_hook(self._brake_msg(True))
|
|
self.assertTrue(self.safety.get_brake_prev())
|
|
|
|
def test_disengage_on_brake(self):
|
|
self.safety.set_controls_allowed(1)
|
|
self.safety.honda_rx_hook(self._brake_msg(1))
|
|
self.assertFalse(self.safety.get_controls_allowed())
|
|
|
|
def test_alt_disengage_on_brake(self):
|
|
self.safety.set_honda_alt_brake_msg(1)
|
|
self.safety.set_controls_allowed(1)
|
|
self.safety.honda_rx_hook(self._alt_brake_msg(1))
|
|
self.assertFalse(self.safety.get_controls_allowed())
|
|
|
|
self.safety.set_honda_alt_brake_msg(0)
|
|
self.safety.set_controls_allowed(1)
|
|
self.safety.honda_rx_hook(self._alt_brake_msg(1))
|
|
self.assertTrue(self.safety.get_controls_allowed())
|
|
|
|
def test_allow_brake_at_zero_speed(self):
|
|
# Brake was already pressed
|
|
self.safety.honda_rx_hook(self._brake_msg(True))
|
|
self.safety.set_controls_allowed(1)
|
|
|
|
self.safety.honda_rx_hook(self._brake_msg(True))
|
|
self.assertTrue(self.safety.get_controls_allowed())
|
|
self.safety.honda_rx_hook(self._brake_msg(False)) # reset no brakes
|
|
|
|
def test_not_allow_brake_when_moving(self):
|
|
# Brake was already pressed
|
|
self.safety.honda_rx_hook(self._brake_msg(True))
|
|
self.safety.honda_rx_hook(self._speed_msg(100))
|
|
self.safety.set_controls_allowed(1)
|
|
|
|
self.safety.honda_rx_hook(self._brake_msg(True))
|
|
self.assertFalse(self.safety.get_controls_allowed())
|
|
|
|
def test_prev_gas(self):
|
|
self.assertFalse(self.safety.get_gas_prev())
|
|
self.safety.honda_rx_hook(self._gas_msg(True))
|
|
self.assertTrue(self.safety.get_gas_prev())
|
|
|
|
def test_disengage_on_gas(self):
|
|
self.safety.set_controls_allowed(1)
|
|
self.safety.honda_rx_hook(self._gas_msg(1))
|
|
self.assertFalse(self.safety.get_controls_allowed())
|
|
|
|
def test_allow_engage_with_gas_pressed(self):
|
|
self.safety.honda_rx_hook(self._gas_msg(1))
|
|
self.safety.set_controls_allowed(1)
|
|
self.safety.honda_rx_hook(self._gas_msg(1))
|
|
self.assertTrue(self.safety.get_controls_allowed())
|
|
|
|
def test_brake_safety_check(self):
|
|
self.assertTrue(self.safety.honda_tx_hook(self._send_brake_msg(0x0000)))
|
|
self.assertFalse(self.safety.honda_tx_hook(self._send_brake_msg(0x1000)))
|
|
|
|
self.safety.set_controls_allowed(1)
|
|
self.assertTrue(self.safety.honda_tx_hook(self._send_brake_msg(0x1000)))
|
|
self.assertFalse(self.safety.honda_tx_hook(self._send_brake_msg(0x00F0)))
|
|
|
|
def test_gas_safety_check(self):
|
|
self.safety.set_controls_allowed(0)
|
|
self.assertTrue(self.safety.honda_tx_hook(self._send_gas_msg(0x0000)))
|
|
self.assertFalse(self.safety.honda_tx_hook(self._send_gas_msg(0x1000)))
|
|
|
|
def test_steer_safety_check(self):
|
|
self.safety.set_controls_allowed(0)
|
|
self.assertTrue(self.safety.honda_tx_hook(self._send_steer_msg(0x0000)))
|
|
self.assertFalse(self.safety.honda_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
|
|
self.safety.set_bosch_hardware(1)
|
|
self.safety.set_controls_allowed(0)
|
|
self.assertTrue(self.safety.honda_tx_hook(self._button_msg(CANCEL_BTN, BUTTON_MSG)))
|
|
self.assertFalse(self.safety.honda_tx_hook(self._button_msg(RESUME_BTN, BUTTON_MSG)))
|
|
self.assertFalse(self.safety.honda_tx_hook(self._button_msg(SET_BTN, BUTTON_MSG)))
|
|
# do not block resume if we are engaged already
|
|
self.safety.set_controls_allowed(1)
|
|
self.assertTrue(self.safety.honda_tx_hook(self._button_msg(RESUME_BTN, BUTTON_MSG)))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|
|
|