#!/usr/bin/env python3 import argparse from collections import defaultdict from openpilot.selfdrive.debug.format_fingerprints import format_brand_fw_versions from openpilot.selfdrive.car.fingerprints import MIGRATION from openpilot.selfdrive.car.fw_versions import MODEL_TO_BRAND, match_fw_to_car from openpilot.tools.lib.logreader import LogReader, ReadMode 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() lr = LogReader(args.route, ReadMode.QLOG) CP = lr.first("carParams") assert CP is not None, "No carParams in route" carPlatform = MIGRATION.get(CP.carFingerprint, CP.carFingerprint) if args.platform is not None: platform = args.platform elif carPlatform != "MOCK": platform = carPlatform else: _, matches = match_fw_to_car(CP.carFw, CP.carVin, log=False) assert len(matches) == 1, f"Unable to auto-determine platform, matches: {matches}" platform = list(matches)[0] print("Attempting to add fw version for:", platform) fw_versions: dict[str, dict[tuple, list[bytes]]] = defaultdict(lambda: defaultdict(list)) brand = MODEL_TO_BRAND[platform] for fw in CP.carFw: if fw.brand == brand and not fw.logging: addr = fw.address subAddr = None if fw.subAddress == 0 else fw.subAddress key = (fw.ecu.raw, addr, subAddr) fw_versions[platform][key].append(fw.fwVersion) format_brand_fw_versions(brand, fw_versions)