diff --git a/opendbc/can/parser_pyx.pyx b/opendbc/can/parser_pyx.pyx index 9fb0c9f021..80b932773b 100644 --- a/opendbc/can/parser_pyx.pyx +++ b/opendbc/can/parser_pyx.pyx @@ -8,7 +8,7 @@ from libcpp.vector cimport vector from libc.stdint cimport uint32_t from .common cimport CANParser as cpp_CANParser -from .common cimport dbc_lookup, SignalValue, DBC, CanData, CanFrame +from .common cimport dbc_lookup, SignalValue, DBC, CanData import numbers from collections import defaultdict @@ -18,16 +18,18 @@ cdef class CANParser: cdef: cpp_CANParser *can const DBC *dbc - vector[uint32_t] addresses + set addresses cdef readonly: dict vl dict vl_all dict ts_nanos string dbc_name + uint32_t bus def __init__(self, dbc_name, messages, bus=0): self.dbc_name = dbc_name + self.bus = bus self.dbc = dbc_lookup(dbc_name) if not self.dbc: raise RuntimeError(f"Can't find DBC: {dbc_name}") @@ -35,6 +37,7 @@ cdef class CANParser: self.vl = {} self.vl_all = {} self.ts_nanos = {} + self.addresses = set() # Convert message names into addresses and check existence in DBC cdef vector[pair[uint32_t, int]] message_v @@ -47,7 +50,7 @@ cdef class CANParser: address = m.address message_v.push_back((address, c[1])) - self.addresses.push_back(address) + self.addresses.add(address) name = m.name.decode("utf8") self.vl[address] = {} @@ -78,8 +81,6 @@ cdef class CANParser: updated_addrs = set() cdef vector[SignalValue] new_vals - cdef CanFrame* frame - cdef CanData* can_data cdef vector[CanData] can_data_array try: @@ -91,11 +92,14 @@ cdef class CANParser: can_data = &(can_data_array.emplace_back()) can_data.nanos = s[0] can_data.frames.reserve(len(s[1])) - for f in s[1]: - frame = &(can_data.frames.emplace_back()) - frame.address = f[0] - frame.dat = f[1] - frame.src = f[2] + valid_addresses = self.addresses + for address, dat, src in s[1]: + source_bus = src + if source_bus == self.bus and address in valid_addresses: + frame = &(can_data.frames.emplace_back()) + frame.address = address + frame.dat = dat + frame.src = source_bus except TypeError: raise RuntimeError("invalid parameter")