| 
						
						
						
					 | 
					 | 
					@ -1,7 +1,7 @@ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from collections import defaultdict | 
					 | 
					 | 
					 | 
					from collections import defaultdict | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from dataclasses import dataclass, field | 
					 | 
					 | 
					 | 
					from dataclasses import dataclass, field | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from enum import Enum | 
					 | 
					 | 
					 | 
					from enum import Enum | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from typing import Dict, List, Set, Union | 
					 | 
					 | 
					 | 
					from typing import Dict, List, Union | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from cereal import car | 
					 | 
					 | 
					 | 
					from cereal import car | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from selfdrive.car import AngleRateLimit, dbc_dict | 
					 | 
					 | 
					 | 
					from selfdrive.car import AngleRateLimit, dbc_dict | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -44,11 +44,12 @@ class CAR: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  BRONCO_SPORT_MK1 = "FORD BRONCO SPORT 1ST GEN" | 
					 | 
					 | 
					 | 
					  BRONCO_SPORT_MK1 = "FORD BRONCO SPORT 1ST GEN" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  ESCAPE_MK4 = "FORD ESCAPE 4TH GEN" | 
					 | 
					 | 
					 | 
					  ESCAPE_MK4 = "FORD ESCAPE 4TH GEN" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  EXPLORER_MK6 = "FORD EXPLORER 6TH GEN" | 
					 | 
					 | 
					 | 
					  EXPLORER_MK6 = "FORD EXPLORER 6TH GEN" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  F_150_MK14 = "FORD F-150 14TH GEN" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  FOCUS_MK4 = "FORD FOCUS 4TH GEN" | 
					 | 
					 | 
					 | 
					  FOCUS_MK4 = "FORD FOCUS 4TH GEN" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  MAVERICK_MK1 = "FORD MAVERICK 1ST GEN" | 
					 | 
					 | 
					 | 
					  MAVERICK_MK1 = "FORD MAVERICK 1ST GEN" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					CANFD_CARS: Set[str] = set() | 
					 | 
					 | 
					 | 
					CANFD_CARS = {CAR.F_150_MK14} | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					class RADAR: | 
					 | 
					 | 
					 | 
					class RADAR: | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -58,6 +59,9 @@ class RADAR: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					DBC: Dict[str, Dict[str, str]] = defaultdict(lambda: dbc_dict("ford_lincoln_base_pt", RADAR.DELPHI_MRR)) | 
					 | 
					 | 
					 | 
					DBC: Dict[str, Dict[str, str]] = defaultdict(lambda: dbc_dict("ford_lincoln_base_pt", RADAR.DELPHI_MRR)) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					# F-150 radar is not yet supported | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					DBC[CAR.F_150_MK14] = dbc_dict("ford_lincoln_base_pt", None) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					class Footnote(Enum): | 
					 | 
					 | 
					 | 
					class Footnote(Enum): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  FOCUS = CarFootnote( | 
					 | 
					 | 
					 | 
					  FOCUS = CarFootnote( | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -87,6 +91,7 @@ CAR_INFO: Dict[str, Union[CarInfo, List[CarInfo]]] = { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    FordCarInfo("Ford Explorer 2020-22"), | 
					 | 
					 | 
					 | 
					    FordCarInfo("Ford Explorer 2020-22"), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    FordCarInfo("Lincoln Aviator 2020-21", "Co-Pilot360 Plus"), | 
					 | 
					 | 
					 | 
					    FordCarInfo("Lincoln Aviator 2020-21", "Co-Pilot360 Plus"), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  ], | 
					 | 
					 | 
					 | 
					  ], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  CAR.F_150_MK14: FordCarInfo("Ford F-150 2023", "Co-Pilot360 Active 2.0"), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  CAR.FOCUS_MK4: FordCarInfo("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS]), | 
					 | 
					 | 
					 | 
					  CAR.FOCUS_MK4: FordCarInfo("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS]), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  CAR.MAVERICK_MK1: FordCarInfo("Ford Maverick 2022-23", "Co-Pilot360 Assist"), | 
					 | 
					 | 
					 | 
					  CAR.MAVERICK_MK1: FordCarInfo("Ford Maverick 2022-23", "Co-Pilot360 Assist"), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -96,13 +101,17 @@ FW_QUERY_CONFIG = FwQueryConfig( | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    Request( | 
					 | 
					 | 
					 | 
					    Request( | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], | 
					 | 
					 | 
					 | 
					      [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], | 
					 | 
					 | 
					 | 
					      [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      whitelist_ecus=[Ecu.engine], | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ), | 
					 | 
					 | 
					 | 
					    ), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    Request( | 
					 | 
					 | 
					 | 
					    Request( | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], | 
					 | 
					 | 
					 | 
					      [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], | 
					 | 
					 | 
					 | 
					      [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      bus=0, | 
					 | 
					 | 
					 | 
					      bus=0, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      whitelist_ecus=[Ecu.eps, Ecu.abs, Ecu.fwdRadar, Ecu.fwdCamera, Ecu.shiftByWire], | 
					 | 
					 | 
					 | 
					    ), | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    Request( | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      bus=0, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      auxiliary=True, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ), | 
					 | 
					 | 
					 | 
					    ), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  ], | 
					 | 
					 | 
					 | 
					  ], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  extra_ecus=[ | 
					 | 
					 | 
					 | 
					  extra_ecus=[ | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -197,6 +206,23 @@ FW_VERSIONS = { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      b'NB5A-14C204-HB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', | 
					 | 
					 | 
					 | 
					      b'NB5A-14C204-HB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ], | 
					 | 
					 | 
					 | 
					    ], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }, | 
					 | 
					 | 
					 | 
					  }, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  CAR.F_150_MK14: { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    (Ecu.eps, 0x730, None): [ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      b'ML3V-14D003-BC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    ], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    (Ecu.abs, 0x760, None): [ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      b'PL34-2D053-CA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    ], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    (Ecu.fwdRadar, 0x764, None): [ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      b'ML3T-14D049-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    ], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    (Ecu.fwdCamera, 0x706, None): [ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      b'PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    ], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    (Ecu.engine, 0x7E0, None): [ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      b'PL3A-14C204-BRB\x00\x00\x00\x00\x00\x00\x00\x00\x00', | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    ], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  }, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  CAR.FOCUS_MK4: { | 
					 | 
					 | 
					 | 
					  CAR.FOCUS_MK4: { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    (Ecu.eps, 0x730, None): [ | 
					 | 
					 | 
					 | 
					    (Ecu.eps, 0x730, None): [ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      b'JX6C-14D003-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', | 
					 | 
					 | 
					 | 
					      b'JX6C-14D003-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |