diff options
author | Gerhard Sittig <gerhard.sittig@gmx.net> | 2017-06-18 20:46:40 +0200 |
---|---|---|
committer | Uwe Hermann <uwe@hermann-uwe.de> | 2017-06-21 17:45:15 +0200 |
commit | ce7018ca10f6c81f16e29db1e05a99192ce671d4 (patch) | |
tree | 1b01c5006a9f089f89dad0bf1206216d95b09604 | |
parent | cbca32378d7b18a793057a7f6c4a7a19efa53376 (diff) | |
download | libsigrokdecode-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.
-rw-r--r-- | decoders/guess_bitrate/pd.py | 30 |
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 |