From 82be71072c52fc78cf0e1eabc396af26c18ddc11 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 22 Jun 2022 15:13:59 -0700 Subject: [PATCH] CANParser: invalid until valid (#648) * CANParser: invalid until valid * small test --- can/common.h | 2 +- can/parser.cc | 15 +++++++++------ can/tests/test_packer_parser.py | 26 ++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/can/common.h b/can/common.h index 7e35e06..68a2621 100644 --- a/can/common.h +++ b/can/common.h @@ -39,7 +39,7 @@ public: std::vector vals; std::vector> all_vals; - uint64_t seen; + uint64_t last_seen_nanos; uint64_t check_threshold; uint8_t counter; diff --git a/can/parser.cc b/can/parser.cc index 7e6d604..d4e8427 100644 --- a/can/parser.cc +++ b/can/parser.cc @@ -78,7 +78,7 @@ bool MessageState::parse(uint64_t sec, const std::vector &dat) { vals[i] = tmp * sig.factor + sig.offset; all_vals[i].push_back(vals[i]); } - seen = sec; + last_seen_nanos = sec; return true; } @@ -290,11 +290,14 @@ void CANParser::UpdateValid(uint64_t sec) { can_valid = true; for (const auto& kv : message_states) { const auto& state = kv.second; - if (state.check_threshold > 0 && (sec - state.seen) > state.check_threshold) { - if (state.seen > 0) { - LOGE("0x%X TIMEOUT", state.address); - } else if (show_missing) { + + const bool missing = state.last_seen_nanos == 0; + const bool timed_out = (sec - state.last_seen_nanos) > state.check_threshold; + if (state.check_threshold > 0 && (missing || timed_out)) { + if (missing) { LOGE("0x%X MISSING", state.address); + } else if (show_missing) { + LOGE("0x%X TIMEOUT", state.address); } can_valid = false; } @@ -306,7 +309,7 @@ std::vector CANParser::query_latest() { for (auto& kv : message_states) { auto& state = kv.second; - if (last_sec != 0 && state.seen != last_sec) continue; + if (last_sec != 0 && state.last_seen_nanos != last_sec) continue; for (int i = 0; i < state.parse_sigs.size(); i++) { const Signal &sig = state.parse_sigs[i]; diff --git a/can/tests/test_packer_parser.py b/can/tests/test_packer_parser.py index 496f043..5f615aa 100755 --- a/can/tests/test_packer_parser.py +++ b/can/tests/test_packer_parser.py @@ -45,6 +45,32 @@ class TestCanParserPacker(unittest.TestCase): self.assertEqual(bus, b) self.assertEqual(dat[0], i) + def test_parser_can_valid(self): + signals = [ + ("COUNTER", "CAN_FD_MESSAGE"), + ] + checks = [("CAN_FD_MESSAGE", 10), ] + packer = CANPacker(TEST_DBC) + parser = CANParser(TEST_DBC, signals, checks, 0) + + # shouldn't be valid initially + self.assertFalse(parser.can_valid) + + # not valid until the message is seen + for _ in range(100): + dat = can_list_to_can_capnp([]) + parser.update_string(dat) + self.assertFalse(parser.can_valid) + + # valid once seen + for i in range(1, 100): + t = int(0.01 * i * 1e9) + msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, {}) + dat = can_list_to_can_capnp([msg, ], logMonoTime=t) + parser.update_string(dat) + self.assertTrue(parser.can_valid) + + def test_packer_parser(self): signals = [