summaryrefslogtreecommitdiff
path: root/decoders/guess_bitrate
diff options
context:
space:
mode:
authorGerhard Sittig <gerhard.sittig@gmx.net>2017-06-18 20:46:40 +0200
committerUwe Hermann <uwe@hermann-uwe.de>2017-06-21 17:45:15 +0200
commitce7018ca10f6c81f16e29db1e05a99192ce671d4 (patch)
tree1b01c5006a9f089f89dad0bf1206216d95b09604 /decoders/guess_bitrate
parentcbca32378d7b18a793057a7f6c4a7a19efa53376 (diff)
downloadlibsigrokdecode-ce7018ca10f6c81f16e29db1e05a99192ce671d4.tar.gz
libsigrokdecode-ce7018ca10f6c81f16e29db1e05a99192ce671d4.zip
guess_bitrate: Eliminate internal state of the decoder
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.
Diffstat (limited to 'decoders/guess_bitrate')
-rw-r--r--decoders/guess_bitrate/pd.py30
1 files changed, 15 insertions, 15 deletions
diff --git a/decoders/guess_bitrate/pd.py b/decoders/guess_bitrate/pd.py
index 1bccc54..e8390c6 100644
--- a/decoders/guess_bitrate/pd.py
+++ b/decoders/guess_bitrate/pd.py
@@ -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