You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.1 KiB
39 lines
1.1 KiB
from collections import defaultdict
|
|
from selfdrive.can.libdbc_py import libdbc, ffi
|
|
|
|
class CANDefine(object):
|
|
def __init__(self, dbc_name):
|
|
self.dv = defaultdict(dict)
|
|
self.dbc_name = dbc_name
|
|
self.dbc = libdbc.dbc_lookup(dbc_name)
|
|
|
|
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)
|
|
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)
|
|
address = val.address
|
|
def_val = ffi.string(val.def_val)
|
|
|
|
#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] = {v: d for v, d in zip(values, defs)} #build dict
|
|
self.dv[msgname][sgname] = self.dv[address][sgname]
|
|
|