From: Gerhard Sittig Date: Sun, 18 Jun 2017 18:46:40 +0000 (+0200) Subject: guess_bitrate: Eliminate internal state of the decoder X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=ce7018ca10f6c81f16e29db1e05a99192ce671d4;p=libsigrokdecode.git 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. --- 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