From: Gerhard Sittig Date: Tue, 14 Mar 2017 17:46:32 +0000 (+0100) Subject: uart: Improve robustness of query API result processing X-Git-Tag: libsigrokdecode-0.5.0~59 X-Git-Url: http://sigrok.org/gitweb/?a=commitdiff_plain;h=7d62e5b33a3404d319f42c81f3344240d430746a;p=libsigrokdecode.git uart: Improve robustness of query API result processing Since either of the UART signals (RX, TX) is optional, and in the absence of Decoder.wait() conditions that "will never match", we cannot construct a constant layout. Instead we need to explicitly keep track of which item in the list of wait conditions corresponds to which signal. Once the index in the list of wait conditions is known, inspection of samples can depend on the Decoder.matched[] attribute. Before this change, redundant reached_bit() checks kept us from processing samples that should not have been inspected. Tests pass before and after this very commit. --- diff --git a/decoders/uart/pd.py b/decoders/uart/pd.py index 2c0a7da..c6e47ca 100644 --- a/decoders/uart/pd.py +++ b/decoders/uart/pd.py @@ -423,15 +423,18 @@ class Decoder(srd.Decoder): opt = self.options inv = [opt['invert_rx'] == 'yes', opt['invert_tx'] == 'yes'] + cond_idx = [None] * len(has_pin) while True: conds = [] if has_pin[RX]: + cond_idx[RX] = len(conds) conds.append(self.get_wait_cond(RX, inv[RX])) if has_pin[TX]: + cond_idx[TX] = len(conds) conds.append(self.get_wait_cond(TX, inv[TX])) (rx, tx) = self.wait(conds) - if has_pin[RX]: + if cond_idx[RX] is not None and self.matched[cond_idx[RX]]: self.inspect_sample(RX, rx, inv[RX]) - if has_pin[TX]: + if cond_idx[TX] is not None and self.matched[cond_idx[TX]]: self.inspect_sample(TX, tx, inv[TX])