You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.9 KiB
64 lines
1.9 KiB
import os
|
|
from common.basedir import BASEDIR
|
|
|
|
def get_fingerprint_list():
|
|
# read all the folders in selfdrive/car and return a dict where:
|
|
# - keys are all the car models for which we have a fingerprint
|
|
# - values are lists dicts of messages that constitute the unique
|
|
# CAN fingerprint of each car model and all its variants
|
|
fingerprints = {}
|
|
for car_folder in [x[0] for x in os.walk(BASEDIR + '/selfdrive/car')]:
|
|
try:
|
|
car_name = car_folder.split('/')[-1]
|
|
values = __import__('selfdrive.car.%s.values' % car_name, fromlist=['FINGERPRINTS'])
|
|
if hasattr(values, 'FINGERPRINTS'):
|
|
car_fingerprints = values.FINGERPRINTS
|
|
else:
|
|
continue
|
|
for f, v in car_fingerprints.items():
|
|
fingerprints[f] = v
|
|
except (ImportError, IOError):
|
|
pass
|
|
return fingerprints
|
|
|
|
|
|
_FINGERPRINTS = get_fingerprint_list()
|
|
|
|
_DEBUG_ADDRESS = {1880: 8} # reserved for debug purposes
|
|
|
|
def is_valid_for_fingerprint(msg, car_fingerprint):
|
|
adr = msg.address
|
|
bus = msg.src
|
|
# ignore addresses that are more than 11 bits
|
|
return (adr in car_fingerprint and car_fingerprint[adr] == len(msg.dat)) or \
|
|
bus != 0 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(_FINGERPRINTS.keys())
|
|
|