summaryrefslogtreecommitdiffstats
path: root/app/msf.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/msf.c')
-rw-r--r--app/msf.c96
1 files changed, 57 insertions, 39 deletions
diff --git a/app/msf.c b/app/msf.c
index 82dea7d..954e57f 100644
--- a/app/msf.c
+++ b/app/msf.c
@@ -1,47 +1,51 @@
#include "project.h"
-#define P1 (GPIO1)
+#define J2(a,b) a ## b
+#define J3(a,b,c) a ## b ## c
+
+#define P1 (GPIO3)
#define P1_PORT GPIOE
-#define T (GPIO0)
+#define T_BIT 1
#define T_PORT GPIOE
+#define T_EXTI_LINE T_BIT
+
+
+#define M_T(a) J2(GPIO,a)
+#define T M_T(T_BIT)
+#define M_EXTI_T(a) J2(EXTI,a)
+#define EXTI_T M_EXTI_T(T_EXTI_LINE)
+#define M_exti_t_isr(a) J3(exti,a,_isr)
+#define exti_t_isr M_exti_t_isr(T_EXTI_LINE)
+#define M_NVIC_EXTI_T_IRQ(a) J3(NVIC_EXTI,a,_IRQ)
+#define NVIC_EXTI_T_IRQ M_NVIC_EXTI_T_IRQ(T_EXTI_LINE)
+
static Event_ring msf_ring;
static uint64_t msf_last_second;
uint64_t msf_last_happy;
+static char msf_info[40];
+static EPOCH msf_time;
-void exti0_isr (void)
+void exti_t_isr (void)
{
uint32_t now = SCS_DWT_CYCCNT;
int v;
v = !!gpio_get (T_PORT, T);
- nvic_disable_irq (NVIC_EXTI0_IRQ);
- exti_reset_request (EXTI0);
+ nvic_disable_irq (NVIC_EXTI_T_IRQ);
+
+ exti_reset_request (EXTI_T);
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;
-#if 0
-
- if (time_known) {
- uint64_t abs = abs_extend (now);
- EPOCH e = pll_decompose (abs);
- UTC u = time_epoch_to_utc (e);
-
- printf ("QRR %d.%09d %d\r\n", (u.minute * 60) + u.second, u.nanosecond, (int) !v);
- printf ("QRR %d.%09d %d\r\n", (u.minute * 60) + u.second, u.nanosecond, (int) v);
- }
-
-#endif
-
- nvic_enable_irq (NVIC_EXTI0_IRQ);
-
+ nvic_enable_irq (NVIC_EXTI_T_IRQ);
}
@@ -78,7 +82,7 @@ static int check_min_ident (uint8_t *i)
static void process_bits (uint64_t abs)
{
UTC u;
- EPOCH msf_time;
+ EPOCH e;
if (check_min_ident (&bitsa[52])) return;
@@ -102,17 +106,23 @@ static void process_bits (uint64_t abs)
/* This is always valid a check_min_ident will fail for leap seconds*/
- msf_time = time_utc_to_epoch (u);
+ e = time_utc_to_epoch (u);
+
+ if (bitsb[58]) e.s -= 3600; /*BST*/
msf_last_happy = make_happy (abs, 0);
- pll_set_offset (msf_time, abs);
+ pll_set_offset (e, abs);
dump_bits ("msfa", bitsa);
dump_bits ("msfb", bitsb);
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);
+
+ msf_time = e;
+ msf_time.s -= 1;
+
+ //time_print_epoch (e);
}
@@ -127,15 +137,6 @@ static void report_bits (uint64_t abs, int second, int a, int b)
}
-static void report_time (uint64_t abs)
-{
-#if 1
- EPOCH e = pll_decompose (abs);
- time_print_epoch ("MSF : ", e);
-#endif
-}
-
-
void msf_dispatch (void)
{
static uint32_t last_0, last_1, last_s;
@@ -153,8 +154,21 @@ void msf_dispatch (void)
v = msf_ring.events[msf_ring.rx_ptr].value;
now = msf_ring.events[msf_ring.rx_ptr].when;
+ led1_set (v);
+
msf_ring.rx_ptr = (msf_ring.rx_ptr + 1) & ERING_MASK;
+#if 0
+ {
+ abs = abs_extend (now);
+ EPOCH e = pll_decompose (abs);
+ UTC u = time_epoch_to_utc (e);
+
+ printf (" MSF %d %02d:%02d.%06d\r\n", v, u.minute, u.second, (int) (u.nanosecond / 1000));
+ }
+#endif
+
+
if (v) {
pulse_w = now - last_0;
pulse_w /= (HZ / 1000);
@@ -162,6 +176,7 @@ void msf_dispatch (void)
if (pulse_w > 300) {
last_s = now;
is_s = 1;
+ msf_time.s++;
}
last_1 = now;
@@ -189,14 +204,14 @@ void msf_dispatch (void)
pll_dispatch (msf_last_happy, abs, "MSF");
+ sprintf (msf_info, "m=%d s=%02d b=%d%d", had_m, second, bita, bitb);
if (had_m) {
report_bits (abs, second, bita, bitb);
second++;
}
- if (time_known)
- report_time (abs);
+ report_time ("MSF", msf_time, abs, msf_info);
// stats();
}
@@ -229,12 +244,15 @@ msf_init (void)
MAP_INPUT (T);
MAP_OUTPUT_PP (P1);
+ gpio_set (P1_PORT, P1);
+ delay_ms (50);
gpio_clear (P1_PORT, P1);
- exti_select_source (EXTI0, T_PORT);
- exti_set_trigger (EXTI0, EXTI_TRIGGER_BOTH);
- exti_enable_request (EXTI0);
- nvic_enable_irq (NVIC_EXTI0_IRQ);
+ exti_select_source (EXTI_T, T_PORT);
+ exti_set_trigger (EXTI_T, EXTI_TRIGGER_BOTH);
+ exti_enable_request (EXTI_T);
+
+ nvic_enable_irq (NVIC_EXTI_T_IRQ);
}