altos: Require sequencing through 'main' state before landing
[fw/altos] / src / ao_report.c
index c9ee7cae05724a1e234cd04fac7f26d5dd0344f5..3cf558e1d97ff9d72018fe0f14167f2c6702d9e1 100644 (file)
@@ -42,13 +42,13 @@ static const uint8_t flight_reports[] = {
 #define mid(time)      ao_beep_for(AO_BEEP_MID, time)
 #define high(time)     ao_beep_for(AO_BEEP_HIGH, time)
 #else
-#define low(time)      ao_led_for(AO_LED_RED, time)
-#define mid(time)      ao_led_for(AO_LED_RED|AO_LED_GREEN, time)
-#define high(time)     ao_led_for(AO_LED_GREEN, time)
+#define low(time)      ao_led_for(AO_LED_GREEN, time)
+#define mid(time)      ao_led_for(AO_LED_RED, time)
+#define high(time)     ao_led_for(AO_LED_GREEN|AO_LED_RED, time)
 #endif
 #define pause(time)    ao_delay(time)
 
-static __xdata enum ao_flight_state ao_report_state;
+static __pdata enum ao_flight_state ao_report_state;
 
 static void
 ao_report_beep(void) __reentrant
@@ -78,7 +78,7 @@ ao_report_digit(uint8_t digit) __reentrant
        } else {
                while (digit--) {
                        mid(AO_MS_TO_TICKS(200));
-                       mid(AO_MS_TO_TICKS(200));
+                       pause(AO_MS_TO_TICKS(200));
                }
        }
        pause(AO_MS_TO_TICKS(300));
@@ -87,9 +87,9 @@ ao_report_digit(uint8_t digit) __reentrant
 static void
 ao_report_altitude(void)
 {
-       __xdata int16_t agl = ao_pres_to_altitude(ao_min_pres) - ao_pres_to_altitude(ao_ground_pres);
+       __pdata int16_t agl = ao_max_height;
        __xdata uint8_t digits[10];
-       __xdata uint8_t ndigits, i;
+       __pdata uint8_t ndigits, i;
 
        if (agl < 0)
                agl = 0;
@@ -109,6 +109,7 @@ ao_report_altitude(void)
        }
 }
 
+#if HAS_IGNITE
 static uint8_t
 ao_report_igniter_ready(enum ao_igniter igniter)
 {
@@ -146,6 +147,7 @@ ao_report_continuity(void) __reentrant
        while (c-- && ao_flight_state == ao_flight_pad)
                pause(AO_MS_TO_TICKS(100));
 }
+#endif
 
 void
 ao_report(void)
@@ -155,10 +157,12 @@ ao_report(void)
                if (ao_flight_state == ao_flight_landed)
                        ao_report_altitude();
                ao_report_beep();
+#if HAS_IGNITE
                if (ao_flight_state == ao_flight_idle)
                        ao_report_continuity();
                while (ao_flight_state == ao_flight_pad)
                        ao_report_continuity();
+#endif
                __critical {
                        while (ao_report_state == ao_flight_state)
                                ao_sleep(DATA_TO_XDATA(&ao_flight_state));