# functions common among cars
from common . numpy_fast import clip
def dbc_dict ( pt_dbc , radar_dbc , chassis_dbc = None ) :
return { ' pt ' : pt_dbc , ' radar ' : radar_dbc , ' chassis ' : chassis_dbc }
def apply_std_steer_torque_limits ( apply_torque , apply_torque_last , driver_torque , LIMITS ) :
# limits due to driver torque
driver_max_torque = LIMITS . STEER_MAX + ( LIMITS . STEER_DRIVER_ALLOWANCE + driver_torque * LIMITS . STEER_DRIVER_FACTOR ) * LIMITS . STEER_DRIVER_MULTIPLIER
driver_min_torque = - LIMITS . STEER_MAX + ( - LIMITS . STEER_DRIVER_ALLOWANCE + driver_torque * LIMITS . STEER_DRIVER_FACTOR ) * LIMITS . STEER_DRIVER_MULTIPLIER
max_steer_allowed = max ( min ( LIMITS . STEER_MAX , driver_max_torque ) , 0 )
min_steer_allowed = min ( max ( - LIMITS . STEER_MAX , driver_min_torque ) , 0 )
apply_torque = clip ( apply_torque , min_steer_allowed , max_steer_allowed )
# slow rate if steer torque increases in magnitude
if apply_torque_last > 0 :
apply_torque = clip ( apply_torque , max ( apply_torque_last - LIMITS . STEER_DELTA_DOWN , - LIMITS . STEER_DELTA_UP ) ,
apply_torque_last + LIMITS . STEER_DELTA_UP )
else :
apply_torque = clip ( apply_torque , apply_torque_last - LIMITS . STEER_DELTA_UP ,
min ( apply_torque_last + LIMITS . STEER_DELTA_DOWN , LIMITS . STEER_DELTA_UP ) )
return int ( round ( apply_torque ) )
def apply_toyota_steer_torque_limits ( apply_torque , apply_torque_last , motor_torque , LIMITS ) :
# limits due to comparison of commanded torque VS motor reported torque
max_lim = min ( max ( motor_torque + LIMITS . STEER_ERROR_MAX , LIMITS . STEER_ERROR_MAX ) , LIMITS . STEER_MAX )
min_lim = max ( min ( motor_torque - LIMITS . STEER_ERROR_MAX , - LIMITS . STEER_ERROR_MAX ) , - LIMITS . STEER_MAX )
apply_torque = clip ( apply_torque , min_lim , max_lim )
# slow rate if steer torque increases in magnitude
if apply_torque_last > 0 :
apply_torque = clip ( apply_torque ,
max ( apply_torque_last - LIMITS . STEER_DELTA_DOWN , - LIMITS . STEER_DELTA_UP ) ,
apply_torque_last + LIMITS . STEER_DELTA_UP )
else :
apply_torque = clip ( apply_torque ,
apply_torque_last - LIMITS . STEER_DELTA_UP ,
min ( apply_torque_last + LIMITS . STEER_DELTA_DOWN , LIMITS . STEER_DELTA_UP ) )
return int ( round ( apply_torque ) )
def crc8_pedal ( data ) :
crc = 0xFF # standard init value
poly = 0xD5 # standard crc8: x8+x7+x6+x4+x2+1
size = len ( data )
for i in range ( size - 1 , - 1 , - 1 ) :
crc ^ = data [ i ]
for j in range ( 8 ) :
if ( ( crc & 0x80 ) != 0 ) :
crc = ( ( crc << 1 ) ^ poly ) & 0xFF
else :
crc << = 1
return crc
def create_gas_command ( packer , gas_amount , idx ) :
# Common gas pedal msg generator
enable = gas_amount > 0.001
values = {
" ENABLE " : enable ,
" COUNTER_PEDAL " : idx & 0xF ,
}
if enable :
values [ " GAS_COMMAND " ] = gas_amount * 255.
values [ " GAS_COMMAND2 " ] = gas_amount * 255.
dat = packer . make_can_msg ( " GAS_COMMAND " , 0 , values ) [ 2 ]
dat = [ ord ( i ) for i in dat ]
checksum = crc8_pedal ( dat [ : - 1 ] )
values [ " CHECKSUM_PEDAL " ] = checksum
return packer . make_can_msg ( " GAS_COMMAND " , 0 , values )