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.
69 lines
2.0 KiB
69 lines
2.0 KiB
6 years ago
|
#!/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", 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 ", len(fingerprints_flat), " individual fingerprints"
|
||
|
if not valid or len(fingerprints_flat) == 0:
|
||
|
print "TEST FAILED"
|
||
|
sys.exit(1)
|
||
|
else:
|
||
|
print "TEST SUCESSFUL"
|