summaryrefslogtreecommitdiffstats
path: root/jjy.c
blob: 777694190fb6224c52b25f22f90622ca2d9f48f5 (plain)
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
#include "project.h"


static void jjy_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] = !set_parity (b, 12, 18);
  b[37] = !set_parity (b, 1, 8);
  b[38]=0; //about to be summer time
  b[39]=2;
  b[40]=0; //in summer time

  bcd_set (b, 41, 48, u.year % 100);
  b[49]=0;

  bcd_set (b, 50, 52, u.wday-1);
  b[53]=0; //leap indicator
  b[54]=0; //leap polarity
  b[55]=0;
  b[56]=0; 
  b[57]=0; 
  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 jjy_make_stream (uint8_t *v, UTC u)
{
  unsigned s;
  uint8_t b[60];
  uint8_t *pb;

  jjy_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;
    }
  }
}