]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/onewire_network/onewire_network.py
srd: avr_isp: Factor out part numbers/names to part.py.
[libsigrokdecode.git] / decoders / onewire_network / onewire_network.py
index a4f6f4af3e9cccaf4f2304ceeb5d8365e40342c9..ab11ea4436b4ce0f5db82caec843e794d95e8827 100644 (file)
@@ -24,14 +24,14 @@ import sigrokdecode as srd
 
 # Dictionary of ROM commands and their names, next state.
 command = {
-    0x33: ['READ ROM'              , 'GET ROM'   ],
-    0x0f: ['CONDITIONAL READ ROM'  , 'GET ROM'   ],
-    0xcc: ['SKIP ROM'              , 'TRANSPORT' ],
-    0x55: ['MATCH ROM'             , 'GET ROM'   ],
-    0xf0: ['SEARCH ROM'            , 'SEARCH ROM'],
-    0xec: ['CONDITIONAL SEARCH ROM', 'SEARCH ROM'],
-    0x3c: ['OVERDRIVE SKIP ROM'    , 'TRANSPORT' ],
-    0x6d: ['OVERDRIVE MATCH ROM'   , 'GET ROM'   ],
+    0x33: ['Read ROM'              , 'GET ROM'   ],
+    0x0f: ['Conditional read ROM'  , 'GET ROM'   ],
+    0xcc: ['Skip ROM'              , 'TRANSPORT' ],
+    0x55: ['Match ROM'             , 'GET ROM'   ],
+    0xf0: ['Search ROM'            , 'SEARCH ROM'],
+    0xec: ['Conditional search ROM', 'SEARCH ROM'],
+    0x3c: ['Overdrive skip ROM'    , 'TRANSPORT' ],
+    0x69: ['Overdrive match ROM'   , 'GET ROM'   ],
 }
 
 class Decoder(srd.Decoder):
@@ -47,21 +47,19 @@ class Decoder(srd.Decoder):
     optional_probes = []
     options = {}
     annotations = [
-        ['Network', 'Network layer events (device addressing)'],
+        ['Text', 'Human-readable text'],
     ]
 
     def __init__(self, **kwargs):
-        # Event timing variables
-        self.net_beg = 0
-        self.net_end = 0
-        # Network layer variables
+        self.beg = 0
+        self.end = 0
         self.state = 'COMMAND'
         self.bit_cnt = 0
         self.search = 'P'
         self.data_p = 0x0
         self.data_n = 0x0
         self.data = 0x0
-        self.net_rom = 0x0000000000000000
+        self.rom = 0x0000000000000000
 
     def start(self, metadata):
         self.out_proto = self.add(srd.OUTPUT_PROTO, 'onewire_network')
@@ -72,11 +70,11 @@ class Decoder(srd.Decoder):
 
     def putx(self, data):
         # Helper function for most annotations.
-        self.put(self.net_beg, self.net_end, self.out_ann, data)
+        self.put(self.beg, self.end, self.out_ann, data)
 
     def puty(self, data):
         # Helper function for most protocol packets.
-        self.put(self.net_beg, self.net_end, self.out_proto, data)
+        self.put(self.beg, self.end, self.out_proto, data)
 
     def decode(self, ss, es, data):
         code, val = data
@@ -86,71 +84,81 @@ class Decoder(srd.Decoder):
             self.search = 'P'
             self.bit_cnt = 0
             self.put(ss, es, self.out_ann,
-                     [0, ['RESET/PRESENCE: %s' % ('True' if val else 'False')]])
+                     [0, ['Reset/presence: %s' % ('true' if val else 'false')]])
             self.put(ss, es, self.out_proto, ['RESET/PRESENCE', val])
             self.state = 'COMMAND'
-        elif code == 'BIT':
-            if self.state == 'COMMAND':
-                # Receiving and decoding a ROM command.
-                if self.onewire_collect(8, val, ss, es):
-                    if self.data in command:
-                        self.putx([0, ['ROM COMMAND: 0x%02x \'%s\''
-                                  % (self.data, command[self.data][0])]])
-                        self.state = command[self.data][1]
-                    else:
-                        self.putx([0, ['ROM COMMAND: 0x%02x \'%s\''
-                                  % (self.data, 'UNRECOGNIZED')]])
-                        self.state = 'COMMAND ERROR'
-            elif self.state == 'GET ROM':
-                # A 64 bit device address is selected.
-                # Family code (1B) + serial number (6B) + CRC (1B)
-                if self.onewire_collect(64, val, ss, es):
-                    self.net_rom = self.data & 0xffffffffffffffff
-                    self.putx([0, ['ROM: 0x%016x' % self.net_rom]])
-                    self.puty(['ROM', self.net_rom])
-                    self.state = 'TRANSPORT'
-            elif self.state == 'SEARCH ROM':
-                # A 64 bit device address is searched for.
-                # Family code (1B) + serial number (6B) + CRC (1B)
-                if self.onewire_search(64, val, ss, es):
-                    self.net_rom = self.data & 0xffffffffffffffff
-                    self.putx([0, ['ROM: 0x%016x' % self.net_rom]])
-                    self.puty(['ROM', self.net_rom])
-                    self.state = 'TRANSPORT'
-            elif self.state == 'TRANSPORT':
-                # The transport layer is handled in byte sized units.
-                if self.onewire_collect(8, val, ss, es):
-                    self.putx([0, ['DATA: 0x%02x' % self.data]])
-                    self.puty(['DATA', self.data])
-            elif self.state == 'COMMAND ERROR':
-                # Since the command is not recognized, print raw data.
-                if self.onewire_collect(8, val, ss, es):
-                    self.putx([0, ['ROM ERROR DATA: 0x%02x' % self.data]])
+            return
+
+        # For now we're only interested in 'RESET/PRESENCE' and 'BIT' packets.
+        if code != 'BIT':
+            return
+
+        if self.state == 'COMMAND':
+            # Receiving and decoding a ROM command.
+            if self.onewire_collect(8, val, ss, es) == 0:
+                return
+            if self.data in command:
+                self.putx([0, ['ROM command: 0x%02x \'%s\''
+                          % (self.data, command[self.data][0])]])
+                self.state = command[self.data][1]
             else:
-                raise Exception('Invalid state: %s' % self.state)
+                self.putx([0, ['ROM command: 0x%02x \'%s\''
+                          % (self.data, 'unrecognized')]])
+                self.state = 'COMMAND ERROR'
+        elif self.state == 'GET ROM':
+            # A 64 bit device address is selected.
+            # Family code (1 byte) + serial number (6 bytes) + CRC (1 byte)
+            if self.onewire_collect(64, val, ss, es) == 0:
+                return
+            self.rom = self.data & 0xffffffffffffffff
+            self.putx([0, ['ROM: 0x%016x' % self.rom]])
+            self.puty(['ROM', self.rom])
+            self.state = 'TRANSPORT'
+        elif self.state == 'SEARCH ROM':
+            # A 64 bit device address is searched for.
+            # Family code (1 byte) + serial number (6 bytes) + CRC (1 byte)
+            if self.onewire_search(64, val, ss, es) == 0:
+                return
+            self.rom = self.data & 0xffffffffffffffff
+            self.putx([0, ['ROM: 0x%016x' % self.rom]])
+            self.puty(['ROM', self.rom])
+            self.state = 'TRANSPORT'
+        elif self.state == 'TRANSPORT':
+            # The transport layer is handled in byte sized units.
+            if self.onewire_collect(8, val, ss, es) == 0:
+                return
+            self.putx([0, ['Data: 0x%02x' % self.data]])
+            self.puty(['DATA', self.data])
+        elif self.state == 'COMMAND ERROR':
+            # Since the command is not recognized, print raw data.
+            if self.onewire_collect(8, val, ss, es) == 0:
+                return
+            self.putx([0, ['ROM error data: 0x%02x' % self.data]])
+        else:
+            raise Exception('Invalid state: %s' % self.state)
 
-    # Link/Network layer data collector.
+    # Data collector.
     def onewire_collect(self, length, val, ss, es):
         # Storing the sample this sequence begins with.
         if self.bit_cnt == 1:
-            self.net_beg = ss
+            self.beg = ss
         self.data = self.data & ~(1 << self.bit_cnt) | (val << self.bit_cnt)
         self.bit_cnt += 1
         # Storing the sample this sequence ends with.
         # In case the full length of the sequence is received, return 1.
         if self.bit_cnt == length:
-            self.net_end = es
+            self.end = es
             self.data = self.data & ((1 << length) - 1)
             self.bit_cnt = 0
             return 1
         else:
             return 0
 
-    # Link/Network layer search collector.
+    # Search collector.
     def onewire_search(self, length, val, ss, es):
         # Storing the sample this sequence begins with.
         if (self.bit_cnt == 0) and (self.search == 'P'):
-            self.net_beg = ss
+            self.beg = ss
 
         if self.search == 'P':
             # Master receives an original address bit.
@@ -171,7 +179,7 @@ class Decoder(srd.Decoder):
         # Storing the sample this sequence ends with.
         # In case the full length of the sequence is received, return 1.
         if self.bit_cnt == length:
-            self.net_end = es
+            self.end = es
             self.data_p = self.data_p & ((1 << length) - 1)
             self.data_n = self.data_n & ((1 << length) - 1)
             self.data = self.data & ((1 << length) - 1)