dcf77: annotate unexpected bit numbers and values, do not abort execution
authorGerhard Sittig <gerhard.sittig@gmx.net>
Mon, 16 Apr 2018 19:15:13 +0000 (21:15 +0200)
committerUwe Hermann <uwe@hermann-uwe.de>
Tue, 24 Apr 2018 19:28:59 +0000 (21:28 +0200)
Improve robustness of the DCF77 decoder. Cope with "neiter 0 nor 1" bit
values (glitches can break the detection of pulse widths), as well as
unexpected bit numbers (more than 59 pulses per minute, can be a
follow-up error after e.g. glitches break one long pulse into two short
pulses). Do not process this invalid data, do emit error annotations.

decoders/dcf77/pd.py

index 3a97d827734c71929cf245e6c4c2e7a325ebc8c7..7b09ce6ab9968f15de09ace7823df0a1e0c4ccd8 100644 (file)
@@ -249,7 +249,8 @@ class Decoder(srd.Decoder):
             self.putx([16, ['Date parity: %s' % s, 'DP: %s' % s]])
             self.datebits = []
         else:
-            raise Exception('Invalid DCF77 bit: %d' % c)
+            self.putx([19, ['Invalid DCF77 bit: %d' % c,
+                            'Invalid bit: %d' % c, 'Inv: %d' % c]])
 
     def decode(self):
         if not self.samplerate:
@@ -298,11 +299,12 @@ class Decoder(srd.Decoder):
                 elif len_high_ms in range(161, 260 + 1):
                     bit = 1
                 else:
-                    bit = -1 # TODO: Error?
+                    bit = -1
 
-                # There's no bit 59, make sure none is decoded.
-                if bit in (0, 1) and self.bitcount in range(0, 58 + 1):
+                if bit in (0, 1):
                     self.handle_dcf77_bit(bit)
                     self.bitcount += 1
+                else:
+                    self.putx([19, ['Invalid bit timing', 'Inv timing', 'Inv']])
 
                 self.state = 'WAIT FOR RISING EDGE'