@ -1,19 +1,11 @@ 
			
		
	
		
			
				
					from  cereal  import  car  
			
		
	
		
			
				
					from  collections  import  defaultdict  
			
		
	
		
			
				
					from  common . numpy_fast  import  interp  
			
		
	
		
			
				
					from  common . kalman . simple_kalman  import  KF1D  
			
		
	
		
			
				
					from  opendbc . can . can_define  import  CANDefine  
			
		
	
		
			
				
					from  opendbc . can . parser  import  CANParser  
			
		
	
		
			
				
					from  selfdrive . config  import  Conversions  as  CV  
			
		
	
		
			
				
					from  selfdrive . car . interfaces  import  CarStateBase  
			
		
	
		
			
				
					from  selfdrive . car . honda . values  import  CAR ,  DBC ,  STEER_THRESHOLD ,  SPEED_FACTOR ,  HONDA_BOSCH  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					GearShifter  =  car . CarState . GearShifter  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					def  parse_gear_shifter ( gear ) :  
			
		
	
		
			
				
					  return  { ' P ' :  GearShifter . park ,  ' R ' :  GearShifter . reverse ,  ' N ' :  GearShifter . neutral ,   
			
		
	
		
			
				
					            ' D ' :  GearShifter . drive ,  ' S ' :  GearShifter . sport ,  ' L ' :  GearShifter . low } . get ( gear ,  GearShifter . unknown )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					def  calc_cruise_offset ( offset ,  speed ) :  
			
		
	
		
			
				
					  # euristic formula so that speed is controlled to ~ 0.3m/s below pid_speed   
			
		
	
		
			
				
					  # constraints to solve for _K0, _K1, _K2 are:   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -188,38 +180,21 @@ def get_cam_can_parser(CP): 
			
		
	
		
			
				
					  bus_cam  =  1  if  CP . carFingerprint  in  HONDA_BOSCH   and  not  CP . isPandaBlack  else  2   
			
		
	
		
			
				
					  return  CANParser ( DBC [ CP . carFingerprint ] [ ' pt ' ] ,  signals ,  checks ,  bus_cam )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					class  CarState ( ) :  
			
		
	
		
			
				
					class  CarState ( CarStateBase ) :  
			
		
	
		
			
				
					  def  __init__ ( self ,  CP ) :   
			
		
	
		
			
				
					    self . CP  =  CP   
			
		
	
		
			
				
					    self . can_define  =  CANDefine ( DBC [ CP . carFingerprint ] [ ' pt ' ] )   
			
		
	
		
			
				
					    self . shifter_values  =  self . can_define . dv [ " GEARBOX " ] [ " GEAR_SHIFTER " ]   
			
		
	
		
			
				
					    self . steer_status_values  =  defaultdict ( lambda :  " UNKNOWN " ,  self . can_define . dv [ " STEER_STATUS " ] [ " STEER_STATUS " ] )   
			
		
	
		
			
				
					    super ( ) . __init__ ( CP )   
			
		
	
		
			
				
					    can_define  =  CANDefine ( DBC [ CP . carFingerprint ] [ ' pt ' ] )   
			
		
	
		
			
				
					    self . shifter_values  =  can_define . dv [ " GEARBOX " ] [ " GEAR_SHIFTER " ]   
			
		
	
		
			
				
					    self . steer_status_values  =  defaultdict ( lambda :  " UNKNOWN " ,  can_define . dv [ " STEER_STATUS " ] [ " STEER_STATUS " ] )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    self . user_gas ,  self . user_gas_pressed  =  0. ,  0   
			
		
	
		
			
				
					    self . brake_switch_prev  =  0   
			
		
	
		
			
				
					    self . brake_switch_ts  =  0   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    self . cruise_buttons  =  0   
			
		
	
		
			
				
					    self . cruise_setting  =  0   
			
		
	
		
			
				
					    self . v_cruise_pcm_prev  =  0   
			
		
	
		
			
				
					    self . blinker_on  =  0   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    self . left_blinker_on  =  0   
			
		
	
		
			
				
					    self . right_blinker_on  =  0   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    self . cruise_mode  =  0   
			
		
	
		
			
				
					    self . stopped  =  0   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    # vEgo kalman filter   
			
		
	
		
			
				
					    dt  =  0.01   
			
		
	
		
			
				
					    # Q = np.matrix([[10.0, 0.0], [0.0, 100.0]])   
			
		
	
		
			
				
					    # R = 1e3   
			
		
	
		
			
				
					    self . v_ego_kf  =  KF1D ( x0 = [ [ 0.0 ] ,  [ 0.0 ] ] ,   
			
		
	
		
			
				
					                         A = [ [ 1.0 ,  dt ] ,  [ 0.0 ,  1.0 ] ] ,   
			
		
	
		
			
				
					                         C = [ 1.0 ,  0.0 ] ,   
			
		
	
		
			
				
					                         K = [ [ 0.12287673 ] ,  [ 0.29666309 ] ] )   
			
		
	
		
			
				
					    self . v_ego  =  0.0   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  def  update ( self ,  cp ,  cp_cam ) :   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    # car params   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -229,8 +204,6 @@ class CarState(): 
			
		
	
		
			
				
					    # update prevs, update must run once per loop   
			
		
	
		
			
				
					    self . prev_cruise_buttons  =  self . cruise_buttons   
			
		
	
		
			
				
					    self . prev_cruise_setting  =  self . cruise_setting   
			
		
	
		
			
				
					    self . prev_blinker_on  =  self . blinker_on   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    self . prev_left_blinker_on  =  self . left_blinker_on   
			
		
	
		
			
				
					    self . prev_right_blinker_on  =  self . right_blinker_on   
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -270,16 +243,10 @@ class CarState(): 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    # blend in transmission speed at low speed, since it has more low speed accuracy   
			
		
	
		
			
				
					    self . v_weight  =  interp ( v_wheel ,  v_weight_bp ,  v_weight_v )   
			
		
	
		
			
				
					    speed =  ( 1.  -  self . v_weight )  *  cp . vl [ " ENGINE_DATA " ] [ ' XMISSION_SPEED ' ]  *  CV . KPH_TO_MS  *  speed_factor  +  \  
			
		
	
		
			
				
					    self . v_ego_raw =  ( 1.  -  self . v_weight )  *  cp . vl [ " ENGINE_DATA " ] [ ' XMISSION_SPEED ' ]  *  CV . KPH_TO_MS  *  speed_factor  +  \  
			
		
	
		
			
				
					      self . v_weight  *  v_wheel   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    if  abs ( speed  -  self . v_ego )  >  2.0 :   # Prevent large accelerations when car starts at non zero speed   
			
		
	
		
			
				
					      self . v_ego_kf . x  =  [ [ speed ] ,  [ 0.0 ] ]   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    self . v_ego_raw  =  speed   
			
		
	
		
			
				
					    v_ego_x  =  self . v_ego_kf . update ( speed )   
			
		
	
		
			
				
					    self . v_ego  =  float ( v_ego_x [ 0 ] )   
			
		
	
		
			
				
					    self . a_ego  =  float ( v_ego_x [ 1 ] )   
			
		
	
		
			
				
					    self . v_ego ,  self . a_ego  =  self . update_speed_kf ( self . v_ego_raw )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    # this is a hack for the interceptor. This is now only used in the simulation   
			
		
	
		
			
				
					    # TODO: Replace tests by toyota so this can go away   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -310,7 +277,7 @@ class CarState(): 
			
		
	
		
			
				
					      self . main_on  =  cp . vl [ " SCM_BUTTONS " ] [ ' MAIN_ON ' ]   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    can_gear_shifter  =  int ( cp . vl [ " GEARBOX " ] [ ' GEAR_SHIFTER ' ] )   
			
		
	
		
			
				
					    self . gear_shifter  =  parse_gear_shifter ( self . shifter_values . get ( can_gear_shifter ,  None ) )   
			
		
	
		
			
				
					    self . gear_shifter  =  self . parse_gear_shifter ( self . shifter_values . get ( can_gear_shifter ,  None ) )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    self . pedal_gas  =  cp . vl [ " POWERTRAIN_DATA " ] [ ' PEDAL_GAS ' ]   
			
		
	
		
			
				
					    # crv doesn't include cruise control