from selfdrive . car . mazda import mazdacan
from selfdrive . car . mazda . values import SteerLimitParams , Buttons
from opendbc . can . packer import CANPacker
from selfdrive . car import apply_std_steer_torque_limits
class CarController ( ) :
def __init__ ( self , dbc_name , CP , VM ) :
self . apply_steer_last = 0
self . packer = CANPacker ( dbc_name )
self . steer_rate_limited = False
def update ( self , enabled , CS , frame , actuators ) :
""" Controls thread """
can_sends = [ ]
### STEER ###
if enabled :
# calculate steer and also set limits due to driver torque
new_steer = int ( round ( actuators . steer * SteerLimitParams . STEER_MAX ) )
apply_steer = apply_std_steer_torque_limits ( new_steer , self . apply_steer_last ,
CS . out . steeringTorque , SteerLimitParams )
self . steer_rate_limited = new_steer != apply_steer
if CS . out . standstill and frame % 50 == 0 :
# Mazda Stop and Go requires a RES button (or gas) press if the car stops more than 3 seconds
# Send Resume button at 2hz if we're engaged at standstill to support full stop and go!
# TODO: improve the resume trigger logic by looking at actual radar data
can_sends . append ( mazdacan . create_button_cmd ( self . packer , CS . CP . carFingerprint , Buttons . RESUME ) )
else :
apply_steer = 0
self . steer_rate_limited = False
if CS . out . cruiseState . enabled and frame % 10 == 0 :
# Cancel Stock ACC if it's enabled while OP is disengaged
# Match stock message rate which is sent at 10hz
can_sends . append ( mazdacan . create_button_cmd ( self . packer , CS . CP . carFingerprint , Buttons . CANCEL ) )
self . apply_steer_last = apply_steer
can_sends . append ( mazdacan . create_steering_control ( self . packer , CS . CP . carFingerprint ,
frame , apply_steer , CS . cam_lkas ) )
return can_sends