]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/onewire_network/onewire_network.py
srd: onewire_link/network: Reduce nesting level.
[libsigrokdecode.git] / decoders / onewire_network / onewire_network.py
index a4f6f4af3e9cccaf4f2304ceeb5d8365e40342c9..f215344af9efc711deb39870b28730be5a0ee351 100644 (file)
@@ -52,8 +52,8 @@ class Decoder(srd.Decoder):
 
     def __init__(self, **kwargs):
         # Event timing variables
-        self.net_beg = 0
-        self.net_end = 0
+        self.beg = 0
+        self.end = 0
         # Network layer variables
         self.state = 'COMMAND'
         self.bit_cnt = 0
@@ -61,7 +61,7 @@ class Decoder(srd.Decoder):
         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 +72,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
@@ -89,68 +89,78 @@ class Decoder(srd.Decoder):
                      [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 (1B) + serial number (6B) + CRC (1B)
+            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 (1B) + serial number (6B) + CRC (1B)
+            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 +181,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)