]> sigrok.org Git - libsigrokdecode.git/commitdiff
guess_bitrate: Eliminate internal state of the decoder
authorGerhard Sittig <redacted>
Sun, 18 Jun 2017 18:46:40 +0000 (20:46 +0200)
committerUwe Hermann <redacted>
Wed, 21 Jun 2017 15:45:15 +0000 (17:45 +0200)
Getting the first edge outside of the loop in .decode() greatly
simplifies the logic, any other edge then is just an update of the
previously collected data, determined by always equal code.

decoders/guess_bitrate/pd.py

index 1bccc5435dd88c7536a1eb6f8b60a0070855ccc5..e8390c6b44dfdf634c5e7ad936c4ed13edcd0d61 100644 (file)
@@ -43,8 +43,6 @@ class Decoder(srd.Decoder):
 
     def __init__(self):
         self.ss_edge = None
-        self.first_transition = True
-        self.bitwidth = None
 
     def start(self):
         self.out_ann = self.register(srd.OUTPUT_ANN)
@@ -57,19 +55,21 @@ class Decoder(srd.Decoder):
         if not self.samplerate:
             raise SamplerateError('Cannot decode without samplerate.')
 
+        # Get the first edge on the data line.
+        self.wait({0: 'e'})
+        self.ss_edge = self.samplenum
+
+        # Get any subsequent edge on the data line. Get the smallest
+        # distance between any two transitions, assuming it corresponds
+        # to one bit time of the respective bitrate of the input stream.
+        # This heuristics keeps getting better for longer captures.
+        bitwidth = None
         while True:
-            # Wait for any transition/edge on the data line.
             self.wait({0: 'e'})
 
-            # Get the smallest distance between two transitions
-            # and use that to calculate the bitrate/baudrate.
-            if self.first_transition:
-                self.ss_edge = self.samplenum
-                self.first_transition = False
-            else:
-                b = self.samplenum - self.ss_edge
-                if self.bitwidth is None or b < self.bitwidth:
-                    self.bitwidth = b
-                    bitrate = int(float(self.samplerate) / float(b))
-                    self.putx([0, ['%d' % bitrate]])
-                self.ss_edge = self.samplenum
+            b = self.samplenum - self.ss_edge
+            if bitwidth is None or b < bitwidth:
+                bitwidth = b
+                bitrate = int(float(self.samplerate) / float(b))
+                self.putx([0, ['%d' % bitrate]])
+            self.ss_edge = self.samplenum