1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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;
}
}
}
|