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.
90 lines
2.7 KiB
90 lines
2.7 KiB
#!/usr/bin/env python3
|
|
import unittest
|
|
|
|
from opendbc.car.structs import CarParams
|
|
from opendbc.safety.tests.libsafety import libsafety_py
|
|
import opendbc.safety.tests.common as common
|
|
from opendbc.safety.tests.common import CANPackerPanda
|
|
|
|
LANE_KEEP_ASSIST = 0x3F2
|
|
|
|
|
|
class TestPsaSafetyBase(common.PandaCarSafetyTest, common.AngleSteeringSafetyTest):
|
|
RELAY_MALFUNCTION_ADDRS = {0: (LANE_KEEP_ASSIST,)}
|
|
FWD_BLACKLISTED_ADDRS = {2: [LANE_KEEP_ASSIST]}
|
|
TX_MSGS = [[1010, 0]]
|
|
|
|
MAIN_BUS = 0
|
|
ADAS_BUS = 1
|
|
CAM_BUS = 2
|
|
|
|
STEER_ANGLE_MAX = 390
|
|
DEG_TO_CAN = 10
|
|
|
|
ANGLE_RATE_BP = [0., 5., 25.]
|
|
ANGLE_RATE_UP = [2.5, 1.5, .2]
|
|
ANGLE_RATE_DOWN = [5., 2., .3]
|
|
|
|
def setUp(self):
|
|
self.packer = CANPackerPanda("psa_aee2010_r3")
|
|
self.safety = libsafety_py.libsafety
|
|
self.safety.set_safety_hooks(CarParams.SafetyModel.psa, 0)
|
|
self.safety.init_tests()
|
|
|
|
def _angle_cmd_msg(self, angle: float, enabled: bool):
|
|
values = {"SET_ANGLE": angle, "TORQUE_FACTOR": 100 if enabled else 0}
|
|
return self.packer.make_can_msg_panda("LANE_KEEP_ASSIST", self.MAIN_BUS, values)
|
|
|
|
def _angle_meas_msg(self, angle: float):
|
|
values = {"ANGLE": angle}
|
|
return self.packer.make_can_msg_panda("STEERING_ALT", self.MAIN_BUS, values)
|
|
|
|
def _pcm_status_msg(self, enable):
|
|
values = {"RVV_ACC_ACTIVATION_REQ": enable}
|
|
return self.packer.make_can_msg_panda("HS2_DAT_MDD_CMD_452", self.ADAS_BUS, values)
|
|
|
|
def _speed_msg(self, speed):
|
|
values = {"VITESSE_VEHICULE_ROUES": speed * 3.6}
|
|
return self.packer.make_can_msg_panda("HS2_DYN_ABR_38D", self.MAIN_BUS, values)
|
|
|
|
def _user_brake_msg(self, brake):
|
|
values = {"P013_MainBrake": brake}
|
|
return self.packer.make_can_msg_panda("Dat_BSI", self.CAM_BUS, values)
|
|
|
|
def _user_gas_msg(self, gas):
|
|
values = {"P002_Com_rAPP": int(gas * 100)}
|
|
return self.packer.make_can_msg_panda("Dyn_CMM", self.MAIN_BUS, values)
|
|
|
|
def test_rx_hook(self):
|
|
# speed
|
|
for _ in range(10):
|
|
self.assertTrue(self._rx(self._speed_msg(0)))
|
|
msg = self._speed_msg(0)
|
|
# invalidate checksum
|
|
msg[0].data[5] = 0x00
|
|
self.assertFalse(self._rx(msg))
|
|
|
|
# cruise
|
|
for _ in range(10):
|
|
self.assertTrue(self._rx(self._pcm_status_msg(0)))
|
|
msg = self._pcm_status_msg(0)
|
|
# invalidate checksum
|
|
msg[0].data[5] = 0x00
|
|
self.assertFalse(self._rx(msg))
|
|
msg = self._pcm_status_msg(0)
|
|
# write to unused payload byte
|
|
msg[0].data[6] = 0xAB
|
|
self.assertTrue(self._rx(msg))
|
|
|
|
|
|
class TestPsaStockSafety(TestPsaSafetyBase):
|
|
|
|
def setUp(self):
|
|
self.packer = CANPackerPanda("psa_aee2010_r3")
|
|
self.safety = libsafety_py.libsafety
|
|
self.safety.set_safety_hooks(CarParams.SafetyModel.psa, 0)
|
|
self.safety.init_tests()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|
|
|