@ -6,8 +6,6 @@ from selfdrive.modeld.constants import T_IDXS 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					LongCtrlState  =  log . ControlsState . LongControlState  
					 
					 
					 
					LongCtrlState  =  log . ControlsState . LongControlState  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					ACCEL_MAX  =  2.0  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					ACCEL_MIN  =  - 4.0  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					STOPPING_EGO_SPEED  =  0.5  
					 
					 
					 
					STOPPING_EGO_SPEED  =  0.5  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					STOPPING_TARGET_SPEED_OFFSET  =  0.01  
					 
					 
					 
					STOPPING_TARGET_SPEED_OFFSET  =  0.01  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					STARTING_TARGET_SPEED  =  0.5  
					 
					 
					 
					STARTING_TARGET_SPEED  =  0.5  
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -63,8 +61,6 @@ class LongControl(): 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					                            ( CP . longitudinalTuning . kiBP ,  CP . longitudinalTuning . kiV ) ,   
					 
					 
					 
					                            ( CP . longitudinalTuning . kiBP ,  CP . longitudinalTuning . kiV ) ,   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					                            rate = RATE ,   
					 
					 
					 
					                            rate = RATE ,   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					                            sat_limit = 0.8 )   
					 
					 
					 
					                            sat_limit = 0.8 )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . pid . pos_limit  =  ACCEL_MAX   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . pid . neg_limit  =  ACCEL_MIN   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . v_pid  =  0.0   
					 
					 
					 
					    self . v_pid  =  0.0   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . last_output_accel  =  0.0   
					 
					 
					 
					    self . last_output_accel  =  0.0   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -73,7 +69,7 @@ class LongControl(): 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . pid . reset ( )   
					 
					 
					 
					    self . pid . reset ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . v_pid  =  v_pid   
					 
					 
					 
					    self . v_pid  =  v_pid   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  def  update ( self ,  active ,  CS ,  CP ,  long_plan ) :   
					 
					 
					 
					  def  update ( self ,  active ,  CS ,  CP ,  long_plan ,  accel_limits ) :   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					    """ Update longitudinal control. This updates the state machine and runs a PID loop """   
					 
					 
					 
					    """ Update longitudinal control. This updates the state machine and runs a PID loop """   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # Interp control trajectory   
					 
					 
					 
					    # Interp control trajectory   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # TODO estimate car specific lag, use .15s for now   
					 
					 
					 
					    # TODO estimate car specific lag, use .15s for now   
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -86,6 +82,8 @@ class LongControl(): 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      v_target_future  =  0.0   
					 
					 
					 
					      v_target_future  =  0.0   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      a_target  =  0.0   
					 
					 
					 
					      a_target  =  0.0   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    self . pid . neg_limit  =  accel_limits [ 0 ]   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    self . pid . pos_limit  =  accel_limits [ 1 ]   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # Update state machine   
					 
					 
					 
					    # Update state machine   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    output_accel  =  self . last_output_accel   
					 
					 
					 
					    output_accel  =  self . last_output_accel   
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -107,8 +105,9 @@ class LongControl(): 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      # Freeze the integrator so we don't accelerate to compensate, and don't allow positive acceleration   
					 
					 
					 
					      # Freeze the integrator so we don't accelerate to compensate, and don't allow positive acceleration   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      prevent_overshoot  =  not  CP . stoppingControl  and  CS . vEgo  <  1.5  and  v_target_future  <  0.7   
					 
					 
					 
					      prevent_overshoot  =  not  CP . stoppingControl  and  CS . vEgo  <  1.5  and  v_target_future  <  0.7   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      deadzone  =  interp ( v_ego_pid ,  CP . longitudinalTuning . deadzoneBP ,  CP . longitudinalTuning . deadzoneV )   
					 
					 
					 
					      deadzone  =  interp ( v_ego_pid ,  CP . longitudinalTuning . deadzoneBP ,  CP . longitudinalTuning . deadzoneV )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      freeze_integrator  =  prevent_overshoot   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      output_accel  =  self . pid . update ( self . v_pid ,  v_ego_pid ,  speed = v_ego_pid ,  deadzone = deadzone ,  feedforward = a_target ,  freeze_integrator = prevent_overshoot )   
					 
					 
					 
					      output_accel  =  self . pid . update ( self . v_pid ,  v_ego_pid ,  speed = v_ego_pid ,  deadzone = deadzone ,  feedforward = a_target ,  freeze_integrator = freeze_integrator )   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      if  prevent_overshoot :   
					 
					 
					 
					      if  prevent_overshoot :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        output_accel  =  min ( output_accel ,  0.0 )   
					 
					 
					 
					        output_accel  =  min ( output_accel ,  0.0 )   
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -118,7 +117,7 @@ class LongControl(): 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      # Keep applying brakes until the car is stopped   
					 
					 
					 
					      # Keep applying brakes until the car is stopped   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      if  not  CS . standstill  or  output_accel  >  - DECEL_STOPPING_TARGET :   
					 
					 
					 
					      if  not  CS . standstill  or  output_accel  >  - DECEL_STOPPING_TARGET :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        output_accel  - =  CP . stoppingDecelRate  /  RATE   
					 
					 
					 
					        output_accel  - =  CP . stoppingDecelRate  /  RATE   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      output_accel  =  clip ( output_accel ,  ACCEL_MIN ,  ACCEL_MAX )   
					 
					 
					 
					      output_accel  =  clip ( output_accel ,  accel_limits [ 0 ] ,  accel_limits [ 1 ] )   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      self . reset ( CS . vEgo )   
					 
					 
					 
					      self . reset ( CS . vEgo )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -129,6 +128,6 @@ class LongControl(): 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      self . reset ( CS . vEgo )   
					 
					 
					 
					      self . reset ( CS . vEgo )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . last_output_accel  =  output_accel   
					 
					 
					 
					    self . last_output_accel  =  output_accel   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    final_accel  =  clip ( output_accel ,  ACCEL_MIN ,  ACCEL_MAX )   
					 
					 
					 
					    final_accel  =  clip ( output_accel ,  accel_limits [ 0 ] ,  accel_limits [ 1 ] )   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    return  final_accel ,  v_target ,  a_target   
					 
					 
					 
					    return  final_accel ,  v_target ,  a_target