FW query: query one sub-address in parallel (#28675)

* put one subaddr in parallel_addrs

* p

* remove print

* update test refs

* test

* revert test changes

* do same in present ECU query, lower threshold to catch (~0.82 to ~0.72 right within bounds)

* type

* clean up

* update test ref
pull/29550/head
Shane Smiskol 2 years ago committed by GitHub
parent 8a7281d285
commit 861ceb2fee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 12
      selfdrive/car/fw_versions.py
  2. 6
      selfdrive/car/tests/test_fw_fingerprint.py

@ -185,11 +185,13 @@ def get_present_ecus(logcan, sendcan, num_pandas=1) -> Set[EcuAddrBusType]:
if len(r.whitelist_ecus) == 0 or ecu_type in r.whitelist_ecus: if len(r.whitelist_ecus) == 0 or ecu_type in r.whitelist_ecus:
a = (addr, sub_addr, r.bus) a = (addr, sub_addr, r.bus)
# Build set of queries # Build set of queries
if sub_addr is None: # Add first sub-address to parallel queries since there will be no conflicts
sub_addr_in_parallel_addrs = any(p[1] is not None for p in parallel_queries[r.obd_multiplexing])
if sub_addr is None or not sub_addr_in_parallel_addrs:
if a not in parallel_queries[r.obd_multiplexing]: if a not in parallel_queries[r.obd_multiplexing]:
parallel_queries[r.obd_multiplexing].append(a) parallel_queries[r.obd_multiplexing].append(a)
else: # subaddresses must be queried one by one else: # subaddresses must be queried one by one
if [a] not in queries[r.obd_multiplexing]: if [a] not in queries[r.obd_multiplexing] and a not in parallel_queries[r.obd_multiplexing]:
queries[r.obd_multiplexing].append([a]) queries[r.obd_multiplexing].append([a])
# Build set of expected responses to filter # Build set of expected responses to filter
@ -282,11 +284,13 @@ def get_fw_versions(logcan, sendcan, query_brand=None, extra=None, timeout=0.1,
if a not in ecu_types: if a not in ecu_types:
ecu_types[a] = ecu_type ecu_types[a] = ecu_type
if sub_addr is None: # Add first sub-address to parallel queries since there will be no conflicts
sub_addr_in_parallel_addrs = any(p[2] is not None for p in parallel_addrs)
if sub_addr is None or not sub_addr_in_parallel_addrs:
if a not in parallel_addrs: if a not in parallel_addrs:
parallel_addrs.append(a) parallel_addrs.append(a)
else: else:
if [a] not in addrs: if [a] not in addrs and a not in parallel_addrs:
addrs.append([a]) addrs.append([a])
addrs.insert(0, parallel_addrs) addrs.insert(0, parallel_addrs)

@ -206,7 +206,7 @@ class TestFwFingerprintTiming(unittest.TestCase):
def test_startup_timing(self): def test_startup_timing(self):
# Tests worse-case VIN query time and typical present ECU query time # Tests worse-case VIN query time and typical present ECU query time
vin_ref_time = 1.0 vin_ref_time = 1.0
present_ecu_ref_time = 0.8 present_ecu_ref_time = 0.7
fake_socket = FakeSocket() fake_socket = FakeSocket()
present_ecu_time = 0.0 present_ecu_time = 0.0
@ -225,7 +225,7 @@ class TestFwFingerprintTiming(unittest.TestCase):
print(f'get_vin, query time={vin_time / self.N} seconds') print(f'get_vin, query time={vin_time / self.N} seconds')
def test_fw_query_timing(self): def test_fw_query_timing(self):
total_ref_time = 6.1 total_ref_time = 5.9
brand_ref_times = { brand_ref_times = {
1: { 1: {
'body': 0.1, 'body': 0.1,
@ -237,7 +237,7 @@ class TestFwFingerprintTiming(unittest.TestCase):
'nissan': 0.4, 'nissan': 0.4,
'subaru': 0.2, 'subaru': 0.2,
'tesla': 0.2, 'tesla': 0.2,
'toyota': 1.6, 'toyota': 1.4,
'volkswagen': 0.2, 'volkswagen': 0.2,
}, },
2: { 2: {

Loading…
Cancel
Save