@ -1,3 +1,4 @@ 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					from  cereal  import  car  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					from  opendbc . can . parser  import  CANParser  
					 
					 
					 
					from  opendbc . can . parser  import  CANParser  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					from  common . numpy_fast  import  mean  
					 
					 
					 
					from  common . numpy_fast  import  mean  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					from  selfdrive . config  import  Conversions  as  CV  
					 
					 
					 
					from  selfdrive . config  import  Conversions  as  CV  
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -34,28 +35,26 @@ def get_can_parser(CP): 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					class  CarState ( CarStateBase ) :  
					 
					 
					 
					class  CarState ( CarStateBase ) :  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  def  update ( self ,  cp ) :   
					 
					 
					 
					  def  update ( self ,  cp ) :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # update prevs, update must run once per loop   
					 
					 
					 
					    ret  =  car . CarState . new_message ( )   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . prev_left_blinker_on  =  self . left_blinker_on   
					 
					 
					 
					    ret . wheelSpeeds . rr  =  cp . vl [ " WheelSpeed_CG1 " ] [ ' WhlRr_W_Meas ' ]  *  WHEEL_RADIUS   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . prev_right_blinker_on  =  self . right_blinker_on   
					 
					 
					 
					    ret . wheelSpeeds . rl  =  cp . vl [ " WheelSpeed_CG1 " ] [ ' WhlRl_W_Meas ' ]  *  WHEEL_RADIUS   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					
  
					 
					 
					 
					    ret . wheelSpeeds . fr  =  cp . vl [ " WheelSpeed_CG1 " ] [ ' WhlFr_W_Meas ' ]  *  WHEEL_RADIUS   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    # calc best v_ego estimate, by averaging two opposite corners   
					 
					 
					 
					    ret . wheelSpeeds . fl  =  cp . vl [ " WheelSpeed_CG1 " ] [ ' WhlFl_W_Meas ' ]  *  WHEEL_RADIUS   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . v_wheel_fl  =  cp . vl [ " WheelSpeed_CG1 " ] [ ' WhlRr_W_Meas ' ]  *  WHEEL_RADIUS   
					 
					 
					 
					    ret . vEgoRaw  =  mean ( [ ret . wheelSpeeds . rr ,  ret . wheelSpeeds . rl ,  ret . wheelSpeeds . fr ,  ret . wheelSpeeds . fl ] )   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . v_wheel_fr  =  cp . vl [ " WheelSpeed_CG1 " ] [ ' WhlRl_W_Meas ' ]  *  WHEEL_RADIUS   
					 
					 
					 
					    ret . vEgo ,  ret . aEgo  =  self . update_speed_kf ( ret . vEgoRaw )   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . v_wheel_rl  =  cp . vl [ " WheelSpeed_CG1 " ] [ ' WhlFr_W_Meas ' ]  *  WHEEL_RADIUS   
					 
					 
					 
					    ret . standstill  =  not  ret . vEgoRaw  >  0.001   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . v_wheel_rr   =  cp . vl [ " WheelSpeed _CG1" ] [ ' WhlFl_W_Mea s' ]  *  WHEEL_RADIUS    
					 
					 
					 
					    ret . steeringAngle   =  cp . vl [ " Steering_Wheel_Data _CG1" ] [ ' SteWhlRelInit_An_Sn s' ]   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . v_ego_raw  =  mean ( [ self . v_wheel_fl ,  self . v_wheel_fr ,  self . v_wheel_rl ,  self . v_wheel_rr ] )   
					 
					 
					 
					    ret . steeringPressed  =  not  cp . vl [ " Lane_Keep_Assist_Status " ] [ ' LaHandsOff_B_Actl ' ]   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . v_ego ,  self . a_ego  =  self . update_speed_kf ( self . v_ego_raw )   
					 
					 
					 
					    ret . cruiseState . speed  =  cp . vl [ " Cruise_Status " ] [ ' Set_Speed ' ]  *  CV . MPH_TO_MS   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . standstill  =  not  self . v_ego_raw  >  0.001   
					 
					 
					 
					    ret . cruiseState . enabled  =  not  ( cp . vl [ " Cruise_Status " ] [ ' Cruise_State ' ]  in  [ 0 ,  3 ] )   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					
  
					 
					 
					 
					    ret . cruiseState . available  =  cp . vl [ " Cruise_Status " ] [ ' Cruise_State ' ]  !=  0   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . angle_steer s  =  cp . vl [ " Steering_Wheel_Data_CG1 " ] [ ' SteWhlRelInit_An_Sns ' ]   
					 
					 
					 
					    ret . ga s  =  cp . vl [ " EngineData_14 " ] [ ' ApedPosScal_Pc_Actl ' ]  /  100.    
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . v_cruise_pcm  =  cp . vl [ " Cruise_Status " ] [ ' Set_Speed ' ]  *  CV . MPH_TO_MS   
					 
					 
					 
					    ret . gasPressed  =  ret . gas  >  1e-6   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . pcm_acc_status  =  cp . vl [ " Cruise_Status " ] [ ' Cruise_State ' ]   
					 
					 
					 
					    ret . brakePressed  =  bool ( cp . vl [ " Cruise_Status " ] [ " Brake_Drv_Appl " ] )   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . main_on  =  cp . vl [ " Cruise_Status " ] [ ' Cruise_State ' ]  !=  0   
					 
					 
					 
					    ret . brakeLights  =  bool ( cp . vl [ " BCM_to_HS_Body " ] [ " Brake_Lights " ] )   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . lkas_state  =  cp . vl [ " Lane_Keep_Assist_Statu s" ] [ ' LaActAvail_D_Actl ' ]   
					 
					 
					 
					    ret . genericToggle  =  bool ( cp . vl [ " Steering_Button s" ] [ " Dist_Incr " ] )   
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					    # TODO: we also need raw driver torque, needed for Assisted Lane Change   
					 
					 
					 
					    # TODO: we also need raw driver torque, needed for Assisted Lane Change   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . steer_override  =  not   cp . vl [ " Lane_Keep_Assist_Status " ] [ ' LaHandsOff_B _Actl ' ]   
					 
					 
					 
					    self . lkas_state  =   cp . vl [ " Lane_Keep_Assist_Status " ] [ ' LaActAvail_D _Actl ' ]   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					    self . steer_error  =  cp . vl [ " Lane_Keep_Assist_Status " ] [ ' LaActDeny_B_Actl ' ]   
					 
					 
					 
					    self . steer_error  =  cp . vl [ " Lane_Keep_Assist_Status " ] [ ' LaActDeny_B_Actl ' ]   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . user_gas  =  cp . vl [ " EngineData_14 " ] [ ' ApedPosScal_Pc_Actl ' ]   
					 
					 
					 
					
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . brake_pressed  =  bool ( cp . vl [ " Cruise_Status " ] [ " Brake_Drv_Appl " ] )   
					 
					 
					 
					    return  ret   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . brake_lights  =  bool ( cp . vl [ " BCM_to_HS_Body " ] [ " Brake_Lights " ] )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . generic_toggle  =  bool ( cp . vl [ " Steering_Buttons " ] [ " Dist_Incr " ] )