Skip to content

Commit bdf5fa8

Browse files
Improve NotifierBasedCanStack handling of error and remote frames (#143)
* Resolves #142 by inspecting incoming frames from the notifier and throwing away error frames and remote frames. --------- Co-authored-by: tbeswick <[email protected]>
1 parent f364a9c commit bdf5fa8

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

isotp/protocol.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1808,14 +1808,20 @@ def __init__(self, bus: "can.BusABC", notifier: "can.Notifier", *args: Any, **kw
18081808

18091809
def start(self) -> None:
18101810
self.buffered_reader = can.BufferedReader()
1811-
self.notifier.add_listener(self.buffered_reader)
1811+
self.notifier.add_listener(self._on_message_received)
18121812
super().start()
18131813

18141814
def stop(self) -> None:
18151815
try:
18161816
if self.buffered_reader is not None:
1817-
self.notifier.remove_listener(self.buffered_reader)
1817+
self.notifier.remove_listener(self._on_message_received)
18181818
except Exception:
18191819
pass
18201820
self.buffered_reader = None
18211821
super().stop()
1822+
1823+
def _on_message_received(self, msg: "can.Message") -> None:
1824+
if msg.is_error_frame or msg.is_remote_frame:
1825+
return
1826+
if self.buffered_reader is not None:
1827+
self.buffered_reader.on_message_received(msg)

test/test_can_stack.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,18 @@ def test_send_10000(self):
131131
self.assertEqual(data, payload)
132132
self.assert_no_error_reported()
133133

134+
def test_1000_error_frames(self):
135+
error_frame = can.Message(arbitration_id=0x8, is_extended_id=False, is_error_frame=True,
136+
data=[0x0, 0x19, 0x81, 0x0])
137+
for i in range(1000):
138+
self.bus.send(error_frame)
139+
140+
payload = bytearray([x & 0xFF for x in range(5)])
141+
self.layer1.send(payload)
142+
data = self.layer2.recv(block=True, timeout=3)
143+
self.assertEqual(data, payload)
144+
self.assert_no_error_reported()
145+
134146

135147
if __name__ == '__main__':
136148
unittest.main()

0 commit comments

Comments
 (0)