From f7d3dfd0378911361e00f2261b0e1f0b910e6fcf Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 2 Nov 2026 06:46:06 +0000 Subject: [PATCH] Rate limit CAN timeout logs (#3898) --- opendbc_repo/opendbc/can/parser.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/opendbc_repo/opendbc/can/parser.py b/opendbc_repo/opendbc/can/parser.py index 58e70cfbd3..0870197786 100644 --- a/opendbc_repo/opendbc/can/parser.py +++ b/opendbc_repo/opendbc/can/parser.py @@ -146,6 +146,7 @@ class CANParser: self.can_invalid_cnt: int = CAN_INVALID_CNT self.last_nonempty_nanos: int = 0 self._last_update_nanos: int = 0 + self._last_invalid_log_nanos: int | None = None def _add_message(self, name_or_addr: str | int, freq: float | None = None) -> None: if isinstance(name_or_addr, numbers.Number): @@ -201,13 +202,20 @@ class CANParser: valid = True counters_valid = True bus_timeout = self.bus_timeout + invalid_messages = set() for state in self.message_states.values(): if state.counter_fail >= MAX_BAD_COUNTER: counters_valid = False state.rate_limited_log(self._last_update_nanos, f"counter invalid, {state.counter_fail=} {MAX_BAD_COUNTER=}") if not state.valid(self._last_update_nanos, bus_timeout): valid = False - state.rate_limited_log(self._last_update_nanos, "not valid (timeout or missing)") + invalid_messages.add(state.address) + + if invalid_messages and (self._last_invalid_log_nanos is None or + self._last_update_nanos - self._last_invalid_log_nanos >= 10_000_000_000): + messages = ', '.join(f"{hex(addr)} {self.message_states[addr].name}" for addr in sorted(invalid_messages)) + carlog.warning(f"CANParser: bus {self.bus} not valid (timeout or missing): {messages}") + self._last_invalid_log_nanos = self._last_update_nanos # TODO: probably only want to increment this once per update() call self.can_invalid_cnt = 0 if valid else min(self.can_invalid_cnt + 1, CAN_INVALID_CNT)