summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYour Name <you@example.com>2026-02-09 01:22:02 +0000
committerYour Name <you@example.com>2026-02-09 01:22:02 +0000
commita7598289a0c086ba20df346267ba087e6b35805c (patch)
tree56f24f9101278f521501648e2635450c5edc97da
parent6e75bcc7f8df65d4901b2918aafb501c6baefabe (diff)
downloadgen_msf-master.tar.gz
gen_msf-master.tar.bz2
gen_msf-master.zip
add jjy and wwvbHEADmaster
-rw-r--r--Makefile8
-rw-r--r--jjy.c123
-rw-r--r--main.c3
-rw-r--r--prototypes.h4
-rw-r--r--wwvb.c135
5 files changed, 268 insertions, 5 deletions
diff --git a/Makefile b/Makefile
index a8c74c6..b580dd4 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-CSRCS=time_fn.c msf.c util.c main.c signal.c sync.c audio.c
+CSRCS=time_fn.c msf.c util.c main.c signal.c sync.c audio.c jjy.c wwvb.c
HSRCS=time_fn.h project.h
PROG=msf
LIBS=-lm
@@ -7,13 +7,13 @@ CPPFLAGS=
AO_CFLAGS=$(shell pkg-config --cflags ao)
AO_LIBS=$(shell pkg-config --libs ao)
-AO_CFLAGS=-Iprefix/include
-AO_LIBS=prefix/lib/libao.a
+#AO_CFLAGS=-Iprefix/include
+#AO_LIBS=prefix/lib/libao.a
+#CC=x86_64-w64-mingw32-gcc
LIBS+=$(AO_LIBS)
CPPFLAGS+=$(AO_CFLAGS)
-CC=x86_64-w64-mingw32-gcc
#####################
diff --git a/jjy.c b/jjy.c
new file mode 100644
index 0000000..7776941
--- /dev/null
+++ b/jjy.c
@@ -0,0 +1,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;
+ }
+ }
+}
+
+
diff --git a/main.c b/main.c
index 3ec4b1f..950c3f6 100644
--- a/main.c
+++ b/main.c
@@ -31,7 +31,8 @@ int main (int argc, char *argv[])
e.s += 60;
u = time_epoch_to_utc (e);
time_print_utc ("Next:\n", u);
- msf_make_stream (s, u);
+// msf_make_stream (s, u);
+ jjy_make_stream (s, u);
for (i = 0; i < 600; ++i) {
diff --git a/prototypes.h b/prototypes.h
index ef0a6b3..8b5c341 100644
--- a/prototypes.h
+++ b/prototypes.h
@@ -23,3 +23,7 @@ extern void sync_to_minute(struct timeval *ret);
extern void audio_init(void);
extern void audio_start(void);
extern void audio_play(void *data, size_t len);
+/* jjy.c */
+extern void jjy_make_stream(uint8_t *v, UTC u);
+/* wwvb.c */
+extern void wwvb_make_stream(uint8_t *v, UTC u);
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;
+ }
+ }
+}
+
+