diff options
| author | Your Name <you@example.com> | 2026-02-09 01:22:02 +0000 |
|---|---|---|
| committer | Your Name <you@example.com> | 2026-02-09 01:22:02 +0000 |
| commit | a7598289a0c086ba20df346267ba087e6b35805c (patch) | |
| tree | 56f24f9101278f521501648e2635450c5edc97da | |
| parent | 6e75bcc7f8df65d4901b2918aafb501c6baefabe (diff) | |
| download | gen_msf-master.tar.gz gen_msf-master.tar.bz2 gen_msf-master.zip | |
| -rw-r--r-- | Makefile | 8 | ||||
| -rw-r--r-- | jjy.c | 123 | ||||
| -rw-r--r-- | main.c | 3 | ||||
| -rw-r--r-- | prototypes.h | 4 | ||||
| -rw-r--r-- | wwvb.c | 135 |
5 files changed, 268 insertions, 5 deletions
@@ -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 ##################### @@ -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; + } + } +} + + @@ -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); @@ -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; + } + } +} + + |
