]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/maxim_ds28ea00/maxim_ds28ea00.py
srd: maxim_ds28ea00: Factor out putx(), small fixes.
[libsigrokdecode.git] / decoders / maxim_ds28ea00 / maxim_ds28ea00.py
index 96a5aabbade9cf0afb2d12a7f666ad837fcbcf71..026457e5783a7cc66c8bf54951e0ce311d003373 100644 (file)
 ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 ##
 
-# 1-Wire protocol decoder
+# Maxim DS28EA00 protocol decoder
 
 import sigrokdecode as srd
 
-# a dictionary of FUNCTION commands and their names
+# Dictionary of FUNCTION commands and their names.
 command = {
-    # scratchpad
-    0x4e: "WRITE SCRATCHPAD",
-    0xbe: "READ SCRATCHPAD",
-    0x48: "COPY SCRATCHPAD",
-    # thermometer
-    0x44: "CONVERT TEMPERATURE",
-    0xb4: "READ POWER MODE",
-    0xb8: "RECALL EEPROM",
-    0xf5: "PIO ACCESS READ",
-    0xA5: "PIO ACCESS WRITE",
-    0x99: "CHAIN",
-    # memory
-    0xf0: "READ MEMORY",
-    0xa5: "EXTENDED READ MEMORY",
-    0x0f: "WRITE MEMORY",
-    0x55: "WRITE STATUS",
-    0xaa: "READ STATUS",
-    0xf5: "CHANNEL ACCESS"
+    # Scratchpad
+    0x4e: 'Write scratchpad',
+    0xbe: 'Read scratchpad',
+    0x48: 'Copy scratchpad',
+    # Thermometer
+    0x44: 'Convert temperature',
+    0xb4: 'Read power mode',
+    0xb8: 'Recall EEPROM',
+    0xf5: 'PIO access read',
+    0xA5: 'PIO access write',
+    0x99: 'Chain',
 }
 
 class Decoder(srd.Decoder):
     api_version = 1
     id = 'maxim_ds28ea00'
-    name = '1-Wire transport layer'
-    longname = '1-Wire serial communication bus'
-    desc = 'Bidirectional, half-duplex, asynchronous serial bus.'
+    name = 'Maxim DS28EA00'
+    longname = 'Maxim DS28EA00 1-Wire digital thermometer'
+    desc = '1-Wire digital thermometer with Sequence Detect and PIO'
     license = 'gplv2+'
     inputs = ['onewire_network']
-    outputs = []
+    outputs = ['maxim_ds28ea00']
     probes = []
-    optional_probes = []
+    optional_probes = [
+        {'id': 'pioa', 'name': 'PIOA/DONE#',
+         'desc': 'PIOA channel and chain output'},
+        {'id': 'piob', 'name': 'PIOB/EN#',
+         'desc': 'PIOB channel and chain output'},
+    ]
     options = {}
     annotations = [
-        ['Transport', 'Transport layer events'],
+        ['Text', 'Human-readable text'],
     ]
 
     def __init__(self, **kwargs):
-        # Event timing variables
         self.trn_beg = 0
         self.trn_end = 0
-        # Transport layer variables
-        self.state   = 'ROM'
-        self.rom     = 0x0000000000000000
+        self.state = 'ROM'
+        self.rom = 0x0000000000000000
 
     def start(self, metadata):
-        self.out_ann   = self.add(srd.OUTPUT_ANN  , 'onewire_transport')
+        self.out_ann = self.add(srd.OUTPUT_ANN, 'maxim_ds28ea00')
 
     def report(self):
         pass
 
+    def putx(self, data):
+        self.put(self.ss, self.es, self.out_ann, data)
+
     def decode(self, ss, es, data):
-        [code, val] = data
+        code, val = data
+
+        self.ss, self.es = ss, es
 
         # State machine.
-        if (code == "RESET/PRESENCE"):
-            self.put(ss, es, self.out_ann, [0, ['RESET/PRESENCE: %s' % ('True' if val else 'False')]])
-            self.state = "ROM"
-        elif (code == "ROM"):
+        if code == 'RESET/PRESENCE':
+            self.putx([0, ['Reset/presence: %s'
+                           % ('true' if val else 'false')]])
+            self.state = 'ROM'
+        elif code == 'ROM':
             self.rom = val
-            self.put(ss, es, self.out_ann, [0, ['ROM: 0x%016x' % (val)]])
-            self.state = "COMMAND"
-        elif (code == "DATA"):
-            if (self.state == "COMMAND"):
-                    if (val in command):
-                        self.put(ss, es, self.out_ann, [0, ['FUNCTION COMMAND: 0x%02x \'%s\'' % (val, command[val])]])
-                        self.state = command[val]
-                    else:
-                        self.put(ss, es, self.out_ann, [0, ['FUNCTION COMMAND: 0x%02x \'%s\'' % (val, 'UNRECOGNIZED')]])
-                        self.state = "UNRECOGNIZED"
-            elif (self.state == "READ SCRATCHPAD"):
-                self.put(ss, es, self.out_ann, [0, ['SCRATCHPAD DATA: 0x%02x' % (val)]])
-            elif (self.state == "CONVERT TEMPERATURE"):
-                self.put(ss, es, self.out_ann, [0, ['TEMPERATURE CONVERSION STATUS: 0x%02x' % (val)]])
-            elif (self.state in command.values()):
-                self.put(ss, es, self.out_ann, [0, ['TODO "%s": 0x%02x' % (self.state, val)]])
-            elif (self.state == "UNRECOGNIZED"):
-                self.put(ss, es, self.out_ann, [0, ['UNRECOGNIZED COMMAND: 0x%02x' % (val)]])
+            self.putx([0, ['ROM: 0x%016x' % (val)]])
+            self.state = 'COMMAND'
+        elif code == 'DATA':
+            if self.state == 'COMMAND':
+                if val not in command:
+                    self.putx([0, ['Unrecognized command: 0x%02x' % val]])
+                    return
+                self.putx([0, ['Function command: 0x%02x \'%s\''
+                          % (val, command[val])]])
+                self.state = command[val].upper()
+            elif self.state == 'READ SCRATCHPAD':
+                self.putx([0, ['Scratchpad data: 0x%02x' % val]])
+            elif self.state == 'CONVERT TEMPERATURE':
+                self.putx([0, ['Temperature conversion status: 0x%02x' % val]])
+            elif self.state in [s.upper() for s in command.values()]:
+                self.putx([0, ['TODO \'%s\': 0x%02x' % (self.state, val)]])
             else:
                 raise Exception('Invalid state: %s' % self.state)
+