2019-11-22 21:46:33 -08:00
|
|
|
# distutils: language = c++
|
|
|
|
# cython: c_string_encoding=ascii, language_level=3
|
|
|
|
|
2022-02-28 09:10:34 -08:00
|
|
|
from libc.stdint cimport uint8_t, uint32_t, uint64_t
|
2019-11-22 21:46:33 -08:00
|
|
|
from libcpp.vector cimport vector
|
|
|
|
from libcpp.map cimport map
|
|
|
|
from libcpp.string cimport string
|
|
|
|
from libcpp cimport bool
|
|
|
|
from posix.dlfcn cimport dlopen, dlsym, RTLD_LAZY
|
|
|
|
|
2020-11-26 16:11:23 -08:00
|
|
|
from .common cimport CANPacker as cpp_CANPacker
|
|
|
|
from .common cimport dbc_lookup, SignalPackValue, DBC
|
2019-11-22 21:46:33 -08:00
|
|
|
|
|
|
|
|
2019-12-03 08:43:05 -08:00
|
|
|
cdef class CANPacker:
|
|
|
|
cdef:
|
|
|
|
cpp_CANPacker *packer
|
|
|
|
const DBC *dbc
|
|
|
|
map[string, (int, int)] name_to_address_and_size
|
|
|
|
map[int, int] address_to_size
|
2019-11-22 21:46:33 -08:00
|
|
|
|
|
|
|
def __init__(self, dbc_name):
|
2019-12-03 08:43:05 -08:00
|
|
|
self.dbc = dbc_lookup(dbc_name)
|
2020-09-10 06:01:34 -07:00
|
|
|
if not self.dbc:
|
2020-11-26 16:11:23 -08:00
|
|
|
raise RuntimeError(f"Can't lookup {dbc_name}")
|
|
|
|
|
2020-09-10 06:01:34 -07:00
|
|
|
self.packer = new cpp_CANPacker(dbc_name)
|
2022-05-12 17:59:33 -07:00
|
|
|
for i in range(self.dbc[0].msgs.size()):
|
2019-11-22 21:46:33 -08:00
|
|
|
msg = self.dbc[0].msgs[i]
|
|
|
|
self.name_to_address_and_size[string(msg.name)] = (msg.address, msg.size)
|
|
|
|
self.address_to_size[msg.address] = msg.size
|
|
|
|
|
2022-02-28 09:10:34 -08:00
|
|
|
cdef vector[uint8_t] pack(self, addr, values, counter):
|
2019-11-22 21:46:33 -08:00
|
|
|
cdef vector[SignalPackValue] values_thing
|
2021-09-02 14:25:47 -07:00
|
|
|
values_thing.reserve(len(values))
|
2019-11-22 21:46:33 -08:00
|
|
|
cdef SignalPackValue spv
|
|
|
|
|
|
|
|
for name, value in values.iteritems():
|
2021-09-02 14:25:47 -07:00
|
|
|
spv.name = name.encode('utf8')
|
2019-11-22 21:46:33 -08:00
|
|
|
spv.value = value
|
|
|
|
values_thing.push_back(spv)
|
|
|
|
|
2019-12-03 08:43:05 -08:00
|
|
|
return self.packer.pack(addr, values_thing, counter)
|
2019-11-22 21:46:33 -08:00
|
|
|
|
|
|
|
cpdef make_can_msg(self, name_or_addr, bus, values, counter=-1):
|
|
|
|
cdef int addr, size
|
|
|
|
if type(name_or_addr) == int:
|
|
|
|
addr = name_or_addr
|
|
|
|
size = self.address_to_size[name_or_addr]
|
|
|
|
else:
|
|
|
|
addr, size = self.name_to_address_and_size[name_or_addr.encode('utf8')]
|
2022-02-28 09:10:34 -08:00
|
|
|
|
|
|
|
cdef vector[uint8_t] val = self.pack(addr, values, counter)
|
|
|
|
return [addr, 0, (<char *>&val[0])[:size], bus]
|