#!/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
class TestMazdaSafety ( common . PandaCarSafetyTest , common . DriverTorqueSteeringSafetyTest ) :
TX_MSGS = [ [ 0x243 , 0 ] , [ 0x09d , 0 ] , [ 0x440 , 0 ] ]
STANDSTILL_THRESHOLD = .1
RELAY_MALFUNCTION_ADDRS = { 0 : ( 0x243 , 0x440 ) }
FWD_BLACKLISTED_ADDRS = { 2 : [ 0x243 , 0x440 ] }
MAX_RATE_UP = 10
MAX_RATE_DOWN = 25
MAX_TORQUE_LOOKUP = [ 0 ] , [ 800 ]
MAX_RT_DELTA = 300
DRIVER_TORQUE_ALLOWANCE = 15
DRIVER_TORQUE_FACTOR = 1
# Mazda actually does not set any bit when requesting torque
NO_STEER_REQ_BIT = True
def setUp ( self ) :
self . packer = CANPackerPanda ( " mazda_2017 " )
self . safety = libsafety_py . libsafety
self . safety . set_safety_hooks ( CarParams . SafetyModel . mazda , 0 )
self . safety . init_tests ( )
def _torque_meas_msg ( self , torque ) :
values = { " STEER_TORQUE_MOTOR " : torque }
return self . packer . make_can_msg_panda ( " STEER_TORQUE " , 0 , values )
def _torque_driver_msg ( self , torque ) :
values = { " STEER_TORQUE_SENSOR " : torque }
return self . packer . make_can_msg_panda ( " STEER_TORQUE " , 0 , values )
def _torque_cmd_msg ( self , torque , steer_req = 1 ) :
values = { " LKAS_REQUEST " : torque }
return self . packer . make_can_msg_panda ( " CAM_LKAS " , 0 , values )
def _speed_msg ( self , speed ) :
values = { " SPEED " : speed }
return self . packer . make_can_msg_panda ( " ENGINE_DATA " , 0 , values )
def _user_brake_msg ( self , brake ) :
values = { " BRAKE_ON " : brake }
return self . packer . make_can_msg_panda ( " PEDALS " , 0 , values )
def _user_gas_msg ( self , gas ) :
values = { " PEDAL_GAS " : gas }
return self . packer . make_can_msg_panda ( " ENGINE_DATA " , 0 , values )
def _pcm_status_msg ( self , enable ) :
values = { " CRZ_ACTIVE " : enable }
return self . packer . make_can_msg_panda ( " CRZ_CTRL " , 0 , values )
def _button_msg ( self , resume = False , cancel = False ) :
values = {
" CAN_OFF " : cancel ,
" CAN_OFF_INV " : ( cancel + 1 ) % 2 ,
" RES " : resume ,
" RES_INV " : ( resume + 1 ) % 2 ,
}
return self . packer . make_can_msg_panda ( " CRZ_BTNS " , 0 , values )
def test_buttons ( self ) :
# only cancel allows while controls not allowed
self . safety . set_controls_allowed ( 0 )
self . assertTrue ( self . _tx ( self . _button_msg ( cancel = True ) ) )
self . assertFalse ( self . _tx ( self . _button_msg ( resume = True ) ) )
# do not block resume if we are engaged already
self . safety . set_controls_allowed ( 1 )
self . assertTrue ( self . _tx ( self . _button_msg ( cancel = True ) ) )
self . assertTrue ( self . _tx ( self . _button_msg ( resume = True ) ) )
if __name__ == " __main__ " :
unittest . main ( )