]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/sle44xx/pd.py
sle44xx: use symbolic identifiers for pins and signal transitions
[libsigrokdecode.git] / decoders / sle44xx / pd.py
index a1cd8f87b065809a058655a563cd65c019291404..1c0cdb4c9e1901bef21630900d349e3b31567edb 100644 (file)
 
 import sigrokdecode as srd
 
-'''
-OUTPUT_PYTHON format:
-
-Packet:
-[<ptype>, <pdata>]
-
-<ptype>:
- - 'RESET'  (Reset/Abort condition)
- - 'ATR'    (ATR data from card)
- - 'CMD'    (Command from reader)
- - 'DATA'   (Data from card)
-
-<pdata> is the data to/from the card
-For 'RESET' <pdata> is None.
-'''
+class Pin:
+    RST, CLK, IO, = range(3)
 
 # CMD: [annotation-type-index, long annotation, short annotation]
 proto = {
@@ -51,7 +38,7 @@ class Decoder(srd.Decoder):
     desc = 'SLE 4418/28/32/42 memory card serial protocol'
     license = 'gplv2+'
     inputs = ['logic']
-    outputs = ['sle44xx']
+    outputs = []
     tags = ['Memory']
     channels = (
         {'id': 'rst', 'name': 'RST', 'desc': 'Reset line'},
@@ -89,23 +76,18 @@ class Decoder(srd.Decoder):
             self.samplerate = value
 
     def start(self):
-        self.out_python = self.register(srd.OUTPUT_PYTHON)
         self.out_ann = self.register(srd.OUTPUT_ANN)
         self.out_binary = self.register(srd.OUTPUT_BINARY)
 
     def putx(self, data):
         self.put(self.ss, self.es, self.out_ann, data)
 
-    def putp(self, data):
-        self.put(self.ss, self.es, self.out_python, data)
-
     def putb(self, data):
         self.put(self.ss, self.es, self.out_binary, data)
 
     def handle_reset(self, pins):
         self.ss, self.es = self.samplenum, self.samplenum
         cmd = 'RESET' # No need to set the global self.cmd as this command is atomic
-        self.putp([cmd, None])
         self.putx([proto[cmd][0], proto[cmd][1:]])
         self.bitcount = self.databyte = 0
         self.bits = []
@@ -161,12 +143,24 @@ class Decoder(srd.Decoder):
 
     def decode(self):
         while True:
-            pins = self.wait([{0: 'r'}, {0: 'l', 1: 'r'}, {1: 'h', 2: 'f'}, {1: 'h', 2: 'r'}])
-            if self.matched[0]: # RESET condition (R): RST = rising
+            # Signal conditions tracked by the protocol decoder:
+            # - RESET condition (R): RST = rising
+            # - Incoming data (D): RST = low, CLK = rising.
+            # - Command mode START: CLK = high, I/O = falling.
+            # - Command mode STOP: CLK = high, I/O = rising.
+            (COND_RESET, COND_DATA, COND_CMD_START, COND_CMD_STOP,) = range(4)
+            conditions = [
+                {Pin.RST: 'r'},
+                {Pin.RST: 'l', Pin.CLK: 'r'},
+                {Pin.CLK: 'h', Pin.IO: 'f'},
+                {Pin.CLK: 'h', Pin.IO: 'r'},
+            ]
+            pins = self.wait(conditions)
+            if self.matched[COND_RESET]:
                 self.handle_reset(pins)
-            elif self.matched[1]: # Incoming data (D): RST = low, CLK = rising.
+            elif self.matched[COND_DATA]:
                 self.handle_data(pins)
-            elif self.matched[2]: # Command mode START: CLK = high, I/O = falling.
+            elif self.matched[COND_CMD_START]:
                 self.handle_command(pins)
-            elif self.matched[3]: # Command mode STOP: CLK = high, I/O = rising.
+            elif self.matched[COND_CMD_STOP]:
                 self.handle_command(pins)