From 74e577ac110513669a6d677842ceca4c5b1252ca Mon Sep 17 00:00:00 2001 From: fishsoupisgood Date: Sat, 4 May 2019 12:37:04 +0100 Subject: cut #1 --- app/msf.c | 96 +++++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 57 insertions(+), 39 deletions(-) (limited to 'app/msf.c') 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); } -- cgit v1.2.3