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.
70 lines
2.8 KiB
70 lines
2.8 KiB
#!/usr/bin/env python3
|
|
import unittest
|
|
|
|
from opendbc.car.structs import CarParams
|
|
import opendbc.safety.tests.common as common
|
|
from opendbc.safety.tests.libsafety import libsafety_py
|
|
from opendbc.safety.tests.common import CANPackerPanda
|
|
|
|
|
|
class TestBody(common.PandaSafetyTest):
|
|
TX_MSGS = [[0x250, 0], [0x251, 0], [0x350, 0], [0x351, 0],
|
|
[0x1, 0], [0x1, 1], [0x1, 2], [0x1, 3]]
|
|
FWD_BUS_LOOKUP = {}
|
|
|
|
def setUp(self):
|
|
self.packer = CANPackerPanda("comma_body")
|
|
self.safety = libsafety_py.libsafety
|
|
self.safety.set_safety_hooks(CarParams.SafetyModel.body, 0)
|
|
self.safety.init_tests()
|
|
|
|
def _motors_data_msg(self, speed_l, speed_r):
|
|
values = {"SPEED_L": speed_l, "SPEED_R": speed_r}
|
|
return self.packer.make_can_msg_panda("MOTORS_DATA", 0, values)
|
|
|
|
def _torque_cmd_msg(self, torque_l, torque_r):
|
|
values = {"TORQUE_L": torque_l, "TORQUE_R": torque_r}
|
|
return self.packer.make_can_msg_panda("TORQUE_CMD", 0, values)
|
|
|
|
def _knee_torque_cmd_msg(self, torque_l, torque_r):
|
|
values = {"TORQUE_L": torque_l, "TORQUE_R": torque_r}
|
|
return self.packer.make_can_msg_panda("KNEE_TORQUE_CMD", 0, values)
|
|
|
|
def _max_motor_rpm_cmd_msg(self, max_rpm_l, max_rpm_r):
|
|
values = {"MAX_RPM_L": max_rpm_l, "MAX_RPM_R": max_rpm_r}
|
|
return self.packer.make_can_msg_panda("MAX_MOTOR_RPM_CMD", 0, values)
|
|
|
|
def test_rx_hook(self):
|
|
self.assertFalse(self.safety.get_controls_allowed())
|
|
self.assertFalse(self.safety.get_vehicle_moving())
|
|
|
|
# controls allowed and vehicle moving when we get MOTORS_DATA message
|
|
self.assertTrue(self._rx(self._torque_cmd_msg(0, 0)))
|
|
self.assertFalse(self.safety.get_vehicle_moving())
|
|
self.assertFalse(self.safety.get_controls_allowed())
|
|
|
|
self.assertTrue(self._rx(self._motors_data_msg(0, 0)))
|
|
self.assertTrue(self.safety.get_vehicle_moving()) # always moving
|
|
self.assertTrue(self.safety.get_controls_allowed())
|
|
|
|
def test_tx_hook(self):
|
|
self.assertFalse(self._tx(self._torque_cmd_msg(0, 0)))
|
|
self.assertFalse(self._tx(self._knee_torque_cmd_msg(0, 0)))
|
|
self.safety.set_controls_allowed(True)
|
|
self.assertTrue(self._tx(self._torque_cmd_msg(0, 0)))
|
|
self.assertTrue(self._tx(self._knee_torque_cmd_msg(0, 0)))
|
|
|
|
def test_can_flasher(self):
|
|
# CAN flasher always allowed
|
|
self.safety.set_controls_allowed(False)
|
|
self.assertTrue(self._tx(common.make_msg(0, 0x1, 8)))
|
|
|
|
# 0xdeadfaceU enters CAN flashing mode for base & knee
|
|
for addr in (0x250, 0x350):
|
|
self.assertTrue(self._tx(common.make_msg(0, addr, dat=b'\xce\xfa\xad\xde\x1e\x0b\xb0\x0a')))
|
|
self.assertFalse(self._tx(common.make_msg(0, addr, dat=b'\xce\xfa\xad\xde\x1e\x0b\xb0'))) # not correct data/len
|
|
self.assertFalse(self._tx(common.make_msg(0, addr + 1, dat=b'\xce\xfa\xad\xde\x1e\x0b\xb0\x0a'))) # wrong address
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|
|
|