summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroot <root@no.no.james.local>2019-02-26 15:38:49 +0000
committerroot <root@no.no.james.local>2019-02-26 15:38:49 +0000
commit9ada072d5337a582e987ed57dc4816189208dea7 (patch)
tree657295fefd5ec9ec153f92ba77bd46d82b0977f8
parent89aa56f25116fc642928f352c14fe2d485532749 (diff)
downloadgen_msf-9ada072d5337a582e987ed57dc4816189208dea7.tar.gz
gen_msf-9ada072d5337a582e987ed57dc4816189208dea7.tar.bz2
gen_msf-9ada072d5337a582e987ed57dc4816189208dea7.zip
fix bcd encoder
-rw-r--r--main.c4
-rw-r--r--msf.c52
-rw-r--r--prototypes.h2
-rw-r--r--util.c34
4 files changed, 91 insertions, 1 deletions
diff --git a/main.c b/main.c
index 5b18a72..576b42f 100644
--- a/main.c
+++ b/main.c
@@ -16,13 +16,17 @@ int main (int argc, char *argv[])
audio_init();
+
audio_start();
sync_to_minute (&tv);
+ // sync_to_second (&tv);
e.s = tv.tv_sec;
e.ns = tv.tv_usec * 1000;
+ e.s -= 3600;
+
for (;;) {
e.s += 60;
u = time_epoch_to_utc (e);
diff --git a/msf.c b/msf.c
index 411b601..38e0896 100644
--- a/msf.c
+++ b/msf.c
@@ -1,6 +1,28 @@
#include "project.h"
+static int check_min_ident (uint8_t *i)
+{
+ if (i[0]) return 1;
+
+ if (!i[1]) return 1;
+
+ if (!i[2]) return 1;
+
+ if (!i[3]) return 1;
+
+ if (!i[4]) return 1;
+
+ if (!i[5]) return 1;
+
+ if (!i[6]) return 1;
+
+ if (i[7]) return 1;
+
+ return 0;
+}
+
+
static void msf_set_ident (uint8_t *i)
@@ -51,6 +73,35 @@ static void msf_make_bits (UTC u, uint8_t *a, uint8_t *b)
}
+static void process_bits (uint8_t *bitsa, uint8_t *bitsb)
+{
+ UTC u;
+
+
+ if (check_min_ident (&bitsa[52])) return;
+
+ if (check_parity (bitsa, 17, 24, bitsb[54])) return;
+
+ if (check_parity (bitsa, 25, 35, bitsb[55])) return;
+
+ if (check_parity (bitsa, 36, 38, bitsb[56])) return;
+
+ if (check_parity (bitsa, 39, 51, bitsb[57])) return;
+
+ u.jday = 0;
+ u.year = bcd (bitsa, 17, 24);
+ u.month = bcd (bitsa, 25, 29);
+ u.mday = bcd (bitsa, 30, 35);
+ u.hour = bcd (bitsa, 39, 44);
+ u.minute = bcd (bitsa, 45, 51);
+ u.second = 0;
+ u.nanosecond = 0;
+
+
+
+ printf ("MSF: decoded %02d-%02d-%02d %02d:%02d\r\n", u.year, u.month, u.mday, u.hour, u.minute);
+}
+
void msf_make_stream (uint8_t *v, UTC u)
@@ -60,6 +111,7 @@ void msf_make_stream (uint8_t *v, UTC u)
uint8_t *pa, *pb;
msf_make_bits (u, a, b);
+ process_bits (a, b);
bzero (v, 600);
diff --git a/prototypes.h b/prototypes.h
index e6c95a4..ef0a6b3 100644
--- a/prototypes.h
+++ b/prototypes.h
@@ -9,6 +9,8 @@ extern void msf_make_stream(uint8_t *v, UTC u);
/* util.c */
extern int set_parity(uint8_t *d, unsigned s, unsigned e);
extern void bcd_set(uint8_t *d, unsigned s, unsigned e, unsigned v);
+extern int check_parity(uint8_t *d, unsigned s, unsigned e, uint8_t p);
+extern unsigned bcd(uint8_t *d, unsigned s, unsigned e);
/* main.c */
extern int main(int argc, char *argv[]);
/* signal.c */
diff --git a/util.c b/util.c
index 8be15a4..d8632c5 100644
--- a/util.c
+++ b/util.c
@@ -27,7 +27,6 @@ void bcd_set (uint8_t *d, unsigned s, unsigned e, unsigned v)
c <<= 1;
else {
c >>= 3;
- c *= 10;
v = v / 10;
w = v % 10;
}
@@ -35,4 +34,37 @@ void bcd_set (uint8_t *d, unsigned s, unsigned e, unsigned v)
}
+int check_parity (uint8_t *d, unsigned s, unsigned e, uint8_t p)
+{
+ unsigned i;
+
+ for (i = s; i <= e; ++i)
+ p ^= d[i];
+
+ return !p;
+}
+
+
+unsigned bcd (uint8_t *d, unsigned s, unsigned e)
+{
+ unsigned ret = 0, c, i;
+
+ for (i = e, c = 1 ; i >= s; --i) {
+
+ if (d[i]) ret += c;
+
+
+ if (c & 0x77777777)
+ c <<= 1;
+ else {
+ c >>= 3;
+ c *= 10;
+ }
+ }
+
+ return ret;
+}
+
+
+