from selfdrive . car . interfaces import get_interface_attr
FW_VERSIONS = get_interface_attr ( ' FW_VERSIONS ' , combine_brands = True , ignore_none = True )
_FINGERPRINTS = get_interface_attr ( ' FINGERPRINTS ' , combine_brands = True , ignore_none = True )
_DEBUG_ADDRESS = { 1880 : 8 } # reserved for debug purposes
def is_valid_for_fingerprint ( msg , car_fingerprint ) :
adr = msg . address
# ignore addresses that are more than 11 bits
return ( adr in car_fingerprint and car_fingerprint [ adr ] == len ( msg . dat ) ) or adr > = 0x800
def eliminate_incompatible_cars ( msg , candidate_cars ) :
""" Removes cars that could not have sent msg.
Inputs :
msg : A cereal / log CanData message from the car .
candidate_cars : A list of cars to consider .
Returns :
A list containing the subset of candidate_cars that could have sent msg .
"""
compatible_cars = [ ]
for car_name in candidate_cars :
car_fingerprints = _FINGERPRINTS [ car_name ]
for fingerprint in car_fingerprints :
fingerprint . update ( _DEBUG_ADDRESS ) # add alien debug address
if is_valid_for_fingerprint ( msg , fingerprint ) :
compatible_cars . append ( car_name )
break
return compatible_cars
def all_known_cars ( ) :
""" Returns a list of all known car strings. """
return list ( { * FW_VERSIONS . keys ( ) , * _FINGERPRINTS . keys ( ) } )
def all_legacy_fingerprint_cars ( ) :
""" Returns a list of all known car strings, FPv1 only. """
return list ( _FINGERPRINTS . keys ( ) )