diff options
Diffstat (limited to 'wwvb.c')
| -rw-r--r-- | wwvb.c | 135 |
1 files changed, 135 insertions, 0 deletions
@@ -0,0 +1,135 @@ +#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; + } + } +} + + |
