#include "project.h" static void wwvb_make_bits (UTC u, uint8_t *b) { bzero (b, 60); b[0]=2; bcd_set (b, 1, 3, u.minute/10); b[4]=0; bcd_set (b, 5, 8, u.minute); b[9]=2; b[10]=0; b[11]=0; bcd_set (b, 12, 13, u.hour/10); b[14]=0; bcd_set (b, 15, 18, u.hour); b[19]=2; b[20]=0; b[21]=0; bcd_set (b, 22, 23, u.jday/100); b[24]=0; bcd_set (b, 25, 28, u.jday/10); b[29]=2; bcd_set (b, 30, 33, u.jday); b[34]=0; b[35]=0; b[36]=1; //DUT1+ b[37]=0; b[38]=1; //DUT1+ b[39]=2; b[40]=0; //DUT1=0 b[41]=0; b[42]=0; b[43]=0; b[44]=0; bcd_set (b, 45, 48, (u.year % 100)/10); b[49]=2; bcd_set (b, 50, 53, (u.year % 100)); b[55]=!(u.year % 400) ^ !(u.year % 100) ^ !(u.year%4); b[56]=0; //no leap second b[57]=0; //no DST b[58]=0; b[59]=2; } static void process_bits (uint8_t *b) { UTC u; if (b[0]!=2) return; if (b[4]) return; if (b[9]!=2) return; if (b[10]) return; if (b[11]) return; if (b[14]) return; if (b[19]!=2) return; if (b[20]) return; if (b[21]) return; if (b[24]) return; if (b[29]!=2) return; if (b[34]) return; if (b[35]) return; if (b[39]!=2) return; if (b[59]!=2) return; if (check_parity (b, 12, 18, !b[36])) return; if (check_parity (b, 1, 8, !b[37])) return; u.jday = bcd(b,22,23); u.jday*=10; u.jday += bcd(b,25,28); u.jday*=10; u.jday+=bcd(b,30,33); u.year = bcd (b, 41, 48); u.hour = bcd (b, 12, 13); u.hour*=10; u.hour += bcd (b, 15, 18); u.minute = bcd (b, 1, 3); u.minute*=10; u.minute += bcd (b, 5, 8); u.wday=bcd(b,50,52); u.second = 0; u.nanosecond = 0; printf ("JJY: decoded %02d-%03d (DOW %d) %02d:%02d\r\n", u.year, u.jday,u.wday, u.hour, u.minute); } void wwvb_make_stream (uint8_t *v, UTC u) { unsigned s; uint8_t b[60]; uint8_t *pb; wwvb_make_bits (u, b); process_bits ( b); bzero (v, 600); for (s = 0, pb = b; s < 60; ++s, v += 10, ++pb) { memset(v,0,10); switch(*pb) { case 0: memset(v+8,1,2); break; case 1: memset(v+5,1,5); break; case 2: memset(v+2,1,8); break; } } }