]> git.gag.com Git - fw/altos/commitdiff
altos: wait for mosaic receiver to be available at startup
authorKeith Packard <keithp@keithp.com>
Mon, 4 Aug 2025 21:17:01 +0000 (14:17 -0700)
committerKeith Packard <keithp@keithp.com>
Mon, 4 Aug 2025 21:17:01 +0000 (14:17 -0700)
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 <keithp@keithp.com>
src/drivers/ao_gps_mosaic.c
src/kernel/ao_host.h
src/telemega-v3.0/ao_pins.h
src/telemega-v4.0/ao_pins.h
src/telemega-v5.0/ao_pins.h
src/telemega-v6.0/ao_pins.h
src/telemega-v7.0/ao_pins.h
src/test/ao_gps_test_mosaic.c

index 874acfda82983d3f0daa051a0f0401e51735b304..3176da6056fb22e7494b65a3c339b0bee531ba96 100644 (file)
@@ -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 */
index 1cf2410232bc399d818c17cd69712dfd5445b2f0..6adb4e03b26139747da245b0bae01480d49bfe19 100644 (file)
@@ -26,6 +26,7 @@
 #include <stdbool.h>
 
 #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))
index baffb5828c0051b385b76fa86f66b5d06f22282a..a0e1c528f8b148c174eb5e2bec0514733948eff0 100644 (file)
@@ -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
index 96bd1ecfc230415237bf836183bdce01f898f5a2..8b956d0baf6341bfc3aaf091e61e9f98beb55450 100644 (file)
@@ -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
index b8f25d9899bba497108a16a94d743319ad9079c0..6105371e12b8fda76fa3ce9546a2ca61dac80e03 100644 (file)
@@ -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
index 8b537982d231228483325c2f92e4bc08671c7517..57723fcc02d6b868943108a385a4dba1c0d150aa 100644 (file)
@@ -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
index 62f4c85c8c1f340c775c7a640e22d745ea347f38..f40d4a987ddd41c81537ff1b14119873909bce36 100644 (file)
@@ -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
index 54490948a09fe1064f2ffa762ae48c03e78bb396..4f8dcd6402647acb64175fd5f704cc3d6fc47ddb 100644 (file)
@@ -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)
 {