]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/lin/pd.py
sdcard_sd: Use SrdStrEnum for the state machine.
[libsigrokdecode.git] / decoders / lin / pd.py
index e1b6d1b3112182b5bd8aaf1d5223a4d414490b12..11495d1177e5896012ba60c23a992ee755bd3c26 100644 (file)
@@ -41,6 +41,7 @@ class LinFsm:
 
     def reset(self):
         self.state = LinFsm.State.WaitForBreak
+        self.uart_idle_count = 0
 
     def __init__(self):
         a = dict()
@@ -53,6 +54,7 @@ class LinFsm:
         self.allowed_state = a
 
         self.state = None
+        self.uart_idle_count = 0
         self.reset()
 
 class Decoder(srd.Decoder):
@@ -63,19 +65,20 @@ class Decoder(srd.Decoder):
     desc = 'Local Interconnect Network (LIN) protocol.'
     license = 'gplv2+'
     inputs = ['uart']
-    outputs = ['lin']
+    outputs = []
+    tags = ['Automotive']
     options = (
         {'id': 'version', 'desc': 'Protocol version', 'default': 2, 'values': (1, 2)},
     )
     annotations = (
         ('data', 'LIN data'),
         ('control', 'Protocol info'),
-        ('error', 'Error descriptions'),
-        ('inline_error', 'Protocol violations and errors'),
+        ('error', 'Error description'),
+        ('inline_error', 'Protocol violation or error'),
     )
     annotation_rows = (
-        ('data', 'Data', (0, 1, 3)),
-        ('error', 'Error', (2,)),
+        ('data_vals', 'Data', (0, 1, 3)),
+        ('errors', 'Errors', (2,)),
     )
 
     def __init__(self):
@@ -86,7 +89,6 @@ class Decoder(srd.Decoder):
         self.lin_header = []
         self.lin_rsp = []
         self.lin_version = None
-        self.out_ann = None
         self.ss_block = None
         self.es_block = None
 
@@ -112,6 +114,15 @@ class Decoder(srd.Decoder):
 
         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)
 
@@ -216,6 +227,8 @@ class Decoder(srd.Decoder):
         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':