X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=decoders%2Fdcf77%2Fdcf77.py;h=4da9bc422d55472f4ea8044d61563e05e74a8b65;hb=2dc6d41c64a8235308e61b4f9b509c7fecb2b502;hp=53795926177345ffd9e22ad59586e12d9497e7c8;hpb=decde15ecb51b3326b31019af61e0a729b9c61d0;p=libsigrokdecode.git diff --git a/decoders/dcf77/dcf77.py b/decoders/dcf77/dcf77.py index 5379592..4da9bc4 100644 --- a/decoders/dcf77/dcf77.py +++ b/decoders/dcf77/dcf77.py @@ -18,28 +18,11 @@ ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ## -# # DCF77 protocol decoder -# -# More information: -# http://en.wikipedia.org/wiki/DCF77 -# - -# -# Protocol output format: -# TODO -# import sigrokdecode as srd import calendar -# States -WAIT_FOR_RISING_EDGE = 0 -GET_BIT = 1 - -# 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) @@ -49,26 +32,26 @@ class Decoder(srd.Decoder): id = 'dcf77' name = 'DCF77' longname = 'DCF77 time protocol' - desc = 'TODO.' - longdesc = 'TODO.' + desc = 'European longwave time signal (77.5kHz carrier signal).' license = 'gplv2+' inputs = ['logic'] outputs = ['dcf77'] probes = [ {'id': 'data', 'name': 'DATA', 'desc': 'DATA line'}, ] - extra_probes = [ - {'id': 'pon', 'name': 'PON', 'desc': 'TODO'}, + optional_probes = [ + {'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.state = 'WAIT FOR RISING EDGE' self.oldval = None + self.oldpon = None self.samplenum = 0 self.bit_start = 0 self.bit_start_old = 0 @@ -214,11 +197,29 @@ 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, (val, pon)) in data: + + # 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: + if self.state == 'WAIT FOR RISING EDGE': # Wait until the next rising edge occurs. if not (self.oldval == 0 and val == 1): self.oldval = val @@ -242,13 +243,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 @@ -267,12 +268,12 @@ 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 - self.state = WAIT_FOR_RISING_EDGE + self.state = 'WAIT FOR RISING EDGE' else: raise Exception('Invalid state: %d' % self.state)