diff --git a/can/can_define.py b/can/can_define.py index 4b6f679..12c2d58 100644 --- a/can/can_define.py +++ b/can/can_define.py @@ -1,39 +1,2 @@ -from collections import defaultdict -from opendbc.can.libdbc_py import libdbc, ffi - -class CANDefine(): - def __init__(self, dbc_name): - self.dv = defaultdict(dict) - self.dbc_name = dbc_name - self.dbc = libdbc.dbc_lookup(dbc_name.encode('utf8')) - - num_vals = self.dbc[0].num_vals - - self.address_to_msg_name = {} - num_msgs = self.dbc[0].num_msgs - for i in range(num_msgs): - msg = self.dbc[0].msgs[i] - name = ffi.string(msg.name).decode('utf8') - address = msg.address - self.address_to_msg_name[address] = name - - for i in range(num_vals): - val = self.dbc[0].vals[i] - - sgname = ffi.string(val.name).decode('utf8') - address = val.address - def_val = ffi.string(val.def_val).decode('utf8') - - #separate definition/value pairs - def_val = def_val.split() - values = [int(v) for v in def_val[::2]] - defs = def_val[1::2] - - if address not in self.dv: - self.dv[address] = {} - msgname = self.address_to_msg_name[address] - self.dv[msgname] = {} - - # two ways to lookup: address or msg name - self.dv[address][sgname] = dict(zip(values, defs)) - self.dv[msgname][sgname] = self.dv[address][sgname] +from opendbc.can.parser_pyx import CANDefine # pylint: disable=no-name-in-module, import-error +assert CANDefine diff --git a/can/parser_pyx.pyx b/can/parser_pyx.pyx index d221b2a..d7eb0c7 100644 --- a/can/parser_pyx.pyx +++ b/can/parser_pyx.pyx @@ -8,6 +8,8 @@ from libcpp.unordered_set cimport unordered_set from libc.stdint cimport uint32_t, uint64_t, uint16_t from libcpp.map cimport map +from collections import defaultdict + from common cimport CANParser as cpp_CANParser from common cimport SignalParseOptions, MessageParseOptions, dbc_lookup, SignalValue, DBC @@ -136,3 +138,51 @@ cdef class CANParser: updated_vals.update(updated_val) return updated_vals + +cdef class CANDefine(): + cdef: + const DBC *dbc + + cdef public: + dict dv + string dbc_name + + def __init__(self, dbc_name): + self.dbc_name = dbc_name + self.dbc = dbc_lookup(dbc_name) + + num_vals = self.dbc[0].num_vals + + address_to_msg_name = {} + + num_msgs = self.dbc[0].num_msgs + for i in range(num_msgs): + msg = self.dbc[0].msgs[i] + name = msg.name.decode('utf8') + address = msg.address + address_to_msg_name[address] = name + + dv = defaultdict(dict) + + for i in range(num_vals): + val = self.dbc[0].vals[i] + + sgname = val.name.decode('utf8') + address = val.address + def_val = val.def_val.decode('utf8') + + #separate definition/value pairs + def_val = def_val.split() + values = [int(v) for v in def_val[::2]] + defs = def_val[1::2] + + if address not in dv: + dv[address] = {} + msgname = address_to_msg_name[address] + dv[msgname] = {} + + # two ways to lookup: address or msg name + dv[address][sgname] = dict(zip(values, defs)) + dv[msgname][sgname] = dv[address][sgname] + + self.dv = dict(dv) diff --git a/can/tests/test_define.py b/can/tests/test_define.py index ee6e2a6..d9a6f7d 100644 --- a/can/tests/test_define.py +++ b/can/tests/test_define.py @@ -3,6 +3,7 @@ import unittest from opendbc.can.can_define import CANDefine + class TestCADNDefine(unittest.TestCase): def test_civic(self):