#!/usr/bin/env python2 import os import sys from common.basedir import BASEDIR def _get_fingerprints(): # read all the folders in selfdrive/car and return a dict where: # - keys are all the car names that which we have a fingerprint dict for # - values are dicts of fingeprints for each trim fingerprints = {} for car_folder in [x[0] for x in os.walk(BASEDIR + '/selfdrive/car')]: car_name = car_folder.split('/')[-1] try: fingerprints[car_name] = __import__('selfdrive.car.%s.values' % car_name, fromlist=['FINGERPRINTS']).FINGERPRINTS except (ImportError, IOError, AttributeError): pass return fingerprints def check_fingerprint_consistency(f1, f2): # return false if it finds a fingerprint fully included in another # max message worth checking is 1900, as above that they usually come too infrequently and not # usable for fingerprinting max_msg = 1900 is_f1_in_f2 = True for k in f1: if (k not in f2 or f1[k] != f2[k]) and k < max_msg: is_f1_in_f2 = False is_f2_in_f1 = True for k in f2: if (k not in f1 or f2[k] != f1[k]) and k < max_msg: is_f2_in_f1 = False return not is_f1_in_f2 and not is_f2_in_f1 fingerprints = _get_fingerprints() fingerprints_flat = [] car_names = [] for brand in fingerprints: for car in fingerprints[brand]: fingerprints_flat += fingerprints[brand][car] for i in range(len(fingerprints[brand][car])): car_names.append(car) valid = True for idx1, f1 in enumerate(fingerprints_flat): for idx2, f2 in enumerate(fingerprints_flat): if idx1 < idx2 and not check_fingerprint_consistency(f1, f2): valid = False print("Those two fingerprints are inconsistent {0} {1}".format(car_names[idx1], car_names[idx2])) print("") print(', '.join("%d: %d" % v for v in sorted(f1.items()))) print("") print(', '.join("%d: %d" % v for v in sorted(f2.items()))) print("") print("Found {0} individual fingerprints".format(len(fingerprints_flat))) if not valid or len(fingerprints_flat) == 0: print("TEST FAILED") sys.exit(1) else: print("TEST SUCESSFUL")