Back to Openpilot

Subaru Fuzzy Fingerprint

tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb

0.11.02.4 KB
Original Source
python
from opendbc.car import structs
from opendbc.car.subaru.values import CAR, SubaruFlags
from opendbc.car.subaru.fingerprints import FW_VERSIONS

TEST_PLATFORMS = set(CAR) - CAR.with_flags(SubaruFlags.PREGLOBAL)

Ecu = structs.CarParams.Ecu

FW_BY_ECU = {platform: {ecu: versions for (ecu, addr, sub_addr), versions in fw_versions.items()} for platform, fw_versions in FW_VERSIONS.items()}
python
PLATFORM_CODES = {
    Ecu.abs: {
        0: {
            b'\xa5': [CAR.SUBARU_ASCENT, CAR.SUBARU_ASCENT_2023],
            b'\xa2': [CAR.SUBARU_IMPREZA, CAR.SUBARU_IMPREZA_2020, CAR.SUBARU_CROSSTREK_HYBRID],
            b'\xa1': [CAR.SUBARU_OUTBACK, CAR.SUBARU_LEGACY, CAR.SUBARU_OUTBACK_2023],
            b'\xa3': [CAR.SUBARU_FORESTER, CAR.SUBARU_FORESTER_HYBRID, CAR.SUBARU_FORESTER_2022],
            b'z': [CAR.SUBARU_IMPREZA],
        }
    }
}

YEAR_CODES = {
    Ecu.abs: {
        2: {
            b'\x18': 2018,
            b'\x19': 2019,
            b'\x20': 2020,
            b'\x21': 2021,
            b'\x22': 2022,
            b'\x23': 2023,
        }
    }
}
python
def get_codes(platforms, codes):
  results = []
  for platform in platforms:
    for ecu in codes:
      for i in codes[ecu]:
        if isinstance(i, tuple):
          j = slice(i[0], i[1])
        else:
          j = slice(i, i+1)
        for version in FW_BY_ECU[platform][ecu]:
          code = version[j]
          if code not in codes[ecu][i]:
            print(f"{platform} {code.hex()} not in {codes[ecu][i].keys()}")
          else:
            results.append((platform, codes[ecu][i][code]))
  return results
python
def test_year_code(platform, year):
  car_docs = CAR(platform).config.car_docs
  if isinstance(car_docs, list):
    car_docs = car_docs[0]
  years = [int(y) for y in car_docs.year_list]
  correct_year = year in years
  print(f"{correct_year=!s: <6} {platform=: <32} {year=: <5} {years=}")

codes = get_codes(TEST_PLATFORMS, YEAR_CODES)
for platform, year in codes:
  test_year_code(platform, year)
python
def test_platform_code(platform, platforms):
  platforms = [str(p) for p in platforms]
  in_possible_platforms = platform in platforms
  print(f"{in_possible_platforms=!s: <6} {platform=: <32} {platforms=}")

codes = get_codes(TEST_PLATFORMS, PLATFORM_CODES)
for platform, possible_platforms in codes:
  test_platform_code(platform, possible_platforms)