|  |  |  | @ -3,6 +3,7 @@ from cereal import car | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | VisualAlert = car.CarControl.HUDControl.VisualAlert | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def create_steering_control(packer, apply_steer): | 
			
		
	
		
			
				
					|  |  |  |  |   values = { | 
			
		
	
		
			
				
					|  |  |  |  |     "LKAS_Output": apply_steer, | 
			
		
	
	
		
			
				
					|  |  |  | @ -11,9 +12,11 @@ def create_steering_control(packer, apply_steer): | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   return packer.make_can_msg("ES_LKAS", 0, values) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def create_steering_status(packer): | 
			
		
	
		
			
				
					|  |  |  |  |   return packer.make_can_msg("ES_LKAS_State", 0, {}) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def create_es_distance(packer, es_distance_msg, bus, pcm_cancel_cmd): | 
			
		
	
		
			
				
					|  |  |  |  |   values = copy.copy(es_distance_msg) | 
			
		
	
		
			
				
					|  |  |  |  |   values["COUNTER"] = (values["COUNTER"] + 1) % 0x10 | 
			
		
	
	
		
			
				
					|  |  |  | @ -21,8 +24,8 @@ def create_es_distance(packer, es_distance_msg, bus, pcm_cancel_cmd): | 
			
		
	
		
			
				
					|  |  |  |  |     values["Cruise_Cancel"] = 1 | 
			
		
	
		
			
				
					|  |  |  |  |   return packer.make_can_msg("ES_Distance", bus, values) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def create_es_lkas_state(packer, es_lkas_state_msg, enabled, visual_alert, left_line, right_line, left_lane_depart, right_lane_depart): | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def create_es_lkas_state(packer, es_lkas_state_msg, enabled, visual_alert, left_line, right_line, left_lane_depart, right_lane_depart): | 
			
		
	
		
			
				
					|  |  |  |  |   values = copy.copy(es_lkas_state_msg) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   # Filter the stock LKAS "Keep hands on wheel" alert | 
			
		
	
	
		
			
				
					|  |  |  | @ -52,18 +55,19 @@ def create_es_lkas_state(packer, es_lkas_state_msg, enabled, visual_alert, left_ | 
			
		
	
		
			
				
					|  |  |  |  |   # Ensure we don't overwrite potentially more important alerts from stock (e.g. FCW) | 
			
		
	
		
			
				
					|  |  |  |  |   if visual_alert == VisualAlert.ldw and values["LKAS_Alert"] == 0: | 
			
		
	
		
			
				
					|  |  |  |  |     if left_lane_depart: | 
			
		
	
		
			
				
					|  |  |  |  |       values["LKAS_Alert"] = 12 # Left lane departure dash alert | 
			
		
	
		
			
				
					|  |  |  |  |       values["LKAS_Alert"] = 12  # Left lane departure dash alert | 
			
		
	
		
			
				
					|  |  |  |  |     elif right_lane_depart: | 
			
		
	
		
			
				
					|  |  |  |  |       values["LKAS_Alert"] = 11 # Right lane departure dash alert | 
			
		
	
		
			
				
					|  |  |  |  |       values["LKAS_Alert"] = 11  # Right lane departure dash alert | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   values["LKAS_ACTIVE"] = 1 # Show LKAS lane lines | 
			
		
	
		
			
				
					|  |  |  |  |   values["LKAS_Dash_State"] = 2 if enabled else 0 # Green enabled indicator | 
			
		
	
		
			
				
					|  |  |  |  |   values["LKAS_ACTIVE"] = 1  # Show LKAS lane lines | 
			
		
	
		
			
				
					|  |  |  |  |   values["LKAS_Dash_State"] = 2 if enabled else 0  # Green enabled indicator | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   values["LKAS_Left_Line_Visible"] = int(left_line) | 
			
		
	
		
			
				
					|  |  |  |  |   values["LKAS_Right_Line_Visible"] = int(right_line) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   return packer.make_can_msg("ES_LKAS_State", 0, values) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def create_es_dashstatus(packer, dashstatus_msg): | 
			
		
	
		
			
				
					|  |  |  |  |   values = copy.copy(dashstatus_msg) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -73,6 +77,7 @@ def create_es_dashstatus(packer, dashstatus_msg): | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   return packer.make_can_msg("ES_DashStatus", 0, values) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def create_infotainmentstatus(packer, infotainmentstatus_msg, visual_alert): | 
			
		
	
		
			
				
					|  |  |  |  |   # Filter stock LKAS disabled and Keep hands on steering wheel OFF alerts | 
			
		
	
		
			
				
					|  |  |  |  |   if infotainmentstatus_msg["LKAS_State_Infotainment"] in (3, 4): | 
			
		
	
	
		
			
				
					|  |  |  | @ -88,12 +93,14 @@ def create_infotainmentstatus(packer, infotainmentstatus_msg, visual_alert): | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   return packer.make_can_msg("INFOTAINMENT_STATUS", 0, infotainmentstatus_msg) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | # *** Subaru Pre-global *** | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def subaru_preglobal_checksum(packer, values, addr): | 
			
		
	
		
			
				
					|  |  |  |  |   dat = packer.make_can_msg(addr, 0, values)[2] | 
			
		
	
		
			
				
					|  |  |  |  |   return (sum(dat[:7])) % 256 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def create_preglobal_steering_control(packer, apply_steer): | 
			
		
	
		
			
				
					|  |  |  |  |   values = { | 
			
		
	
		
			
				
					|  |  |  |  |     "LKAS_Command": apply_steer, | 
			
		
	
	
		
			
				
					|  |  |  | @ -103,8 +110,8 @@ def create_preglobal_steering_control(packer, apply_steer): | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   return packer.make_can_msg("ES_LKAS", 0, values) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def create_preglobal_es_distance(packer, cruise_button, es_distance_msg): | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def create_preglobal_es_distance(packer, cruise_button, es_distance_msg): | 
			
		
	
		
			
				
					|  |  |  |  |   values = copy.copy(es_distance_msg) | 
			
		
	
		
			
				
					|  |  |  |  |   values["Cruise_Button"] = cruise_button | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |