|  |  |  | @ -4,7 +4,7 @@ from opendbc.can.can_define import CANDefine | 
			
		
	
		
			
				
					|  |  |  |  | from common.conversions import Conversions as CV | 
			
		
	
		
			
				
					|  |  |  |  | from selfdrive.car.interfaces import CarStateBase | 
			
		
	
		
			
				
					|  |  |  |  | from opendbc.can.parser import CANParser | 
			
		
	
		
			
				
					|  |  |  |  | from selfdrive.car.subaru.values import DBC, STEER_THRESHOLD, CAR, PREGLOBAL_CARS | 
			
		
	
		
			
				
					|  |  |  |  | from selfdrive.car.subaru.values import DBC, STEER_THRESHOLD, CAR, GLOBAL_GEN2, PREGLOBAL_CARS | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | class CarState(CarStateBase): | 
			
		
	
	
		
			
				
					|  |  |  | @ -13,7 +13,7 @@ class CarState(CarStateBase): | 
			
		
	
		
			
				
					|  |  |  |  |     can_define = CANDefine(DBC[CP.carFingerprint]["pt"]) | 
			
		
	
		
			
				
					|  |  |  |  |     self.shifter_values = can_define.dv["Transmission"]["Gear"] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   def update(self, cp, cp_cam): | 
			
		
	
		
			
				
					|  |  |  |  |   def update(self, cp, cp_cam, cp_body): | 
			
		
	
		
			
				
					|  |  |  |  |     ret = car.CarState.new_message() | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     ret.gas = cp.vl["Throttle"]["Throttle_Pedal"] / 255. | 
			
		
	
	
		
			
				
					|  |  |  | @ -21,13 +21,15 @@ class CarState(CarStateBase): | 
			
		
	
		
			
				
					|  |  |  |  |     if self.car_fingerprint in PREGLOBAL_CARS: | 
			
		
	
		
			
				
					|  |  |  |  |       ret.brakePressed = cp.vl["Brake_Pedal"]["Brake_Pedal"] > 2 | 
			
		
	
		
			
				
					|  |  |  |  |     else: | 
			
		
	
		
			
				
					|  |  |  |  |       ret.brakePressed = cp.vl["Brake_Status"]["Brake"] == 1 | 
			
		
	
		
			
				
					|  |  |  |  |       cp_brakes = cp_body if self.car_fingerprint in GLOBAL_GEN2 else cp | 
			
		
	
		
			
				
					|  |  |  |  |       ret.brakePressed = cp_brakes.vl["Brake_Status"]["Brake"] == 1 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     cp_wheels = cp_body if self.car_fingerprint in GLOBAL_GEN2 else cp | 
			
		
	
		
			
				
					|  |  |  |  |     ret.wheelSpeeds = self.get_wheel_speeds( | 
			
		
	
		
			
				
					|  |  |  |  |       cp.vl["Wheel_Speeds"]["FL"], | 
			
		
	
		
			
				
					|  |  |  |  |       cp.vl["Wheel_Speeds"]["FR"], | 
			
		
	
		
			
				
					|  |  |  |  |       cp.vl["Wheel_Speeds"]["RL"], | 
			
		
	
		
			
				
					|  |  |  |  |       cp.vl["Wheel_Speeds"]["RR"], | 
			
		
	
		
			
				
					|  |  |  |  |       cp_wheels.vl["Wheel_Speeds"]["FL"], | 
			
		
	
		
			
				
					|  |  |  |  |       cp_wheels.vl["Wheel_Speeds"]["FR"], | 
			
		
	
		
			
				
					|  |  |  |  |       cp_wheels.vl["Wheel_Speeds"]["RL"], | 
			
		
	
		
			
				
					|  |  |  |  |       cp_wheels.vl["Wheel_Speeds"]["RR"], | 
			
		
	
		
			
				
					|  |  |  |  |     ) | 
			
		
	
		
			
				
					|  |  |  |  |     ret.vEgoRaw = (ret.wheelSpeeds.fl + ret.wheelSpeeds.fr + ret.wheelSpeeds.rl + ret.wheelSpeeds.rr) / 4. | 
			
		
	
		
			
				
					|  |  |  |  |     # Kalman filter, even though Subaru raw wheel speed is heaviliy filtered by default | 
			
		
	
	
		
			
				
					|  |  |  | @ -35,8 +37,8 @@ class CarState(CarStateBase): | 
			
		
	
		
			
				
					|  |  |  |  |     ret.standstill = ret.vEgoRaw < 0.01 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     # continuous blinker signals for assisted lane change | 
			
		
	
		
			
				
					|  |  |  |  |     ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp( | 
			
		
	
		
			
				
					|  |  |  |  |       50, cp.vl["Dashlights"]["LEFT_BLINKER"], cp.vl["Dashlights"]["RIGHT_BLINKER"]) | 
			
		
	
		
			
				
					|  |  |  |  |     ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp(50, cp.vl["Dashlights"]["LEFT_BLINKER"], | 
			
		
	
		
			
				
					|  |  |  |  |                                                                           cp.vl["Dashlights"]["RIGHT_BLINKER"]) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if self.CP.enableBsm: | 
			
		
	
		
			
				
					|  |  |  |  |       ret.leftBlindspot = (cp.vl["BSD_RCTA"]["L_ADJACENT"] == 1) or (cp.vl["BSD_RCTA"]["L_APPROACHING"] == 1) | 
			
		
	
	
		
			
				
					|  |  |  | @ -50,8 +52,9 @@ class CarState(CarStateBase): | 
			
		
	
		
			
				
					|  |  |  |  |     ret.steeringTorqueEps = cp.vl["Steering_Torque"]["Steer_Torque_Output"] | 
			
		
	
		
			
				
					|  |  |  |  |     ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD[self.car_fingerprint] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     ret.cruiseState.enabled = cp.vl["CruiseControl"]["Cruise_Activated"] != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     ret.cruiseState.available = cp.vl["CruiseControl"]["Cruise_On"] != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     cp_cruise = cp_body if self.car_fingerprint in GLOBAL_GEN2 else cp | 
			
		
	
		
			
				
					|  |  |  |  |     ret.cruiseState.enabled = cp_cruise.vl["CruiseControl"]["Cruise_Activated"] != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     ret.cruiseState.available = cp_cruise.vl["CruiseControl"]["Cruise_On"] != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     ret.cruiseState.speed = cp_cam.vl["ES_DashStatus"]["Cruise_Set_Speed"] * CV.KPH_TO_MS | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if (self.car_fingerprint in PREGLOBAL_CARS and cp.vl["Dash_State2"]["UNITS"] == 1) or \ | 
			
		
	
	
		
			
				
					|  |  |  | @ -72,10 +75,59 @@ class CarState(CarStateBase): | 
			
		
	
		
			
				
					|  |  |  |  |       ret.steerFaultTemporary = cp.vl["Steering_Torque"]["Steer_Warning"] == 1 | 
			
		
	
		
			
				
					|  |  |  |  |       ret.cruiseState.nonAdaptive = cp_cam.vl["ES_DashStatus"]["Conventional_Cruise"] == 1 | 
			
		
	
		
			
				
					|  |  |  |  |       self.es_lkas_msg = copy.copy(cp_cam.vl["ES_LKAS_State"]) | 
			
		
	
		
			
				
					|  |  |  |  |     self.es_distance_msg = copy.copy(cp_cam.vl["ES_Distance"]) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     cp_es_distance = cp_body if self.car_fingerprint in GLOBAL_GEN2 else cp_cam | 
			
		
	
		
			
				
					|  |  |  |  |     self.es_distance_msg = copy.copy(cp_es_distance.vl["ES_Distance"]) | 
			
		
	
		
			
				
					|  |  |  |  |     self.es_dashstatus_msg = copy.copy(cp_cam.vl["ES_DashStatus"]) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     return ret | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   @staticmethod | 
			
		
	
		
			
				
					|  |  |  |  |   def get_common_global_signals(): | 
			
		
	
		
			
				
					|  |  |  |  |     signals = [ | 
			
		
	
		
			
				
					|  |  |  |  |       ("Cruise_On", "CruiseControl"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Cruise_Activated", "CruiseControl"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("FL", "Wheel_Speeds"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("FR", "Wheel_Speeds"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("RL", "Wheel_Speeds"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("RR", "Wheel_Speeds"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Brake", "Brake_Status"), | 
			
		
	
		
			
				
					|  |  |  |  |     ] | 
			
		
	
		
			
				
					|  |  |  |  |     checks = [ | 
			
		
	
		
			
				
					|  |  |  |  |       ("CruiseControl", 20), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Wheel_Speeds", 50), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Brake_Status", 50), | 
			
		
	
		
			
				
					|  |  |  |  |     ] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     return signals, checks | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   @staticmethod | 
			
		
	
		
			
				
					|  |  |  |  |   def get_global_es_distance_signals(): | 
			
		
	
		
			
				
					|  |  |  |  |     signals = [ | 
			
		
	
		
			
				
					|  |  |  |  |       ("COUNTER", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Signal1", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Cruise_Fault", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Cruise_Throttle", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Signal2", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Car_Follow", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Signal3", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Cruise_Brake_Active", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Distance_Swap", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Cruise_EPB", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Signal4", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Close_Distance", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Signal5", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Cruise_Cancel", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Cruise_Set", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Cruise_Resume", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Signal6", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |     ] | 
			
		
	
		
			
				
					|  |  |  |  |     checks = [ | 
			
		
	
		
			
				
					|  |  |  |  |       ("ES_Distance", 20), | 
			
		
	
		
			
				
					|  |  |  |  |     ] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     return signals, checks | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   @staticmethod | 
			
		
	
		
			
				
					|  |  |  |  |   def get_can_parser(CP): | 
			
		
	
		
			
				
					|  |  |  |  |     signals = [ | 
			
		
	
	
		
			
				
					|  |  |  | @ -84,17 +136,11 @@ class CarState(CarStateBase): | 
			
		
	
		
			
				
					|  |  |  |  |       ("Steer_Torque_Output", "Steering_Torque"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Steering_Angle", "Steering_Torque"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Steer_Error_1", "Steering_Torque"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Cruise_On", "CruiseControl"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Cruise_Activated", "CruiseControl"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Brake_Pedal", "Brake_Pedal"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Throttle_Pedal", "Throttle"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("LEFT_BLINKER", "Dashlights"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("RIGHT_BLINKER", "Dashlights"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("SEATBELT_FL", "Dashlights"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("FL", "Wheel_Speeds"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("FR", "Wheel_Speeds"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("RL", "Wheel_Speeds"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("RR", "Wheel_Speeds"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("DOOR_OPEN_FR", "BodyInfo"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("DOOR_OPEN_FL", "BodyInfo"), | 
			
		
	
		
			
				
					|  |  |  |  |       ("DOOR_OPEN_RR", "BodyInfo"), | 
			
		
	
	
		
			
				
					|  |  |  | @ -107,7 +153,6 @@ class CarState(CarStateBase): | 
			
		
	
		
			
				
					|  |  |  |  |       ("Throttle", 100), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Dashlights", 10), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Brake_Pedal", 50), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Wheel_Speeds", 50), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Transmission", 100), | 
			
		
	
		
			
				
					|  |  |  |  |       ("Steering_Torque", 50), | 
			
		
	
		
			
				
					|  |  |  |  |       ("BodyInfo", 1), | 
			
		
	
	
		
			
				
					|  |  |  | @ -123,22 +168,33 @@ class CarState(CarStateBase): | 
			
		
	
		
			
				
					|  |  |  |  |       checks.append(("BSD_RCTA", 17)) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if CP.carFingerprint not in PREGLOBAL_CARS: | 
			
		
	
		
			
				
					|  |  |  |  |       if CP.carFingerprint not in GLOBAL_GEN2: | 
			
		
	
		
			
				
					|  |  |  |  |         signals += CarState.get_common_global_signals()[0] | 
			
		
	
		
			
				
					|  |  |  |  |         checks += CarState.get_common_global_signals()[1] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       signals += [ | 
			
		
	
		
			
				
					|  |  |  |  |         ("Steer_Warning", "Steering_Torque"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Brake", "Brake_Status"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("UNITS", "Dashlights"), | 
			
		
	
		
			
				
					|  |  |  |  |       ] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       checks += [ | 
			
		
	
		
			
				
					|  |  |  |  |         ("Dashlights", 10), | 
			
		
	
		
			
				
					|  |  |  |  |         ("BodyInfo", 10), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Brake_Status", 50), | 
			
		
	
		
			
				
					|  |  |  |  |         ("CruiseControl", 20), | 
			
		
	
		
			
				
					|  |  |  |  |       ] | 
			
		
	
		
			
				
					|  |  |  |  |     else: | 
			
		
	
		
			
				
					|  |  |  |  |       signals.append(("UNITS", "Dash_State2")) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       checks.append(("Dash_State2", 1)) | 
			
		
	
		
			
				
					|  |  |  |  |       signals += [ | 
			
		
	
		
			
				
					|  |  |  |  |         ("FL", "Wheel_Speeds"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("FR", "Wheel_Speeds"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("RL", "Wheel_Speeds"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("RR", "Wheel_Speeds"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("UNITS", "Dash_State2"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_On", "CruiseControl"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_Activated", "CruiseControl"), | 
			
		
	
		
			
				
					|  |  |  |  |       ] | 
			
		
	
		
			
				
					|  |  |  |  |       checks += [ | 
			
		
	
		
			
				
					|  |  |  |  |         ("Wheel_Speeds", 50), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Dash_State2", 1), | 
			
		
	
		
			
				
					|  |  |  |  |       ] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       if CP.carFingerprint == CAR.FORESTER_PREGLOBAL: | 
			
		
	
		
			
				
					|  |  |  |  |         checks += [ | 
			
		
	
	
		
			
				
					|  |  |  | @ -187,26 +243,32 @@ class CarState(CarStateBase): | 
			
		
	
		
			
				
					|  |  |  |  |       ] | 
			
		
	
		
			
				
					|  |  |  |  |     else: | 
			
		
	
		
			
				
					|  |  |  |  |       signals = [ | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_Set_Speed", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Counter", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("PCB_Off", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("LDW_Off", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Signal1", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_State_Msg", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("LKAS_State_Msg", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Signal2", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_Soft_Disable", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("EyeSight_Status_Msg", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Signal3", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_Distance", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Signal4", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Conventional_Cruise", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         ("COUNTER", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Signal1", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_Fault", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_Throttle", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Signal2", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Car_Follow", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Signal3", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_Brake_Active", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Distance_Swap", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_EPB", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Signal4", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Close_Distance", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Signal5", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_Cancel", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_Set", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_Resume", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Signal6", "ES_Distance"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Signal5", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_Disengaged", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_Activated", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Signal6", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_Set_Speed", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_Fault", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_On", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Display_Own_Car", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Brake_Lights", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Car_Follow", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Signal7", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Far_Distance", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("Cruise_State", "ES_DashStatus"), | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         ("COUNTER", "ES_LKAS_State"), | 
			
		
	
		
			
				
					|  |  |  |  |         ("LKAS_Alert_Msg", "ES_LKAS_State"), | 
			
		
	
	
		
			
				
					|  |  |  | @ -227,8 +289,21 @@ class CarState(CarStateBase): | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       checks = [ | 
			
		
	
		
			
				
					|  |  |  |  |         ("ES_DashStatus", 10), | 
			
		
	
		
			
				
					|  |  |  |  |         ("ES_Distance", 20), | 
			
		
	
		
			
				
					|  |  |  |  |         ("ES_LKAS_State", 10), | 
			
		
	
		
			
				
					|  |  |  |  |       ] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       if CP.carFingerprint not in GLOBAL_GEN2: | 
			
		
	
		
			
				
					|  |  |  |  |         signals += CarState.get_global_es_distance_signals()[0] | 
			
		
	
		
			
				
					|  |  |  |  |         checks += CarState.get_global_es_distance_signals()[1] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, 2) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   @staticmethod | 
			
		
	
		
			
				
					|  |  |  |  |   def get_body_can_parser(CP): | 
			
		
	
		
			
				
					|  |  |  |  |     if CP.carFingerprint in GLOBAL_GEN2: | 
			
		
	
		
			
				
					|  |  |  |  |       signals, checks = CarState.get_common_global_signals() | 
			
		
	
		
			
				
					|  |  |  |  |       signals += CarState.get_global_es_distance_signals()[0] | 
			
		
	
		
			
				
					|  |  |  |  |       checks += CarState.get_global_es_distance_signals()[1] | 
			
		
	
		
			
				
					|  |  |  |  |       return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, 1) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     return None |