]> sigrok.org Git - libsigrokdecode.git/commitdiff
uart: Improve robustness of query API result processing
authorGerhard Sittig <redacted>
Tue, 14 Mar 2017 17:46:32 +0000 (18:46 +0100)
committerGerhard Sittig <redacted>
Tue, 14 Mar 2017 18:30:53 +0000 (19:30 +0100)
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.

decoders/uart/pd.py

index 2c0a7da5a81446e129adb8f3803daeddb6db3871..c6e47cae2d6455a95dd74063de96b41b4bc547da 100644 (file)
@@ -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])