summaryrefslogtreecommitdiffstats
path: root/app/msf.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/msf.c')
-rw-r--r--app/msf.c87
1 files changed, 43 insertions, 44 deletions
diff --git a/app/msf.c b/app/msf.c
index 392bfe7..2e7dd93 100644
--- a/app/msf.c
+++ b/app/msf.c
@@ -6,44 +6,35 @@
#define T (GPIO0)
#define T_PORT GPIOB
-static uint8_t bitsa[60], bitsb[60];
+static Event_ring msf_ring;
-static int time_known;
-static int check_parity (uint8_t *d, unsigned s, unsigned e, uint8_t p)
+uint64_t msf_last_second;
+
+
+void exti0_isr (void)
{
- unsigned i;
+ uint32_t now = SCS_DWT_CYCCNT;
+ int v;
- for (i = s; i <= e; ++i)
- p ^= d[i];
+ v = !!gpio_get (T_PORT, T);
- return !p;
-}
+ nvic_disable_irq (NVIC_EXTI0_IRQ);
+ exti_reset_request (EXTI0);
+ msf_ring.events[msf_ring.tx_ptr].when = now;
+ msf_ring.events[msf_ring.tx_ptr].value = v;
+ msf_ring.tx_ptr = (msf_ring.tx_ptr + 1) & ERING_MASK;
-static unsigned bcd (uint8_t *d, unsigned s, unsigned e)
-{
- unsigned ret = 0, c, b, i;
+ nvic_enable_irq (NVIC_EXTI0_IRQ);
- for (i = e, c = 1, b = 0; i >= s; --i, b++) {
+}
- if (d[i]) ret += c;
- switch (b & 3) {
- case 0:
- case 1:
- case 2:
- c <<= 1;
- break;
- default:
- c >>= 3;
- c *= 10;
- }
- }
+static uint8_t bitsa[60], bitsb[60];
- return ret;
-}
+static int time_known;
@@ -103,8 +94,10 @@ static void process_bits (uint64_t abs)
pll_set_offset (msf_time, abs);
time_known = 1;
- printf ("Next minute is: %02d-%02d-%02d %02d:%02d\r\n", u.year, u.month, u.mday, u.hour, u.minute);
- time_print_epoch (msf_time);
+ stats_stamp (u, abs);
+
+ printf ("MSF: Next minute is: %02d-%02d-%02d %02d:%02d\r\n", u.year, u.month, u.mday, u.hour, u.minute);
+ //time_print_epoch (msf_time);
}
@@ -121,29 +114,31 @@ static void report_bits (uint64_t abs, int second, int a, int b)
static void report_time (uint64_t abs)
{
+#if 0
EPOCH e = pll_decompose (abs);
- time_print_epoch (e);
- printf ("%d\r\n", (unsigned) e.s);
+ time_print_epoch ("MSF: ", e);
+#endif
}
-void exti0_isr (void)
+
+void msf_dispatch (void)
{
- static uint32_t last_0;
- static uint32_t last_1;
- static uint32_t last_s;
+ static uint32_t last_0, last_1, last_s;
static int second, bita, bitb, had_m;
-
- uint32_t now = SCS_DWT_CYCCNT;
- uint64_t abs;
-
uint32_t pulse_w, offset;
+ uint64_t abs;
int is_s = 0;
+
+ uint32_t now;
int v;
- nvic_disable_irq (NVIC_EXTI0_IRQ);
- exti_reset_request (EXTI0);
- v = !!gpio_get (T_PORT, T);
+ if (msf_ring.rx_ptr == msf_ring.tx_ptr) return;
+
+ v = msf_ring.events[msf_ring.rx_ptr].value;
+ now = msf_ring.events[msf_ring.rx_ptr].when;
+
+ msf_ring.rx_ptr = (msf_ring.rx_ptr + 1) & ERING_MASK;
if (v) {
pulse_w = now - last_0;
@@ -174,16 +169,21 @@ void exti0_isr (void)
if (is_s) {
abs = abs_extend (now);
+ msf_last_second = abs;
+
pll_dispatch (abs);
+
+
if (had_m) {
report_bits (abs, second, bita, bitb);
second++;
-
}
if (time_known)
report_time (abs);
+
+ stats();
}
@@ -206,11 +206,10 @@ void exti0_isr (void)
- nvic_enable_irq (NVIC_EXTI0_IRQ);
}
void
-radio_init (void)
+msf_init (void)
{
MAP_INPUT (T);
MAP_OUTPUT_PP (P1);