Skip to content

Commit

Permalink
filter CAN messages by relevant addresses
Browse files Browse the repository at this point in the history
  • Loading branch information
deanlee committed Oct 16, 2024
1 parent 2f0385d commit b2f189d
Showing 1 changed file with 14 additions and 10 deletions.
24 changes: 14 additions & 10 deletions opendbc/can/parser_pyx.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -18,23 +18,26 @@ 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}")

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
Expand All @@ -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] = {}
Expand Down Expand Up @@ -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:
Expand All @@ -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 = <uint32_t>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")

Expand Down

0 comments on commit b2f189d

Please sign in to comment.