tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb
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()}
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,
}
}
}
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
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)
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)