diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index 8c0fd7c90d..894f45b6c6 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -75,6 +75,10 @@ interface_names = _get_interface_names() interfaces = load_interfaces(interface_names) +def only_toyota_left(candidate_cars): + return all(("TOYOTA" in c or "LEXUS" in c) for c in candidate_cars) and len(candidate_cars) > 0 + + # **** for use live only **** def fingerprint(logcan, sendcan): fixed_fingerprint = os.environ.get('FINGERPRINT', "") @@ -134,13 +138,19 @@ def fingerprint(logcan, sendcan): finger[can.src][can.address] = len(can.dat) for b in candidate_cars: + # Include bus 2 for toyotas to disambiguate cars using camera messages + # (ideally should be done for all cars but we can't for Honda Bosch) # Ignore extended messages and VIN query response. - if can.src == b and can.address < 0x800 and can.address not in (0x7df, 0x7e0, 0x7e8): + if (can.src == b or (only_toyota_left(candidate_cars[b]) and can.src == 2)) and \ + can.address < 0x800 and can.address not in (0x7df, 0x7e0, 0x7e8): candidate_cars[b] = eliminate_incompatible_cars(can, candidate_cars[b]) # if we only have one car choice and the time since we got our first # message has elapsed, exit for b in candidate_cars: + # Toyota needs higher time to fingerprint, since DSU does not broadcast immediately + if only_toyota_left(candidate_cars[b]): + frame_fingerprint = 100 # 1s if len(candidate_cars[b]) == 1 and frame > frame_fingerprint: # fingerprint done car_fingerprint = candidate_cars[b][0]