]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/dcf77/dcf77.py
srd: Performance improvements for various PDs.
[libsigrokdecode.git] / decoders / dcf77 / dcf77.py
index d8b9d3b1988151feab3e417b5a3c664ee33fd94e..c4132e956689b24c98ff77cac5152f3732ff19ed 100644 (file)
@@ -23,9 +23,6 @@
 import sigrokdecode as srd
 import calendar
 
-# Annotation feed formats
-ANN_ASCII = 0
-
 # Return the specified BCD number (max. 8 bits) as integer.
 def bcd2int(b):
     return (b & 0x0f) + ((b >> 4) * 10)
@@ -35,7 +32,7 @@ class Decoder(srd.Decoder):
     id = 'dcf77'
     name = 'DCF77'
     longname = 'DCF77 time protocol'
-    desc = 'TODO.'
+    desc = 'European longwave time signal (77.5kHz carrier signal).'
     license = 'gplv2+'
     inputs = ['logic']
     outputs = ['dcf77']
@@ -43,17 +40,19 @@ class Decoder(srd.Decoder):
         {'id': 'data', 'name': 'DATA', 'desc': 'DATA line'},
     ]
     optional_probes = [
-        {'id': 'pon', 'name': 'PON', 'desc': 'TODO'},
+        {'id': 'pon', 'name': 'PON', 'desc': 'Power on'},
     ]
     options = {}
     annotations = [
-        # ANN_ASCII
-        ['ASCII', 'TODO: description'],
+        ['Text', 'Human-readable text'],
+        ['Warnings', 'Human-readable warnings'],
     ]
 
     def __init__(self, **kwargs):
         self.state = 'WAIT FOR RISING EDGE'
+        self.oldpins = None
         self.oldval = None
+        self.oldpon = None
         self.samplenum = 0
         self.bit_start = 0
         self.bit_start_old = 0
@@ -199,9 +198,32 @@ class Decoder(srd.Decoder):
             raise Exception('Invalid DCF77 bit: %d' % c)
 
     def decode(self, ss, es, data):
-        for samplenum, (val) in data: # TODO: Handle optional PON.
+        for (self.samplenum, pins) in data:
+
+            # Ignore identical samples early on (for performance reasons).
+            if self.oldpins == pins:
+                continue
+            self.oldpins, (val, pon) = pins, pins
+
+            # Always remember the old PON state.
+            if self.oldpon != pon:
+                self.oldpon = pon
+
+            # Warn if PON goes low.
+            if self.oldpon == 1 and pon == 0:
+                self.pon_ss = self.samplenum
+                self.put(self.samplenum, self.samplenum, self.out_ann,
+                         [1, ['Warning: PON goes low, DCF77 reception '
+                         'no longer possible']])
+            elif self.oldpon == 0 and pon == 1:
+                self.put(self.samplenum, self.samplenum, self.out_ann,
+                         [0, ['PON goes high, DCF77 reception now possible']])
+                self.put(self.pon_ss, self.samplenum, self.out_ann,
+                         [1, ['Warning: PON low, DCF77 reception disabled']])
 
-            self.samplenum += 1 # FIXME. Use samplenum. Off-by-one?
+            # Ignore samples where PON == 0, they can't contain DCF77 signals.
+            if pon == 0:
+                continue
 
             if self.state == 'WAIT FOR RISING EDGE':
                 # Wait until the next rising edge occurs.
@@ -227,13 +249,13 @@ class Decoder(srd.Decoder):
                     self.bitcount = 0
                     self.bit_start_old = self.bit_start
                     self.dcf77_bitnumber_is_known = 1
-                    # Don't switch to GET_BIT state this time.
+                    # Don't switch to 'GET BIT' state this time.
                     continue
 
                 self.bit_start_old = self.bit_start
-                self.state = GET_BIT
+                self.state = 'GET BIT'
 
-            elif self.state == GET_BIT:
+            elif self.state == 'GET BIT':
                 # Wait until the next falling edge occurs.
                 if not (self.oldval == 1 and val == 0):
                     self.oldval = val
@@ -252,7 +274,7 @@ class Decoder(srd.Decoder):
                 else:
                     bit = -1 # TODO: Error?
 
-                # TODO: There's no bit 59, make sure none is decoded.
+                # There's no bit 59, make sure none is decoded.
                 if bit in (0, 1) and self.bitcount in range(0, 58 + 1):
                     self.handle_dcf77_bit(bit)
                     self.bitcount += 1