| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -4,7 +4,7 @@ from opendbc.can.can_define import CANDefine | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from common.conversions import Conversions as CV | 
					 | 
					 | 
					 | 
					from common.conversions import Conversions as CV | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from selfdrive.car.interfaces import CarStateBase | 
					 | 
					 | 
					 | 
					from selfdrive.car.interfaces import CarStateBase | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from opendbc.can.parser import CANParser | 
					 | 
					 | 
					 | 
					from opendbc.can.parser import CANParser | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from selfdrive.car.subaru.values import DBC, CAR, GLOBAL_GEN2, PREGLOBAL_CARS, SubaruFlags | 
					 | 
					 | 
					 | 
					from selfdrive.car.subaru.values import DBC, CAR, GLOBAL_GEN2, PREGLOBAL_CARS, CanBus, SubaruFlags | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					class CarState(CarStateBase): | 
					 | 
					 | 
					 | 
					class CarState(CarStateBase): | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -87,12 +87,12 @@ class CarState(CarStateBase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.es_distance_msg = copy.copy(cp_es_distance.vl["ES_Distance"]) | 
					 | 
					 | 
					 | 
					    self.es_distance_msg = copy.copy(cp_es_distance.vl["ES_Distance"]) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.es_dashstatus_msg = copy.copy(cp_cam.vl["ES_DashStatus"]) | 
					 | 
					 | 
					 | 
					    self.es_dashstatus_msg = copy.copy(cp_cam.vl["ES_DashStatus"]) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if self.CP.flags & SubaruFlags.SEND_INFOTAINMENT: | 
					 | 
					 | 
					 | 
					    if self.CP.flags & SubaruFlags.SEND_INFOTAINMENT: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      self.es_infotainmentstatus_msg = copy.copy(cp_cam.vl["INFOTAINMENT_STATUS"]) | 
					 | 
					 | 
					 | 
					      self.es_infotainment_msg = copy.copy(cp_cam.vl["ES_Infotainment"]) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return ret | 
					 | 
					 | 
					 | 
					    return ret | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  @staticmethod | 
					 | 
					 | 
					 | 
					  @staticmethod | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  def get_common_global_signals(): | 
					 | 
					 | 
					 | 
					  def get_common_global_body_signals(): | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    signals = [ | 
					 | 
					 | 
					 | 
					    signals = [ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ("Cruise_On", "CruiseControl"), | 
					 | 
					 | 
					 | 
					      ("Cruise_On", "CruiseControl"), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ("Cruise_Activated", "CruiseControl"), | 
					 | 
					 | 
					 | 
					      ("Cruise_Activated", "CruiseControl"), | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -111,20 +111,10 @@ class CarState(CarStateBase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return signals, checks | 
					 | 
					 | 
					 | 
					    return signals, checks | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  @staticmethod | 
					 | 
					 | 
					 | 
					  @staticmethod | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  def get_global_es_brake_signals(): | 
					 | 
					 | 
					 | 
					  def get_common_global_es_signals(): | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    signals = [ | 
					 | 
					 | 
					 | 
					    signals = [ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ("AEB_Status", "ES_Brake"), | 
					 | 
					 | 
					 | 
					      ("AEB_Status", "ES_Brake"), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ("Brake_Pressure", "ES_Brake"), | 
					 | 
					 | 
					 | 
					      ("Brake_Pressure", "ES_Brake"), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ] | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    checks = [ | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ("ES_Brake", 20), | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ] | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return signals, checks | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  @staticmethod | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  def get_global_es_distance_signals(): | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    signals = [ | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ("COUNTER", "ES_Distance"), | 
					 | 
					 | 
					 | 
					      ("COUNTER", "ES_Distance"), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ("CHECKSUM", "ES_Distance"), | 
					 | 
					 | 
					 | 
					      ("CHECKSUM", "ES_Distance"), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ("Signal1", "ES_Distance"), | 
					 | 
					 | 
					 | 
					      ("Signal1", "ES_Distance"), | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -146,7 +136,9 @@ class CarState(CarStateBase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ("Cruise_Resume", "ES_Distance"), | 
					 | 
					 | 
					 | 
					      ("Cruise_Resume", "ES_Distance"), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ("Signal6", "ES_Distance"), | 
					 | 
					 | 
					 | 
					      ("Signal6", "ES_Distance"), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ] | 
					 | 
					 | 
					 | 
					    ] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    checks = [ | 
					 | 
					 | 
					 | 
					    checks = [ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      ("ES_Brake", 20), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ("ES_Distance", 20), | 
					 | 
					 | 
					 | 
					      ("ES_Distance", 20), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ] | 
					 | 
					 | 
					 | 
					    ] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -193,8 +185,8 @@ class CarState(CarStateBase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if CP.carFingerprint not in PREGLOBAL_CARS: | 
					 | 
					 | 
					 | 
					    if CP.carFingerprint not in PREGLOBAL_CARS: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if CP.carFingerprint not in GLOBAL_GEN2: | 
					 | 
					 | 
					 | 
					      if CP.carFingerprint not in GLOBAL_GEN2: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        signals += CarState.get_common_global_signals()[0] | 
					 | 
					 | 
					 | 
					        signals += CarState.get_common_global_body_signals()[0] | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        checks += CarState.get_common_global_signals()[1] | 
					 | 
					 | 
					 | 
					        checks += CarState.get_common_global_body_signals()[1] | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      signals += [ | 
					 | 
					 | 
					 | 
					      signals += [ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        ("Steer_Warning", "Steering_Torque"), | 
					 | 
					 | 
					 | 
					        ("Steer_Warning", "Steering_Torque"), | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -233,7 +225,7 @@ class CarState(CarStateBase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          ("CruiseControl", 50), | 
					 | 
					 | 
					 | 
					          ("CruiseControl", 50), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        ] | 
					 | 
					 | 
					 | 
					        ] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, 0) | 
					 | 
					 | 
					 | 
					    return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, CanBus.main) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  @staticmethod | 
					 | 
					 | 
					 | 
					  @staticmethod | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  def get_cam_can_parser(CP): | 
					 | 
					 | 
					 | 
					  def get_cam_can_parser(CP): | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -319,32 +311,28 @@ class CarState(CarStateBase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ] | 
					 | 
					 | 
					 | 
					      ] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if CP.carFingerprint not in GLOBAL_GEN2: | 
					 | 
					 | 
					 | 
					      if CP.carFingerprint not in GLOBAL_GEN2: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        signals += CarState.get_global_es_distance_signals()[0] | 
					 | 
					 | 
					 | 
					        signals += CarState.get_common_global_es_signals()[0] | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        signals += CarState.get_global_es_brake_signals()[0] | 
					 | 
					 | 
					 | 
					        checks += CarState.get_common_global_es_signals()[1] | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        checks += CarState.get_global_es_distance_signals()[1] | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        checks += CarState.get_global_es_brake_signals()[1] | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if CP.flags & SubaruFlags.SEND_INFOTAINMENT: | 
					 | 
					 | 
					 | 
					      if CP.flags & SubaruFlags.SEND_INFOTAINMENT: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        signals += [ | 
					 | 
					 | 
					 | 
					        signals += [ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          ("COUNTER", "INFOTAINMENT_STATUS"), | 
					 | 
					 | 
					 | 
					          ("COUNTER", "ES_Infotainment"), | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          ("CHECKSUM", "INFOTAINMENT_STATUS"), | 
					 | 
					 | 
					 | 
					          ("CHECKSUM", "ES_Infotainment"), | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          ("LKAS_State_Infotainment", "INFOTAINMENT_STATUS"), | 
					 | 
					 | 
					 | 
					          ("LKAS_State_Infotainment", "ES_Infotainment"), | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          ("LKAS_Blue_Lines", "INFOTAINMENT_STATUS"), | 
					 | 
					 | 
					 | 
					          ("LKAS_Blue_Lines", "ES_Infotainment"), | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          ("Signal1", "INFOTAINMENT_STATUS"), | 
					 | 
					 | 
					 | 
					          ("Signal1", "ES_Infotainment"), | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          ("Signal2", "INFOTAINMENT_STATUS"), | 
					 | 
					 | 
					 | 
					          ("Signal2", "ES_Infotainment"), | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        ] | 
					 | 
					 | 
					 | 
					        ] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        checks.append(("INFOTAINMENT_STATUS", 10)) | 
					 | 
					 | 
					 | 
					        checks.append(("ES_Infotainment", 10)) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, 2) | 
					 | 
					 | 
					 | 
					    return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, CanBus.camera) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  @staticmethod | 
					 | 
					 | 
					 | 
					  @staticmethod | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  def get_body_can_parser(CP): | 
					 | 
					 | 
					 | 
					  def get_body_can_parser(CP): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if CP.carFingerprint in GLOBAL_GEN2: | 
					 | 
					 | 
					 | 
					    if CP.carFingerprint in GLOBAL_GEN2: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      signals, checks = CarState.get_common_global_signals() | 
					 | 
					 | 
					 | 
					      signals, checks = CarState.get_common_global_body_signals() | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      signals += CarState.get_global_es_distance_signals()[0] | 
					 | 
					 | 
					 | 
					      signals += CarState.get_common_global_es_signals()[0] | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      signals += CarState.get_global_es_brake_signals()[0] | 
					 | 
					 | 
					 | 
					      checks += CarState.get_common_global_es_signals()[1] | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      checks += CarState.get_global_es_distance_signals()[1] | 
					 | 
					 | 
					 | 
					      return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, CanBus.alt) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      checks += CarState.get_global_es_brake_signals()[1] | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, 1) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return None | 
					 | 
					 | 
					 | 
					    return None | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
					 | 
					 | 
					
  |