mirror of https://github.com/commaai/openpilot.git
GM camera ACC: get VIN from camera (#31224)
* bump * gm vin * that's not right * only check relevant buses * instead try queries for each bus first * clean up * use default retry in function * all
This commit is contained in:
parent
5a8686b439
commit
c3fcf75737
2
panda
2
panda
|
@ -1 +1 @@
|
|||
Subproject commit 266d4573b79802e5ad67b5558ace089417c64106
|
||||
Subproject commit ec17f75efca05c04313049e1d6dd376ef54d42ec
|
|
@ -59,6 +59,9 @@ class StdQueries:
|
|||
UDS_VIN_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + p16(uds.DATA_IDENTIFIER_TYPE.VIN)
|
||||
UDS_VIN_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + p16(uds.DATA_IDENTIFIER_TYPE.VIN)
|
||||
|
||||
GM_VIN_REQUEST = b'\x1a\x90'
|
||||
GM_VIN_RESPONSE = b'\x5a\x90'
|
||||
|
||||
|
||||
@dataclass
|
||||
class Request:
|
||||
|
|
|
@ -376,7 +376,7 @@ if __name__ == "__main__":
|
|||
|
||||
t = time.time()
|
||||
print("Getting vin...")
|
||||
vin_rx_addr, vin_rx_bus, vin = get_vin(logcan, sendcan, (1, 0), retry=10, debug=args.debug)
|
||||
vin_rx_addr, vin_rx_bus, vin = get_vin(logcan, sendcan, (0, 1), retry=10, debug=args.debug)
|
||||
print(f'RX: {hex(vin_rx_addr)}, BUS: {vin_rx_bus}, VIN: {vin}')
|
||||
print(f"Getting VIN took {time.time() - t:.3f} s")
|
||||
print()
|
||||
|
|
|
@ -212,7 +212,7 @@ class TestFwFingerprintTiming(unittest.TestCase):
|
|||
|
||||
def test_startup_timing(self):
|
||||
# Tests worse-case VIN query time and typical present ECU query time
|
||||
vin_ref_time = 1.2
|
||||
vin_ref_times = {'worst': 1.5, 'best': 0.5} # best assumes we go through all queries to get a match
|
||||
present_ecu_ref_time = 0.75
|
||||
|
||||
def fake_get_ecu_addrs(*_, timeout):
|
||||
|
@ -229,12 +229,14 @@ class TestFwFingerprintTiming(unittest.TestCase):
|
|||
self._assert_timing(self.total_time / self.N, present_ecu_ref_time)
|
||||
print(f'get_present_ecus, query time={self.total_time / self.N} seconds')
|
||||
|
||||
self.total_time = 0.0
|
||||
with (mock.patch("openpilot.selfdrive.car.isotp_parallel_query.IsoTpParallelQuery.get_data", self.fake_get_data)):
|
||||
for _ in range(self.N):
|
||||
get_vin(fake_socket, fake_socket, (0, 1))
|
||||
self._assert_timing(self.total_time / self.N, vin_ref_time)
|
||||
print(f'get_vin, query time={self.total_time / self.N} seconds')
|
||||
for name, args in (('worst', {}), ('best', {'retry': 1})):
|
||||
with self.subTest(name=name):
|
||||
self.total_time = 0.0
|
||||
with (mock.patch("openpilot.selfdrive.car.isotp_parallel_query.IsoTpParallelQuery.get_data", self.fake_get_data)):
|
||||
for _ in range(self.N):
|
||||
get_vin(fake_socket, fake_socket, (0, 1), **args)
|
||||
self._assert_timing(self.total_time / self.N, vin_ref_times[name])
|
||||
print(f'get_vin {name} case, query time={self.total_time / self.N} seconds')
|
||||
|
||||
@pytest.mark.timeout(60)
|
||||
def test_fw_query_timing(self):
|
||||
|
|
|
@ -18,12 +18,20 @@ def is_valid_vin(vin: str):
|
|||
def get_vin(logcan, sendcan, buses, timeout=0.1, retry=3, debug=False):
|
||||
for i in range(retry):
|
||||
for bus in buses:
|
||||
for request, response in ((StdQueries.UDS_VIN_REQUEST, StdQueries.UDS_VIN_RESPONSE), (StdQueries.OBD_VIN_REQUEST, StdQueries.OBD_VIN_RESPONSE)):
|
||||
for request, response, valid_buses, vin_addrs, functional_addrs, rx_offset in (
|
||||
(StdQueries.UDS_VIN_REQUEST, StdQueries.UDS_VIN_RESPONSE, (0, 1), STANDARD_VIN_ADDRS, FUNCTIONAL_ADDRS, 0x8),
|
||||
(StdQueries.OBD_VIN_REQUEST, StdQueries.OBD_VIN_RESPONSE, (0, 1), STANDARD_VIN_ADDRS, FUNCTIONAL_ADDRS, 0x8),
|
||||
(StdQueries.GM_VIN_REQUEST, StdQueries.GM_VIN_RESPONSE, (0,), [0x24b], None, 0x400), # Bolt fwdCamera
|
||||
):
|
||||
if bus not in valid_buses:
|
||||
continue
|
||||
|
||||
try:
|
||||
query = IsoTpParallelQuery(sendcan, logcan, bus, STANDARD_VIN_ADDRS, [request, ], [response, ], functional_addrs=FUNCTIONAL_ADDRS, debug=debug)
|
||||
query = IsoTpParallelQuery(sendcan, logcan, bus, vin_addrs, [request, ], [response, ], response_offset=rx_offset,
|
||||
functional_addrs=functional_addrs, debug=debug)
|
||||
results = query.get_data(timeout)
|
||||
|
||||
for addr in STANDARD_VIN_ADDRS:
|
||||
for addr in vin_addrs:
|
||||
vin = results.get((addr, None))
|
||||
if vin is not None:
|
||||
# Ford pads with null bytes
|
||||
|
|
Loading…
Reference in New Issue