2023-09-27 15:45:31 -07:00
|
|
|
# distutils: language = c++
|
|
|
|
# cython: c_string_encoding=ascii, language_level=3
|
|
|
|
|
2024-06-11 01:36:40 +00:00
|
|
|
from libc.stdint cimport uint8_t, uint32_t
|
2023-09-27 15:45:31 -07:00
|
|
|
from libcpp.vector cimport vector
|
|
|
|
|
|
|
|
from .common cimport CANPacker as cpp_CANPacker
|
2024-06-11 01:36:40 +00:00
|
|
|
from .common cimport dbc_lookup, SignalPackValue, DBC, Msg
|
2023-09-27 15:45:31 -07:00
|
|
|
|
|
|
|
|
|
|
|
cdef class CANPacker:
|
|
|
|
cdef:
|
|
|
|
cpp_CANPacker *packer
|
|
|
|
const DBC *dbc
|
|
|
|
|
|
|
|
def __init__(self, dbc_name):
|
|
|
|
self.dbc = dbc_lookup(dbc_name)
|
|
|
|
if not self.dbc:
|
|
|
|
raise RuntimeError(f"Can't lookup {dbc_name}")
|
|
|
|
|
|
|
|
self.packer = new cpp_CANPacker(dbc_name)
|
|
|
|
|
2024-02-21 23:02:43 +00:00
|
|
|
def __dealloc__(self):
|
|
|
|
if self.packer:
|
|
|
|
del self.packer
|
|
|
|
|
2023-09-27 15:45:31 -07:00
|
|
|
cdef vector[uint8_t] pack(self, addr, values):
|
|
|
|
cdef vector[SignalPackValue] values_thing
|
|
|
|
values_thing.reserve(len(values))
|
|
|
|
cdef SignalPackValue spv
|
|
|
|
|
|
|
|
for name, value in values.iteritems():
|
|
|
|
spv.name = name.encode("utf8")
|
|
|
|
spv.value = value
|
|
|
|
values_thing.push_back(spv)
|
|
|
|
|
|
|
|
return self.packer.pack(addr, values_thing)
|
|
|
|
|
|
|
|
cpdef make_can_msg(self, name_or_addr, bus, values):
|
2024-06-11 01:36:40 +00:00
|
|
|
cdef uint32_t addr = 0
|
|
|
|
cdef const Msg* m
|
2023-11-17 23:53:40 +00:00
|
|
|
if isinstance(name_or_addr, int):
|
2023-09-27 15:45:31 -07:00
|
|
|
addr = name_or_addr
|
|
|
|
else:
|
2024-06-11 01:36:40 +00:00
|
|
|
try:
|
|
|
|
m = self.dbc.name_to_msg.at(name_or_addr.encode("utf8"))
|
|
|
|
addr = m.address
|
|
|
|
except IndexError:
|
|
|
|
# The C++ pack function will log an error message for invalid addresses
|
|
|
|
pass
|
2023-09-27 15:45:31 -07:00
|
|
|
|
|
|
|
cdef vector[uint8_t] val = self.pack(addr, values)
|
2025-01-29 09:09:58 +00:00
|
|
|
return addr, (<char *>&val[0])[:val.size()], bus
|