#!/usr/bin/env python3
import jinja2
import os
from cereal import car
from openpilot . common . basedir import BASEDIR
from openpilot . selfdrive . car . interfaces import get_interface_attr
Ecu = car . CarParams . Ecu
CARS = get_interface_attr ( ' CAR ' )
FW_VERSIONS = get_interface_attr ( ' FW_VERSIONS ' )
FINGERPRINTS = get_interface_attr ( ' FINGERPRINTS ' )
ECU_NAME = { v : k for k , v in Ecu . schema . enumerants . items ( ) }
FINGERPRINTS_PY_TEMPLATE = jinja2 . Template ( """
{ % - if FINGERPRINTS [ brand ] % }
# ruff: noqa: E501
{ % endif % }
{ % if FW_VERSIONS [ brand ] % }
from cereal import car
{ % endif % }
from openpilot . selfdrive . car . { { brand } } . values import CAR
{ % if FW_VERSIONS [ brand ] % }
Ecu = car . CarParams . Ecu
{ % endif % }
{ % if comments + % }
{ { comments | join ( ) } }
{ % endif % }
{ % if FINGERPRINTS [ brand ] % }
FINGERPRINTS = {
{ % for car , fingerprints in FINGERPRINTS [ brand ] . items ( ) % }
CAR . { { car . name } } : [ {
{ % for fingerprint in fingerprints % }
{ % if not loop . first % }
{ { " { " } }
{ % endif % }
{ % for key , value in fingerprint . items ( ) % } { { key } } : { { value } } { % if not loop . last % } , { % endif % } { % endfor % }
} { % if loop . last % } ] { % endif % } ,
{ % endfor % }
{ % endfor % }
}
{ % endif % }
FW_VERSIONS { % if not FW_VERSIONS [ brand ] % } : dict [ str , dict [ tuple , list [ bytes ] ] ] { % endif % } = {
{ % for car , _ in FW_VERSIONS [ brand ] . items ( ) % }
CAR . { { car . name } } : {
{ % for key , fw_versions in FW_VERSIONS [ brand ] [ car ] . items ( ) % }
( Ecu . { { ECU_NAME [ key [ 0 ] ] } } , 0 x { { " %0x " | format ( key [ 1 ] | int ) } } , \
{ % if key [ 2 ] % } 0 x { { " %0x " | format ( key [ 2 ] | int ) } } { % else % } { { key [ 2 ] } } { % endif % } ) : [
{ % for fw_version in ( fw_versions + extra_fw_versions . get ( car , { } ) . get ( key , [ ] ) ) | unique | sort % }
{ { fw_version } } ,
{ % endfor % }
] ,
{ % endfor % }
} ,
{ % endfor % }
}
""" , trim_blocks=True)
def format_brand_fw_versions ( brand , extra_fw_versions : None | dict [ str , dict [ tuple , list [ bytes ] ] ] = None ) :
extra_fw_versions = extra_fw_versions or { }
fingerprints_file = os . path . join ( BASEDIR , f " selfdrive/car/ { brand } /fingerprints.py " )
with open ( fingerprints_file ) as f :
comments = [ line for line in f . readlines ( ) if line . startswith ( " # " ) and " noqa " not in line ]
with open ( fingerprints_file , " w " ) as f :
f . write ( FINGERPRINTS_PY_TEMPLATE . render ( brand = brand , comments = comments , ECU_NAME = ECU_NAME ,
FINGERPRINTS = FINGERPRINTS , FW_VERSIONS = FW_VERSIONS ,
extra_fw_versions = extra_fw_versions ) )
if __name__ == " __main__ " :
for brand in FW_VERSIONS . keys ( ) :
format_brand_fw_versions ( brand )