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:
Adeeb Shihadeh 2021-04-24 23:09:56 -07:00 committed by GitHub
parent 774b4c98f6
commit 79530d3038
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 9 deletions

View File

@ -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 = {}

View File

@ -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)

View 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)