From: Keith Packard Date: Mon, 4 Aug 2025 21:17:01 +0000 (-0700) Subject: altos: wait for mosaic receiver to be available at startup X-Git-Tag: 1.9.22~1^2~4 X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=832d879842ee3b469c5db314b0df2326d7e124d2;p=fw%2Faltos altos: wait for mosaic receiver to be available at startup Repeat the first mosaic command until the receiver returns a valid response instead of assuming it is alive at startup. Signed-off-by: Keith Packard --- diff --git a/src/drivers/ao_gps_mosaic.c b/src/drivers/ao_gps_mosaic.c index 874acfda..3176da60 100644 --- a/src/drivers/ao_gps_mosaic.c +++ b/src/drivers/ao_gps_mosaic.c @@ -64,6 +64,32 @@ static inline uint8_t mosaic_byte(void) { return c; } +static int +mosaic_byte_timeout(AO_TICK_TYPE timeout) +{ + int c; + + ao_arch_block_interrupts(); + while ((c = _ao_mosaic_pollchar()) == AO_READ_AGAIN) { + if (_ao_mosaic_sleep_for(timeout)) { + c = AO_READ_AGAIN; + break; + } + } + ao_arch_release_interrupts(); +#if AO_MOSAIC_DEBUG + if (c == AO_READ_AGAIN) + mosaic_dbg(DBG_CHAR, "(timeout)"); + else { + if (' ' <= c && c <= '~') + mosaic_dbg(DBG_CHAR, "%c", c); + else + mosaic_dbg(DBG_CHAR, " %02x", c); + } +#endif + return c; +} + static inline void mosaic_putc(char c) { #if AO_MOSAIC_DEBUG if (' ' <= c && c <= '~') @@ -87,28 +113,38 @@ extern AO_TICK_TYPE ao_gps_utc_tick; extern struct ao_telemetry_location ao_gps_data; extern struct ao_telemetry_satellite ao_gps_tracking_data; -static void +static bool mosaic_wait_idle(void) { - uint8_t b; + int c; + AO_TICK_TYPE giveup = ao_time() + AO_SEC_TO_TICKS(2); + for (;;) { - while(mosaic_byte() != '$') - ; - if (mosaic_byte() != 'R') + while((c = mosaic_byte_timeout(AO_SEC_TO_TICKS(1))) != '$') { + if ((AO_TICK_SIGNED) (ao_time() - giveup) >= 0) + return false; + if (c == AO_READ_AGAIN) + return false; + } + if (mosaic_byte_timeout(AO_MS_TO_TICKS(100)) != 'R') continue; for (;;) { - b = mosaic_byte(); - if (b == '\n') - return; + c = mosaic_byte_timeout(AO_MS_TO_TICKS(100)); + if (c == '\n') + return true; + if (c == AO_READ_AGAIN) + break; + if ((AO_TICK_SIGNED) (ao_time() - giveup) >= 0) + return false; } } } -static void +static bool mosaic_command(const char *cmd) { mosaic_puts(cmd); - mosaic_wait_idle(); + return mosaic_wait_idle(); } static void @@ -116,7 +152,8 @@ mosaic_setup(void) { ao_mosaic_set_speed(AO_SERIAL_SPEED_115200); /* Send messages always */ - mosaic_command("smrf, OnlyRef \r"); + while (!mosaic_command("smrf, OnlyRef \r")) + mosaic_dbg(DBG_INIT, "Mosaic timeout\n"); /* Set receiver dynamics mode */ mosaic_command("srd, High, Unlimited \r"); /* Report position once per second */ diff --git a/src/kernel/ao_host.h b/src/kernel/ao_host.h index 1cf24102..6adb4e03 100644 --- a/src/kernel/ao_host.h +++ b/src/kernel/ao_host.h @@ -26,6 +26,7 @@ #include #define AO_TICK_TYPE uint32_t +#define AO_TICK_SIGNED int32_t #define AO_ADC_RING 64 #define ao_adc_ring_next(n) (((n) + 1) & (AO_ADC_RING - 1)) #define ao_adc_ring_prev(n) (((n) - 1) & (AO_ADC_RING - 1)) diff --git a/src/telemega-v3.0/ao_pins.h b/src/telemega-v3.0/ao_pins.h index baffb582..a0e1c528 100644 --- a/src/telemega-v3.0/ao_pins.h +++ b/src/telemega-v3.0/ao_pins.h @@ -57,6 +57,8 @@ #define ao_mosaic_getchar ao_serial1_getchar #define ao_mosaic_putchar ao_serial1_putchar #define ao_mosaic_set_speed ao_serial1_set_speed +#define _ao_mosaic_sleep_for _ao_serial1_sleep_for +#define _ao_mosaic_pollchar _ao_serial1_pollchar #define ao_mosaic_fifo (ao_stm_usart1.rx_fifo) #else diff --git a/src/telemega-v4.0/ao_pins.h b/src/telemega-v4.0/ao_pins.h index 96bd1ecf..8b956d0b 100644 --- a/src/telemega-v4.0/ao_pins.h +++ b/src/telemega-v4.0/ao_pins.h @@ -57,6 +57,8 @@ #define ao_mosaic_getchar ao_serial1_getchar #define ao_mosaic_putchar ao_serial1_putchar #define ao_mosaic_set_speed ao_serial1_set_speed +#define _ao_mosaic_sleep_for _ao_serial1_sleep_for +#define _ao_mosaic_pollchar _ao_serial1_pollchar #define ao_mosaic_fifo (ao_stm_usart1.rx_fifo) #else diff --git a/src/telemega-v5.0/ao_pins.h b/src/telemega-v5.0/ao_pins.h index b8f25d98..6105371e 100644 --- a/src/telemega-v5.0/ao_pins.h +++ b/src/telemega-v5.0/ao_pins.h @@ -57,6 +57,8 @@ #define ao_mosaic_getchar ao_serial1_getchar #define ao_mosaic_putchar ao_serial1_putchar #define ao_mosaic_set_speed ao_serial1_set_speed +#define _ao_mosaic_sleep_for _ao_serial1_sleep_for +#define _ao_mosaic_pollchar _ao_serial1_pollchar #define ao_mosaic_fifo (ao_stm_usart1.rx_fifo) #else diff --git a/src/telemega-v6.0/ao_pins.h b/src/telemega-v6.0/ao_pins.h index 8b537982..57723fcc 100644 --- a/src/telemega-v6.0/ao_pins.h +++ b/src/telemega-v6.0/ao_pins.h @@ -57,6 +57,8 @@ #define ao_mosaic_getchar ao_serial1_getchar #define ao_mosaic_putchar ao_serial1_putchar #define ao_mosaic_set_speed ao_serial1_set_speed +#define _ao_mosaic_sleep_for _ao_serial1_sleep_for +#define _ao_mosaic_pollchar _ao_serial1_pollchar #define ao_mosaic_fifo (ao_stm_usart1.rx_fifo) #else diff --git a/src/telemega-v7.0/ao_pins.h b/src/telemega-v7.0/ao_pins.h index 62f4c85c..f40d4a98 100644 --- a/src/telemega-v7.0/ao_pins.h +++ b/src/telemega-v7.0/ao_pins.h @@ -57,6 +57,8 @@ #define ao_mosaic_getchar ao_serial1_getchar #define ao_mosaic_putchar ao_serial1_putchar #define ao_mosaic_set_speed ao_serial1_set_speed +#define _ao_mosaic_sleep_for _ao_serial1_sleep_for +#define _ao_mosaic_pollchar _ao_serial1_pollchar #define ao_mosaic_fifo (ao_stm_usart1.rx_fifo) #else diff --git a/src/test/ao_gps_test_mosaic.c b/src/test/ao_gps_test_mosaic.c index 54490948..4f8dcd64 100644 --- a/src/test/ao_gps_test_mosaic.c +++ b/src/test/ao_gps_test_mosaic.c @@ -175,6 +175,13 @@ ao_mosaic_putchar(char c) #define AO_SERIAL_SPEED_57600 2 #define AO_SERIAL_SPEED_115200 3 +#define AO_READ_AGAIN -1 +#define AO_HERTZ 100 +#define ao_arch_block_interrupts() +#define ao_arch_release_interrupts() +#define _ao_mosaic_pollchar() ao_mosaic_getchar() +#define _ao_mosaic_sleep_for(t) 1 + static void ao_mosaic_set_speed(uint8_t speed) {