]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/sdq/pd.py
sdq: only use samplerate and options values after validity check
[libsigrokdecode.git] / decoders / sdq / pd.py
index 80b15ff5f304ca4d9676999df221edbe2182d225..d8df89ff5879f8ea4df1939bceb9c9882de29152 100644 (file)
@@ -17,6 +17,7 @@
 ## along with this program; if not, see <http://www.gnu.org/licenses/>.
 ##
 
+from common.srdhelper import bitpack
 import sigrokdecode as srd
 
 class SamplerateError(Exception):
@@ -58,12 +59,6 @@ class Decoder(srd.Decoder):
     def putbetu(self, data):
         self.put(self.bytepos, self.startsample + int(self.bit_width), self.out_ann, data)
 
-    def bits2num(self, bitlist):
-        number = 0
-        for i in range(len(bitlist)):
-            number += bitlist[i] * 2**i
-        return number
-
     def __init__(self):
         self.reset()
 
@@ -80,16 +75,13 @@ class Decoder(srd.Decoder):
     def metadata(self, key, value):
         if key == srd.SRD_CONF_SAMPLERATE:
             self.samplerate = value
-            self.bit_width = float(self.samplerate) / float(self.options['bitrate'])
-            self.half_bit_width = self.bit_width / 2.0
-            self.break_threshold = self.bit_width * 1.2 # Break if the line is low for longer than this
 
     def handle_bit(self, bit):
         self.bits.append(bit)
         self.putetu([0, ['Bit: %d' % bit, '%d' % bit]])
 
         if len(self.bits) == 8:
-            byte = self.bits2num(self.bits)
+            byte = bitpack(self.bits)
             self.putbetu([1, ['Byte: %#04x' % byte, '%#04x' % byte]])
             self.bits = []
             self.bytepos = 0
@@ -103,6 +95,10 @@ class Decoder(srd.Decoder):
     def decode(self):
         if not self.samplerate:
             raise SamplerateError('Cannot decode without samplerate.')
+        self.bit_width = float(self.samplerate) / float(self.options['bitrate'])
+        self.half_bit_width = self.bit_width / 2.0
+        # BREAK if the line is low for longer than this.
+        self.break_threshold = self.bit_width * 1.2
 
         while True:
             if self.state == 'INIT':