@ -10,8 +10,9 @@ from opendbc.can.packer import CANPacker
VisualAlert = car . CarControl . HUDControl . VisualAlert
class CarController ( ) :
class CarController :
def __init__ ( self , dbc_name , CP , VM ) :
self . frame = 0
self . last_steer = 0
self . alert_active = False
self . last_standstill = False
@ -22,11 +23,13 @@ class CarController():
self . gas = 0
self . accel = 0
def update ( self , c , CS , frame , actuators , pcm_cancel_cmd , hud_alert ,
left_line , right_line , lead , left_lane_depart , right_lane_depart ) :
def update ( self , CC , CS ) :
actuators = CC . actuators
hud_control = CC . hudControl
pcm_cancel_cmd = CC . cruiseControl . cancel
# gas and brake
if CS . CP . enableGasInterceptor and c . longActive :
if CS . CP . enableGasInterceptor and CC . longActive :
MAX_INTERCEPTOR_GAS = 0.5
# RAV4 has very sensitive gas pedal
if CS . CP . carFingerprint in ( CAR . RAV4 , CAR . RAV4H , CAR . HIGHLANDER , CAR . HIGHLANDERH ) :
@ -49,7 +52,7 @@ class CarController():
self . steer_rate_limited = new_steer != apply_steer
# Cut steering while we're in a known fault state (2s)
if not c . latActive or CS . steer_state in ( 9 , 25 ) :
if not CC . latActive or CS . steer_state in ( 9 , 25 ) :
apply_steer = 0
apply_steer_req = 0
else :
@ -57,7 +60,7 @@ class CarController():
# TODO: probably can delete this. CS.pcm_acc_status uses a different signal
# than CS.cruiseState.enabled. confirm they're not meaningfully different
if not c . enabled and CS . pcm_acc_status :
if not CC . enabled and CS . pcm_acc_status :
pcm_cancel_cmd = 1
# on entering standstill, send standstill request
@ -78,18 +81,18 @@ class CarController():
# toyota can trace shows this message at 42Hz, with counter adding alternatively 1 and 2;
# sending it at 100Hz seem to allow a higher rate limit, as the rate limit seems imposed
# on consecutive messages
can_sends . append ( create_steer_command ( self . packer , apply_steer , apply_steer_req , frame ) )
if frame % 2 == 0 and CS . CP . carFingerprint in TSS2_CAR :
can_sends . append ( create_lta_steer_command ( self . packer , 0 , 0 , frame / / 2 ) )
can_sends . append ( create_steer_command ( self . packer , apply_steer , apply_steer_req , self . frame ) )
if self . frame % 2 == 0 and CS . CP . carFingerprint in TSS2_CAR :
can_sends . append ( create_lta_steer_command ( self . packer , 0 , 0 , self . frame / / 2 ) )
# LTA mode. Set ret.steerControlType = car.CarParams.SteerControlType.angle and whitelist 0x191 in the panda
# if frame % 2 == 0:
# can_sends.append(create_steer_command(self.packer, 0, 0, frame // 2))
# can_sends.append(create_lta_steer_command(self.packer, actuators.steeringAngleDeg, apply_steer_req, frame // 2))
# if self. frame % 2 == 0:
# can_sends.append(create_steer_command(self.packer, 0, 0, self. frame // 2))
# can_sends.append(create_lta_steer_command(self.packer, actuators.steeringAngleDeg, apply_steer_req, self. frame // 2))
# we can spam can to cancel the system even if we are using lat only control
if ( frame % 3 == 0 and CS . CP . openpilotLongitudinalControl ) or pcm_cancel_cmd :
lead = lead or CS . out . vEgo < 12. # at low speed we always assume the lead is present so ACC can be engaged
if ( self . frame % 3 == 0 and CS . CP . openpilotLongitudinalControl ) or pcm_cancel_cmd :
lead = hud_control . leadVisible or CS . out . vEgo < 12. # at low speed we always assume the lead is present so ACC can be engaged
# Lexus IS uses a different cancellation message
if pcm_cancel_cmd and CS . CP . carFingerprint in ( CAR . LEXUS_IS , CAR . LEXUS_RC ) :
@ -100,17 +103,17 @@ class CarController():
else :
can_sends . append ( create_accel_command ( self . packer , 0 , pcm_cancel_cmd , False , lead , CS . acc_type ) )
if frame % 2 == 0 and CS . CP . enableGasInterceptor and CS . CP . openpilotLongitudinalControl :
if self . frame % 2 == 0 and CS . CP . enableGasInterceptor and CS . CP . openpilotLongitudinalControl :
# send exactly zero if gas cmd is zero. Interceptor will send the max between read value and gas cmd.
# This prevents unexpected pedal range rescaling
can_sends . append ( create_gas_interceptor_command ( self . packer , interceptor_gas_cmd , frame / / 2 ) )
can_sends . append ( create_gas_interceptor_command ( self . packer , interceptor_gas_cmd , self . frame / / 2 ) )
self . gas = interceptor_gas_cmd
# ui mesg is at 1Hz but we send asap if:
# - there is something to display
# - there is something to stop displaying
fcw_alert = hud_a lert == VisualAlert . fcw
steer_alert = hud_a lert in ( VisualAlert . steerRequired , VisualAlert . ldw )
fcw_alert = hud_control . visualA lert == VisualAlert . fcw
steer_alert = hud_control . visualA lert in ( VisualAlert . steerRequired , VisualAlert . ldw )
send_ui = False
if ( ( fcw_alert or steer_alert ) and not self . alert_active ) or \
@ -121,15 +124,17 @@ class CarController():
# forcing the pcm to disengage causes a bad fault sound so play a good sound instead
send_ui = True
if ( frame % 100 == 0 or send_ui ) :
can_sends . append ( create_ui_command ( self . packer , steer_alert , pcm_cancel_cmd , left_line , right_line , left_lane_depart , right_lane_depart , c . enabled ) )
if self . frame % 100 == 0 or send_ui :
can_sends . append ( create_ui_command ( self . packer , steer_alert , pcm_cancel_cmd , hud_control . leftLaneVisible ,
hud_control . rightLaneVisible , hud_control . leftLaneDepart ,
hud_control . rightLaneDepart , CC . enabled ) )
if frame % 100 == 0 and CS . CP . enableDsu :
if self . frame % 100 == 0 and CS . CP . enableDsu :
can_sends . append ( create_fcw_command ( self . packer , fcw_alert ) )
# *** static msgs ***
for ( addr , cars , bus , fr_step , vl ) in STATIC_DSU_MSGS :
if frame % fr_step == 0 and CS . CP . enableDsu and CS . CP . carFingerprint in cars :
for addr , cars , bus , fr_step , vl in STATIC_DSU_MSGS :
if self . frame % fr_step == 0 and CS . CP . enableDsu and CS . CP . carFingerprint in cars :
can_sends . append ( make_can_msg ( addr , vl , bus ) )
new_actuators = actuators . copy ( )
@ -137,4 +142,5 @@ class CarController():
new_actuators . accel = self . accel
new_actuators . gas = self . gas
self . frame + = 1
return new_actuators , can_sends