diff --git a/panda b/panda index 266d4573b7..ec17f75efc 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 266d4573b79802e5ad67b5558ace089417c64106 +Subproject commit ec17f75efca05c04313049e1d6dd376ef54d42ec diff --git a/selfdrive/car/fw_query_definitions.py b/selfdrive/car/fw_query_definitions.py index fd49fa8e1a..fcd0845e14 100755 --- a/selfdrive/car/fw_query_definitions.py +++ b/selfdrive/car/fw_query_definitions.py @@ -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: diff --git a/selfdrive/car/fw_versions.py b/selfdrive/car/fw_versions.py index 9f4b40147b..ab4255a8d2 100755 --- a/selfdrive/car/fw_versions.py +++ b/selfdrive/car/fw_versions.py @@ -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() diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index d640b32ac6..09b05d5166 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -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): diff --git a/selfdrive/car/vin.py b/selfdrive/car/vin.py index 400470df50..f69771546f 100755 --- a/selfdrive/car/vin.py +++ b/selfdrive/car/vin.py @@ -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