diff options
-rw-r--r-- | decoders/pjdl/pd.py | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/decoders/pjdl/pd.py b/decoders/pjdl/pd.py index dc30358..d5cc39f 100644 --- a/decoders/pjdl/pd.py +++ b/decoders/pjdl/pd.py @@ -510,7 +510,9 @@ class Decoder(srd.Decoder): is_short = bit_level and self.span_is_short(span) if is_pad: - ss, es = last_snum, curr_snum + # BEWARE! Use ss value of last edge (genuinely seen, or + # inserted after a DATA byte) for PAD bit annotations. + ss, es = self.edges[-2], curr_snum texts = ['PAD', '{:d}'.format(bit_level)] self.putg(ss, es, [ANN_PAD_BIT, texts]) self.symbols_append(ss, es, 'PAD_BIT', bit_level) @@ -674,10 +676,20 @@ class Decoder(srd.Decoder): # the transmitter's and the sender's timings differ within a # margin, and the transmitter may hold the last DATA bit's # HIGH level for a little longer. + # + # When no falling edge is seen within the maximum tolerance + # for the last DATA bit, then this could be the combination + # of a HIGH DATA bit and a PAD bit without a LOW in between. + # Fake an edge in that case, to re-use existing code paths. + # Make sure to keep referencing times to the last SYNC pad's + # falling edge. This is the last reliable condition we have. if curr_level: hold = self.hold_high_width curr_level, = self.wait([{PIN_DATA: 'l'}, {'skip': int(hold)}]) self.carrier_check(curr_level, self.samplenum) + if self.matched[1]: + self.edges.append(curr_snum) + curr_level = 1 - curr_level curr_snum = self.samplenum # Get the byte value from the bits (when available). |