summaryrefslogtreecommitdiffstats
path: root/wwvb.c
diff options
context:
space:
mode:
Diffstat (limited to 'wwvb.c')
-rw-r--r--wwvb.c135
1 files changed, 135 insertions, 0 deletions
diff --git a/wwvb.c b/wwvb.c
new file mode 100644
index 0000000..12fc4d5
--- /dev/null
+++ b/wwvb.c
@@ -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;
+ }
+ }
+}
+
+