#!/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()