@ -20,6 +20,8 @@ class CarInterface(CarInterfaceBase): 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . brake_pressed_prev  =  False   
					 
					 
					 
					    self . brake_pressed_prev  =  False   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . cruise_enabled_prev  =  False   
					 
					 
					 
					    self . cruise_enabled_prev  =  False   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . low_speed_alert  =  False   
					 
					 
					 
					    self . low_speed_alert  =  False   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    self . left_blinker_prev  =  False   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    self . right_blinker_prev  =  False   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # *** init the major players ***   
					 
					 
					 
					    # *** init the major players ***   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . CS  =  CarState ( CP )   
					 
					 
					 
					    self . CS  =  CarState ( CP )   
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -113,78 +115,33 @@ class CarInterface(CarInterfaceBase): 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . cp . update_strings ( can_strings )   
					 
					 
					 
					    self . cp . update_strings ( can_strings )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . cp_cam . update_strings ( can_strings )   
					 
					 
					 
					    self . cp_cam . update_strings ( can_strings )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . CS . update ( self . cp ,  self . cp_cam )   
					 
					 
					 
					    ret  =  self . CS . update ( self . cp ,  self . cp_cam )   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # create message   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret  =  car . CarState . new_message ( )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . canValid  =  self . cp . can_valid  and  self . cp_cam . can_valid   
					 
					 
					 
					    ret . canValid  =  self . cp . can_valid  and  self . cp_cam . can_valid   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # speeds   
					 
					 
					 
					    # speeds   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . vEgo  =  self . CS . v_ego   
					 
					 
					 
					    ret . yawRate  =  self . VM . yaw_rate ( ret . steeringAngle  *  CV . DEG_TO_RAD ,  ret . vEgo )   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . vEgoRaw  =  self . CS . v_ego_raw   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . aEgo  =  self . CS . a_ego   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . yawRate  =  self . VM . yaw_rate ( self . CS . angle_steers  *  CV . DEG_TO_RAD ,  self . CS . v_ego )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . standstill  =  self . CS . standstill   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . wheelSpeeds . fl  =  self . CS . v_wheel_fl   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . wheelSpeeds . fr  =  self . CS . v_wheel_fr   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . wheelSpeeds . rl  =  self . CS . v_wheel_rl   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . wheelSpeeds . rr  =  self . CS . v_wheel_rr   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # gear shifter   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . gearShifter  =  self . CS . gear_shifter   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # gas pedal   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . gas  =  self . CS . pedal_gas   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . gasPressed  =  self . CS . pedal_gas  >  0   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # brake pedal   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . brake  =  self . CS . user_brake   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . brakePressed  =  self . CS . brake_pressed   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . brakeLights  =  self . CS . brake_lights   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # steering wheel   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . steeringAngle  =  self . CS . angle_steers   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . steeringRate  =  self . CS . angle_steers_rate   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . steeringTorque  =  self . CS . steer_torque_driver   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . steeringPressed  =  self . CS . steer_override   
					 
					 
					 
					 
				
			 
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					    ret . steeringRateLimited  =  self . CC . steer_rate_limited  if  self . CC  is  not  None  else  False   
					 
					 
					 
					    ret . steeringRateLimited  =  self . CC . steer_rate_limited  if  self . CC  is  not  None  else  False   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # cruise state   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . cruiseState . enabled  =  self . CS . pcm_acc_status   # same as main_on   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . cruiseState . speed  =  self . CS . v_cruise_pcm  *  CV . KPH_TO_MS   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . cruiseState . available  =  self . CS . main_on   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . cruiseState . speedOffset  =  0.   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . cruiseState . standstill  =  False   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # TODO: button presses   
					 
					 
					 
					    # TODO: button presses   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    buttonEvents  =  [ ]   
					 
					 
					 
					    buttonEvents  =  [ ]   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    if  self . CS . left_blinker_on   !=  self . CS . prev_left_blinker_on :   
					 
					 
					 
					    if  ret . leftBlinker  !=  self . left_blinker_prev :   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					      be  =  car . CarState . ButtonEvent . new_message ( )   
					 
					 
					 
					      be  =  car . CarState . ButtonEvent . new_message ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      be . type  =  ButtonType . leftBlinker   
					 
					 
					 
					      be . type  =  ButtonType . leftBlinker   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      be . pressed  =  self . CS . left_blinker_on   !=  0   
					 
					 
					 
					      be . pressed  =  ret . leftBlinker  !=  0   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					      buttonEvents . append ( be )   
					 
					 
					 
					      buttonEvents . append ( be )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    if  self . CS . right_blinker_on   !=  self . CS . prev_right_blinker_on :   
					 
					 
					 
					    if  ret . rightBlinker  !=  self . right_blinker_prev :   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					      be  =  car . CarState . ButtonEvent . new_message ( )   
					 
					 
					 
					      be  =  car . CarState . ButtonEvent . new_message ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      be . type  =  ButtonType . rightBlinker   
					 
					 
					 
					      be . type  =  ButtonType . rightBlinker   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      be . pressed  =  self . CS . right_blinker_on   !=  0   
					 
					 
					 
					      be . pressed  =  ret . rightBlinker  !=  0   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					      buttonEvents . append ( be )   
					 
					 
					 
					      buttonEvents . append ( be )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . buttonEvents  =  buttonEvents   
					 
					 
					 
					    ret . buttonEvents  =  buttonEvents   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . leftBlinker  =  bool ( self . CS . left_blinker_on )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . rightBlinker  =  bool ( self . CS . right_blinker_on )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . doorOpen  =  not  self . CS . door_all_closed   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . seatbeltUnlatched  =  not  self . CS . seatbelt   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . low_speed_alert  =  ( ret . vEgo  <  self . CP . minSteerSpeed )   
					 
					 
					 
					    self . low_speed_alert  =  ( ret . vEgo  <  self . CP . minSteerSpeed )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ret . genericToggle  =  self . CS . generic_toggle   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    #ret.lkasCounter = self.CS.lkas_counter   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    #ret.lkasCarModel = self.CS.lkas_car_model   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # events   
					 
					 
					 
					    # events   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    events  =  [ ]   
					 
					 
					 
					    events  =  [ ]   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    if  not  ( ret . gearShifter  in  ( GearShifter . drive ,  GearShifter . low ) ) :   
					 
					 
					 
					    if  not  ( ret . gearShifter  in  ( GearShifter . drive ,  GearShifter . low ) ) :   
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -195,7 +152,7 @@ class CarInterface(CarInterfaceBase): 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      events . append ( create_event ( ' seatbeltNotLatched ' ,  [ ET . NO_ENTRY ,  ET . SOFT_DISABLE ] ) )   
					 
					 
					 
					      events . append ( create_event ( ' seatbeltNotLatched ' ,  [ ET . NO_ENTRY ,  ET . SOFT_DISABLE ] ) )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    if  self . CS . esp_disabled :   
					 
					 
					 
					    if  self . CS . esp_disabled :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      events . append ( create_event ( ' espDisabled ' ,  [ ET . NO_ENTRY ,  ET . SOFT_DISABLE ] ) )   
					 
					 
					 
					      events . append ( create_event ( ' espDisabled ' ,  [ ET . NO_ENTRY ,  ET . SOFT_DISABLE ] ) )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    if  not  self . CS . main_on :   
					 
					 
					 
					    if  not  ret . cruiseState . available :   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					      events . append ( create_event ( ' wrongCarMode ' ,  [ ET . NO_ENTRY ,  ET . USER_DISABLE ] ) )   
					 
					 
					 
					      events . append ( create_event ( ' wrongCarMode ' ,  [ ET . NO_ENTRY ,  ET . USER_DISABLE ] ) )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    if  ret . gearShifter  ==  GearShifter . reverse :   
					 
					 
					 
					    if  ret . gearShifter  ==  GearShifter . reverse :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      events . append ( create_event ( ' reverseGear ' ,  [ ET . NO_ENTRY ,  ET . IMMEDIATE_DISABLE ] ) )   
					 
					 
					 
					      events . append ( create_event ( ' reverseGear ' ,  [ ET . NO_ENTRY ,  ET . IMMEDIATE_DISABLE ] ) )   
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -220,8 +177,13 @@ class CarInterface(CarInterfaceBase): 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . gas_pressed_prev  =  ret . gasPressed   
					 
					 
					 
					    self . gas_pressed_prev  =  ret . gasPressed   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . brake_pressed_prev  =  ret . brakePressed   
					 
					 
					 
					    self . brake_pressed_prev  =  ret . brakePressed   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . cruise_enabled_prev  =  ret . cruiseState . enabled   
					 
					 
					 
					    self . cruise_enabled_prev  =  ret . cruiseState . enabled   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    self . left_blinker_prev  =  ret . leftBlinker   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    self . right_blinker_prev  =  ret . rightBlinker   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    # copy back carState packet to CS   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    self . CS . out  =  ret . as_reader ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    return  ret . as_reader ( )   
					 
					 
					 
					    return  self . CS . out   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  # pass in a car.CarControl   
					 
					 
					 
					  # pass in a car.CarControl   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  # to be called @ 100hz   
					 
					 
					 
					  # to be called @ 100hz