diff --git a/opendbc/can/parser_pyx.pyx b/opendbc/can/parser_pyx.pyx index f35995cd72..93d3ccb481 100644 --- a/opendbc/can/parser_pyx.pyx +++ b/opendbc/can/parser_pyx.pyx @@ -4,7 +4,7 @@ from libcpp.pair cimport pair from libcpp.string cimport string from libcpp.vector cimport vector -from libc.stdint cimport uint32_t +from libc.stdint cimport uint32_t, uintptr_t from .common cimport CANParser as cpp_CANParser from .common cimport dbc_lookup, Msg, DBC, CanData @@ -67,13 +67,20 @@ cdef class CANParser: if self.can: del self.can - def update_strings(self, strings, sendcan=False): + def update_strings(self, data, sendcan=False): + # If data is a Python nested list, update using the legacy method + if not hasattr(data, "get_data_pointer"): + return self.update_from_list(data, sendcan) + + # If data is a ParsedCanData object, directly use the underlying C++ vector[CanData] + cdef uintptr_t pointer = data.get_data_pointer() + can_data = pointer + return self._update(can_data[0], sendcan) + + def update_from_list(self, strings, sendcan=False): # input format: # [nanos, [[address, data, src], ...]] # [[nanos, [[address, data, src], ...], ...]] - for address in self.addresses: - self.vl_all[address].clear() - cdef vector[CanData] can_data_array try: @@ -95,6 +102,12 @@ cdef class CANParser: except TypeError: raise RuntimeError("invalid parameter") + return self._update(can_data_array, sendcan) + + cdef _update(self, vector[CanData] &can_data_array, sendcan): + for address in self.addresses: + self.vl_all[address].clear() + updated_addrs = self.can.update(can_data_array) for addr in updated_addrs: vl = self.vl[addr]