mirror of https://github.com/rusefi/opendbc.git
CANParser: invalid until valid (#648)
* CANParser: invalid until valid * small test
This commit is contained in:
parent
f4b182dae4
commit
82be71072c
|
@ -39,7 +39,7 @@ public:
|
||||||
std::vector<double> vals;
|
std::vector<double> vals;
|
||||||
std::vector<std::vector<double>> all_vals;
|
std::vector<std::vector<double>> all_vals;
|
||||||
|
|
||||||
uint64_t seen;
|
uint64_t last_seen_nanos;
|
||||||
uint64_t check_threshold;
|
uint64_t check_threshold;
|
||||||
|
|
||||||
uint8_t counter;
|
uint8_t counter;
|
||||||
|
|
|
@ -78,7 +78,7 @@ bool MessageState::parse(uint64_t sec, const std::vector<uint8_t> &dat) {
|
||||||
vals[i] = tmp * sig.factor + sig.offset;
|
vals[i] = tmp * sig.factor + sig.offset;
|
||||||
all_vals[i].push_back(vals[i]);
|
all_vals[i].push_back(vals[i]);
|
||||||
}
|
}
|
||||||
seen = sec;
|
last_seen_nanos = sec;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -290,11 +290,14 @@ void CANParser::UpdateValid(uint64_t sec) {
|
||||||
can_valid = true;
|
can_valid = true;
|
||||||
for (const auto& kv : message_states) {
|
for (const auto& kv : message_states) {
|
||||||
const auto& state = kv.second;
|
const auto& state = kv.second;
|
||||||
if (state.check_threshold > 0 && (sec - state.seen) > state.check_threshold) {
|
|
||||||
if (state.seen > 0) {
|
const bool missing = state.last_seen_nanos == 0;
|
||||||
LOGE("0x%X TIMEOUT", state.address);
|
const bool timed_out = (sec - state.last_seen_nanos) > state.check_threshold;
|
||||||
} else if (show_missing) {
|
if (state.check_threshold > 0 && (missing || timed_out)) {
|
||||||
|
if (missing) {
|
||||||
LOGE("0x%X MISSING", state.address);
|
LOGE("0x%X MISSING", state.address);
|
||||||
|
} else if (show_missing) {
|
||||||
|
LOGE("0x%X TIMEOUT", state.address);
|
||||||
}
|
}
|
||||||
can_valid = false;
|
can_valid = false;
|
||||||
}
|
}
|
||||||
|
@ -306,7 +309,7 @@ std::vector<SignalValue> CANParser::query_latest() {
|
||||||
|
|
||||||
for (auto& kv : message_states) {
|
for (auto& kv : message_states) {
|
||||||
auto& state = kv.second;
|
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++) {
|
for (int i = 0; i < state.parse_sigs.size(); i++) {
|
||||||
const Signal &sig = state.parse_sigs[i];
|
const Signal &sig = state.parse_sigs[i];
|
||||||
|
|
|
@ -45,6 +45,32 @@ class TestCanParserPacker(unittest.TestCase):
|
||||||
self.assertEqual(bus, b)
|
self.assertEqual(bus, b)
|
||||||
self.assertEqual(dat[0], i)
|
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):
|
def test_packer_parser(self):
|
||||||
|
|
||||||
signals = [
|
signals = [
|
||||||
|
|
Loading…
Reference in New Issue