from machine import Pin, idle, enable_irq, disable_irq, Timer, RTC
from micropython import schedule
import time
bit_diff = last_bit_start = bit_start = bitsign_len = 0
tick = 20
#9:47
dcfsignal = (0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1,
0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0)
minutes = hours = dom = dow = month = year = 0
parity = 0
timer = Timer()
timer1 = Timer()
rtc = RTC()
def processBit():
global tick, bit_diff, bitsign_len, last_bit_start, timeValid, dateValid
global minutes, hours, dom, dow, month, year, parity
irqstate = disable_irq()
#print(f'{tick}: {bitsign_len} {bit_diff}', end=' ')
if tick == -1 and bit_diff > 190 and bit_diff < 210:
tick = 0
bit_diff = 100
print('!min start')
elif bit_diff < 95 or bit_diff > 105:
tick = -1
print('!bit_diff!')
if tick > -1:
if bitsign_len > 5 and bitsign_len <= 15:
val = 0
elif bitsign_len > 15 and bitsign_len < 25:
val = 1
else:
tick = -2
print('!bitsign_len')
if tick > 20:
if val == 1:
parity += 1
if tick > 57:
if parity % 2 == 0:
year -= ((year//16)*6)
month -= ((month//16)*6)
dom -= (dom//16)*6
dow -= -((dow//16)*6)
date = (2000+year, month, dom, dow, hours, minutes-1,tick+1,0)
timer1.init(mode=Timer.ONE_SHOT,period=1000-(time.ticks_ms()-bit_start), callback=lambda t: rtc.datetime(date))
print(f'tdiff: {time.ticks_ms()-bit_start}')
year = month = dom = dow = hours = minutes = 0
parity = 0
tick = -2
elif tick > 49:
year |= val << (tick - 50)
elif tick > 44:
month |= val << (tick - 45)
elif tick > 41:
dow |= val << (tick - 42)
elif tick > 35:
dom |= val << (tick - 36)
elif tick > 34:
#print(f'tdiff: {time.ticks_ms()-bit_start}')
if parity % 2 == 0:
hours -= (hours//16)*6
minutes -= (minutes//16)*6
print(f'Time: {hours}:{minutes}')
elif tick > 28:
hours |= val << (tick - 29)
elif tick > 27:
pass
elif tick > 20:
minutes |= val << (tick - 21)
elif tick == 20:
if not val:
tick = -2
elif tick == 20 and val == 0:
tick = -2
elif tick == 0 and val == 1:
tick = -2
tick += 1
enable_irq(irqstate)
dcftick = 20
def emit_dcf_signal():
global bitsign_len, dcftick, bit_diff, bit_start
bit_diff = 100
if dcftick == 0:
bit_diff = 200
dcftick = 0
else:
if dcfsignal[dcftick] == 0:
bitsign_len = 10
elif dcfsignal[dcftick] == 1:
bitsign_len = 20
processBit()
bit_start = time.ticks_ms()
timer.init(mode=Timer.PERIODIC, period=1000, callback=lambda t: print(rtc.datetime()))
while True:
emit_dcf_signal()
dcftick += 1
if dcftick == 59:
dcftick = 0
time.sleep_ms(100)
time.sleep_ms(100)