You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					105 lines
				
				3.4 KiB
			
		
		
			
		
	
	
					105 lines
				
				3.4 KiB
			| 
								 
											2 years ago
										 
									 | 
							
								#!/usr/bin/env python3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import argparse
							 | 
						||
| 
								 | 
							
								from openpilot.common.basedir import BASEDIR
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from openpilot.tools.lib.logreader import MultiLogIterator
							 | 
						||
| 
								 | 
							
								from openpilot.tools.lib.route import Route
							 | 
						||
| 
								 | 
							
								from openpilot.selfdrive.car.fw_versions import match_fw_to_car
							 | 
						||
| 
								 | 
							
								from openpilot.selfdrive.car.interfaces import get_interface_attr
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ALL_FW_VERSIONS = get_interface_attr("FW_VERSIONS")
							 | 
						||
| 
								 | 
							
								ALL_CARS = get_interface_attr("CAR")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PLATFORM_TO_PYTHON_CAR_NAME = {brand: {car.value: car.name for car in ALL_CARS[brand]} for brand in ALL_CARS}
							 | 
						||
| 
								 | 
							
								BRAND_TO_PLATFORMS = {brand: [car.value for car in ALL_CARS[brand]] for brand in ALL_CARS}
							 | 
						||
| 
								 | 
							
								PLATFORM_TO_BRAND = dict(sum([[(platform, brand) for platform in BRAND_TO_PLATFORMS[brand]] for brand in BRAND_TO_PLATFORMS], []))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def add_fw_versions(brand, platform, new_fw_versions):
							 | 
						||
| 
								 | 
							
								  filename = f"{BASEDIR}/selfdrive/car/{brand}/values.py"
							 | 
						||
| 
								 | 
							
								  with open(filename, "r") as f:
							 | 
						||
| 
								 | 
							
								    values_py = f.read()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for key in new_fw_versions.keys():
							 | 
						||
| 
								 | 
							
								    ecu, addr, subAddr = key
							 | 
						||
| 
								 | 
							
								    fw_version = new_fw_versions[key]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    platform_start = values_py.index(f"CAR.{PLATFORM_TO_PYTHON_CAR_NAME[brand][platform]}: {{")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    start = values_py.index(f"(Ecu.{ecu}, {hex(addr)}, {subAddr}): [", platform_start)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    try:
							 | 
						||
| 
								 | 
							
								      end_str = "],\n"
							 | 
						||
| 
								 | 
							
								      end = values_py.index(end_str, start)
							 | 
						||
| 
								 | 
							
								    except ValueError:
							 | 
						||
| 
								 | 
							
								      end_str = "]\n"
							 | 
						||
| 
								 | 
							
								      end = values_py.index(end_str, start)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    values_py = values_py[:end] + f"  {fw_version},\n    " + values_py[end:]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  with open(filename, "w") as f:
							 | 
						||
| 
								 | 
							
								    f.write(values_py)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == "__main__":
							 | 
						||
| 
								 | 
							
								  parser = argparse.ArgumentParser(description="Auto fingerprint from a route")
							 | 
						||
| 
								 | 
							
								  parser.add_argument("route", help="The route name to use")
							 | 
						||
| 
								 | 
							
								  parser.add_argument("platform", help="The platform, or leave empty to auto-determine using fuzzy", default=None, nargs='?')
							 | 
						||
| 
								 | 
							
								  args = parser.parse_args()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  route = Route(args.route)
							 | 
						||
| 
								 | 
							
								  lr = MultiLogIterator(route.qlog_paths())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  carFw = None
							 | 
						||
| 
								 | 
							
								  carVin = None
							 | 
						||
| 
								 | 
							
								  carPlatform = None
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for msg in lr:
							 | 
						||
| 
								 | 
							
								    if msg.which() == "carParams":
							 | 
						||
| 
								 | 
							
								      carFw = msg.carParams.carFw
							 | 
						||
| 
								 | 
							
								      carVin = msg.carParams.carVin
							 | 
						||
| 
								 | 
							
								      carPlatform = msg.carParams.carFingerprint
							 | 
						||
| 
								 | 
							
								      break
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if carFw is None:
							 | 
						||
| 
								 | 
							
								    raise Exception("No fw versions in the provided route...")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if args.platform is None: # attempt to auto-determine platform with other fuzzy fingerprints
							 | 
						||
| 
								 | 
							
								    _, possible_platforms = match_fw_to_car(carFw, log=False)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if len(possible_platforms) != 1:
							 | 
						||
| 
								 | 
							
								      print(f"Unable to auto-determine platform, possible platforms: {possible_platforms}")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if carPlatform != "mock":
							 | 
						||
| 
								 | 
							
								        print("Using platform from route")
							 | 
						||
| 
								 | 
							
								        platform = carPlatform
							 | 
						||
| 
								 | 
							
								      else:
							 | 
						||
| 
								 | 
							
								        raise Exception("unable to determine platform, try manually specifying the fingerprint.")
							 | 
						||
| 
								 | 
							
								    else:
							 | 
						||
| 
								 | 
							
								      platform = list(possible_platforms)[0]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  else:
							 | 
						||
| 
								 | 
							
								    platform = args.platform
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  print("Attempting to add fw version for: ", platform)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  brand = PLATFORM_TO_BRAND[platform]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  new_fw_versions = {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for fw in carFw:
							 | 
						||
| 
								 | 
							
								    if fw.brand == brand:
							 | 
						||
| 
								 | 
							
								      addr = fw.address
							 | 
						||
| 
								 | 
							
								      subAddr = None if fw.subAddress == 0 else fw.subAddress
							 | 
						||
| 
								 | 
							
								      key = (fw.ecu.raw, addr, subAddr)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if key in ALL_FW_VERSIONS[brand][platform]:
							 | 
						||
| 
								 | 
							
								        fw_versions = set(ALL_FW_VERSIONS[brand][platform][key])
							 | 
						||
| 
								 | 
							
								        if fw.fwVersion not in fw_versions:
							 | 
						||
| 
								 | 
							
								          new_fw_versions[(fw.ecu, addr, subAddr)] = fw.fwVersion
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if not new_fw_versions:
							 | 
						||
| 
								 | 
							
								    print("No new fw versions found...")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  add_fw_versions(brand, platform, new_fw_versions)
							 |