|  |  |  | @ -1,4 +1,5 @@ | 
			
		
	
		
			
				
					|  |  |  |  | from dataclasses import dataclass, field | 
			
		
	
		
			
				
					|  |  |  |  | import copy | 
			
		
	
		
			
				
					|  |  |  |  | from dataclasses import dataclass, field, replace | 
			
		
	
		
			
				
					|  |  |  |  | from enum import Enum, IntFlag | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | import panda.python.uds as uds | 
			
		
	
	
		
			
				
					|  |  |  | @ -60,6 +61,8 @@ class Footnote(Enum): | 
			
		
	
		
			
				
					|  |  |  |  | @dataclass | 
			
		
	
		
			
				
					|  |  |  |  | class FordCarDocs(CarDocs): | 
			
		
	
		
			
				
					|  |  |  |  |   package: str = "Co-Pilot360 Assist+" | 
			
		
	
		
			
				
					|  |  |  |  |   hybrid: bool = False | 
			
		
	
		
			
				
					|  |  |  |  |   plug_in_hybrid: bool = False | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   def init_make(self, CP: car.CarParams): | 
			
		
	
		
			
				
					|  |  |  |  |     harness = CarHarness.ford_q4 if CP.flags & FordFlags.CANFD else CarHarness.ford_q3 | 
			
		
	
	
		
			
				
					|  |  |  | @ -73,6 +76,15 @@ class FordCarDocs(CarDocs): | 
			
		
	
		
			
				
					|  |  |  |  | class FordPlatformConfig(PlatformConfig): | 
			
		
	
		
			
				
					|  |  |  |  |   dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('ford_lincoln_base_pt', RADAR.DELPHI_MRR)) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   def init(self): | 
			
		
	
		
			
				
					|  |  |  |  |     for car_info in list(self.car_info): | 
			
		
	
		
			
				
					|  |  |  |  |       if car_info.hybrid: | 
			
		
	
		
			
				
					|  |  |  |  |         name = f"{car_info.make} {car_info.model} Hybrid {car_info.years}" | 
			
		
	
		
			
				
					|  |  |  |  |         self.car_info.append(replace(copy.deepcopy(car_info), name=name)) | 
			
		
	
		
			
				
					|  |  |  |  |       if car_info.plug_in_hybrid: | 
			
		
	
		
			
				
					|  |  |  |  |         name = f"{car_info.make} {car_info.model} Plug-in Hybrid {car_info.years}" | 
			
		
	
		
			
				
					|  |  |  |  |         self.car_info.append(replace(copy.deepcopy(car_info), name=name)) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | @dataclass | 
			
		
	
		
			
				
					|  |  |  |  | class FordCANFDPlatformConfig(FordPlatformConfig): | 
			
		
	
	
		
			
				
					|  |  |  | @ -92,31 +104,22 @@ class CAR(Platforms): | 
			
		
	
		
			
				
					|  |  |  |  |   ESCAPE_MK4 = FordPlatformConfig( | 
			
		
	
		
			
				
					|  |  |  |  |     "FORD ESCAPE 4TH GEN", | 
			
		
	
		
			
				
					|  |  |  |  |     [ | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Escape 2020-22"), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Escape Hybrid 2020-22"), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Escape Plug-in Hybrid 2020-22"), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Kuga 2020-22", "Adaptive Cruise Control with Lane Centering"), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Kuga Hybrid 2020-22", "Adaptive Cruise Control with Lane Centering"), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Kuga Plug-in Hybrid 2020-22", "Adaptive Cruise Control with Lane Centering"), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Escape 2020-22", hybrid=True, plug_in_hybrid=True), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Kuga 2020-22", "Adaptive Cruise Control with Lane Centering", hybrid=True, plug_in_hybrid=True), | 
			
		
	
		
			
				
					|  |  |  |  |     ], | 
			
		
	
		
			
				
					|  |  |  |  |     CarSpecs(mass=1750, wheelbase=2.71, steerRatio=16.7), | 
			
		
	
		
			
				
					|  |  |  |  |   ) | 
			
		
	
		
			
				
					|  |  |  |  |   EXPLORER_MK6 = FordPlatformConfig( | 
			
		
	
		
			
				
					|  |  |  |  |     "FORD EXPLORER 6TH GEN", | 
			
		
	
		
			
				
					|  |  |  |  |     [ | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Explorer 2020-23"), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Explorer Hybrid 2020-23"),  # Limited and Platinum only | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Lincoln Aviator 2020-23", "Co-Pilot360 Plus"), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Lincoln Aviator Plug-in Hybrid 2020-23", "Co-Pilot360 Plus"),  # Grand Touring only | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Explorer 2020-23", hybrid=True),  # Hybrid: Limited and Platinum only | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Lincoln Aviator 2020-23", "Co-Pilot360 Plus", plug_in_hybrid=True),  # Hybrid: Grand Touring only | 
			
		
	
		
			
				
					|  |  |  |  |     ], | 
			
		
	
		
			
				
					|  |  |  |  |     CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8), | 
			
		
	
		
			
				
					|  |  |  |  |   ) | 
			
		
	
		
			
				
					|  |  |  |  |   F_150_MK14 = FordCANFDPlatformConfig( | 
			
		
	
		
			
				
					|  |  |  |  |     "FORD F-150 14TH GEN", | 
			
		
	
		
			
				
					|  |  |  |  |     [ | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford F-150 2022-23", "Co-Pilot360 Active 2.0"), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford F-150 Hybrid 2022-23", "Co-Pilot360 Active 2.0"), | 
			
		
	
		
			
				
					|  |  |  |  |     ], | 
			
		
	
		
			
				
					|  |  |  |  |     [FordCarDocs("Ford F-150 2022-23", "Co-Pilot360 Active 2.0", hybrid=True)], | 
			
		
	
		
			
				
					|  |  |  |  |     CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0), | 
			
		
	
		
			
				
					|  |  |  |  |   ) | 
			
		
	
		
			
				
					|  |  |  |  |   F_150_LIGHTNING_MK1 = FordCANFDPlatformConfig( | 
			
		
	
	
		
			
				
					|  |  |  | @ -126,19 +129,14 @@ class CAR(Platforms): | 
			
		
	
		
			
				
					|  |  |  |  |   ) | 
			
		
	
		
			
				
					|  |  |  |  |   FOCUS_MK4 = FordPlatformConfig( | 
			
		
	
		
			
				
					|  |  |  |  |     "FORD FOCUS 4TH GEN", | 
			
		
	
		
			
				
					|  |  |  |  |     [ | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS]), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Focus Hybrid 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS]),  # mHEV only | 
			
		
	
		
			
				
					|  |  |  |  |     ], | 
			
		
	
		
			
				
					|  |  |  |  |     [FordCarDocs("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS], hybrid=True)],  # mHEV only | 
			
		
	
		
			
				
					|  |  |  |  |     CarSpecs(mass=1350, wheelbase=2.7, steerRatio=15.0), | 
			
		
	
		
			
				
					|  |  |  |  |   ) | 
			
		
	
		
			
				
					|  |  |  |  |   MAVERICK_MK1 = FordPlatformConfig( | 
			
		
	
		
			
				
					|  |  |  |  |     "FORD MAVERICK 1ST GEN", | 
			
		
	
		
			
				
					|  |  |  |  |     [ | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Maverick 2022", "LARIAT Luxury"), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Maverick Hybrid 2022", "LARIAT Luxury"), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Maverick 2023-24", "Co-Pilot360 Assist"), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Maverick Hybrid 2023-24", "Co-Pilot360 Assist"), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Maverick 2022", "LARIAT Luxury", hybrid=True), | 
			
		
	
		
			
				
					|  |  |  |  |       FordCarDocs("Ford Maverick 2023-24", "Co-Pilot360 Assist", hybrid=True), | 
			
		
	
		
			
				
					|  |  |  |  |     ], | 
			
		
	
		
			
				
					|  |  |  |  |     CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0), | 
			
		
	
		
			
				
					|  |  |  |  |   ) | 
			
		
	
	
		
			
				
					|  |  |  | 
 |