import sigrokdecode as srd
import calendar
-# Annotation feed formats
-ANN_TEXT = 0
-
# Return the specified BCD number (max. 8 bits) as integer.
def bcd2int(b):
return (b & 0x0f) + ((b >> 4) * 10)
{'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_TEXT
['Text', 'Human-readable text'],
+ ['Warnings', 'Human-readable warnings'],
]
def __init__(self, **kwargs):
self.state = 'WAIT FOR RISING EDGE'
self.oldval = None
+ self.oldpon = None
self.samplenum = 0
self.bit_start = 0
self.bit_start_old = 0
raise Exception('Invalid DCF77 bit: %d' % c)
def decode(self, ss, es, data):
- for (self.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']])
+
+ # 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.
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
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