mirror of https://github.com/rusefi/opendbc.git
CANParser: add option to enforce message checks (#385)
* CANParser: add option to enforce message checks * fix testss * nice error msg * fix tests
This commit is contained in:
parent
774b4c98f6
commit
79530d3038
|
@ -33,14 +33,14 @@ cdef class CANParser:
|
|||
bool can_valid
|
||||
int can_invalid_cnt
|
||||
|
||||
def __init__(self, dbc_name, signals, checks=None, bus=0):
|
||||
def __init__(self, dbc_name, signals, checks=None, bus=0, enforce_checks=True):
|
||||
if checks is None:
|
||||
checks = []
|
||||
self.can_valid = True
|
||||
self.dbc_name = dbc_name
|
||||
self.dbc = dbc_lookup(dbc_name)
|
||||
if not self.dbc:
|
||||
raise RuntimeError("Can't lookup" + dbc_name)
|
||||
raise RuntimeError(f"Can't find DBC: {dbc_name}")
|
||||
self.vl = {}
|
||||
self.ts = {}
|
||||
|
||||
|
@ -74,6 +74,14 @@ cdef class CANParser:
|
|||
c = (self.msg_name_to_address[name], c[1])
|
||||
checks[i] = c
|
||||
|
||||
if enforce_checks:
|
||||
checked_addrs = {c[0] for c in checks}
|
||||
signal_addrs = {s[1] for s in signals}
|
||||
unchecked = signal_addrs - checked_addrs
|
||||
if len(unchecked):
|
||||
err_msg = ', '.join(f"{self.address_to_msg_name[addr].decode()} ({hex(addr)})" for addr in unchecked)
|
||||
raise RuntimeError(f"Unchecked addrs: {err_msg}")
|
||||
|
||||
cdef vector[SignalParseOptions] signal_options_v
|
||||
cdef SignalParseOptions spo
|
||||
for sig_name, sig_address, sig_default in signals:
|
||||
|
@ -108,7 +116,6 @@ cdef class CANParser:
|
|||
self.can_invalid_cnt = 0
|
||||
self.can_valid = self.can_invalid_cnt < CAN_INVALID_CNT
|
||||
|
||||
|
||||
for cv in can_values:
|
||||
# Cast char * directly to unicode
|
||||
name = <unicode>self.address_to_msg_name[cv.address].c_str()
|
||||
|
@ -149,8 +156,8 @@ cdef class CANDefine():
|
|||
self.dbc_name = dbc_name
|
||||
self.dbc = dbc_lookup(dbc_name)
|
||||
if not self.dbc:
|
||||
raise RuntimeError("Can't lookup" + dbc_name)
|
||||
|
||||
raise RuntimeError(f"Can't find DBC: '{dbc_name}'")
|
||||
|
||||
num_vals = self.dbc[0].num_vals
|
||||
|
||||
address_to_msg_name = {}
|
||||
|
|
|
@ -13,7 +13,7 @@ class TestCanParserPackerExceptions(unittest.TestCase):
|
|||
("STEER_TORQUE", "STEERING_CONTROL", 0),
|
||||
("STEER_TORQUE_REQUEST", "STEERING_CONTROL", 0),
|
||||
]
|
||||
checks = []
|
||||
checks = [("STEERING_CONTROL", 50)]
|
||||
with self.assertRaises(RuntimeError):
|
||||
CANParser(dbc_invalid, signals, checks, 0)
|
||||
with self.assertRaises(RuntimeError):
|
||||
|
@ -21,6 +21,9 @@ class TestCanParserPackerExceptions(unittest.TestCase):
|
|||
with self.assertRaises(RuntimeError):
|
||||
CANDefine(dbc_invalid)
|
||||
|
||||
with self.assertRaises(RuntimeError):
|
||||
CANParser(dbc_file, signals, [], 0)
|
||||
|
||||
# Everything is supposed to work below
|
||||
CANParser(dbc_file, signals, checks, 0)
|
||||
CANPacker(dbc_file)
|
||||
|
|
|
@ -33,7 +33,7 @@ class TestCanParserPacker(unittest.TestCase):
|
|||
("STEER_TORQUE", "STEERING_CONTROL", 0),
|
||||
("STEER_TORQUE_REQUEST", "STEERING_CONTROL", 0),
|
||||
]
|
||||
checks = []
|
||||
checks = [("STEERING_CONTROL", 50)]
|
||||
|
||||
parser = CANParser(dbc_file, signals, checks, 0)
|
||||
packer = CANPacker(dbc_file)
|
||||
|
@ -69,8 +69,7 @@ class TestCanParserPacker(unittest.TestCase):
|
|||
("LKAS_Request", "ES_LKAS", 0),
|
||||
("SET_1", "ES_LKAS", 0),
|
||||
]
|
||||
|
||||
checks = []
|
||||
checks = [("ES_LKAS", 50)]
|
||||
|
||||
parser = CANParser(dbc_file, signals, checks, 0)
|
||||
packer = CANPacker(dbc_file)
|
||||
|
|
Loading…
Reference in New Issue