openpilot is an open source driver assistance system. openpilot performs the functions of Automated Lane Centering and Adaptive Cruise Control for over 200 supported car makes and models.
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

#!/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)