]> sigrok.org Git - libsigrokdecode.git/commitdiff
lin: calculate checksum on two consecutive UART idle frames
authorStephan Thiele <redacted>
Sun, 10 Nov 2019 16:11:34 +0000 (17:11 +0100)
committerUwe Hermann <redacted>
Fri, 29 Nov 2019 19:10:10 +0000 (20:10 +0100)
decoders/lin/pd.py

index 216d4167e7b18ac5a0fdb1e65ed1210c84890975..426cbf0520f4f0208fc905ac8a5af1addb0a6e56 100644 (file)
@@ -41,6 +41,7 @@ class LinFsm:
 
     def reset(self):
         self.state = LinFsm.State.WaitForBreak
 
     def reset(self):
         self.state = LinFsm.State.WaitForBreak
+        self.uart_idle_count = 0
 
     def __init__(self):
         a = dict()
 
     def __init__(self):
         a = dict()
@@ -53,6 +54,7 @@ class LinFsm:
         self.allowed_state = a
 
         self.state = None
         self.allowed_state = a
 
         self.state = None
+        self.uart_idle_count = 0
         self.reset()
 
 class Decoder(srd.Decoder):
         self.reset()
 
 class Decoder(srd.Decoder):
@@ -113,6 +115,15 @@ class Decoder(srd.Decoder):
 
         return True
 
 
         return True
 
+    def handle_uart_idle(self):
+        if self.fsm.state not in (LinFsm.State.WaitForBreak, LinFsm.State.Error):
+            self.fsm.uart_idle_count += 1
+
+            if self.fsm.uart_idle_count == 2:
+                self.fsm.transit(LinFsm.State.Checksum)
+                self.handle_checksum()
+                self.fsm.reset()
+
     def handle_wait_for_break(self, value):
         self.wipe_break_null_byte(value)
 
     def handle_wait_for_break(self, value):
         self.wipe_break_null_byte(value)
 
@@ -217,6 +228,8 @@ class Decoder(srd.Decoder):
         self.ss_block, self.es_block = ss, es
 
         # Ignore all UART packets except the actual data packets or BREAK.
         self.ss_block, self.es_block = ss, es
 
         # Ignore all UART packets except the actual data packets or BREAK.
+        if ptype == 'IDLE':
+            self.handle_uart_idle()
         if ptype == 'BREAK':
             self.handle_break(pdata)
         if ptype != 'DATA':
         if ptype == 'BREAK':
             self.handle_break(pdata)
         if ptype != 'DATA':