altos: Make sure we don't beep out continuity twice in idle mode
authorKeith Packard <keithp@keithp.com>
Fri, 12 Sep 2014 02:56:13 +0000 (19:56 -0700)
committerBdale Garbee <bdale@gag.com>
Sat, 13 Sep 2014 17:26:21 +0000 (11:26 -0600)
If the battery voltage report takes longer than the initialiation
sequence, we could get to the state reporting after the state had
switched from startup to idle. This would result in continuity being
reported the first time through the loop. Then, as the state had
already changed, we'd pass through the while test and go back to
report continuity a second time.

Fixed by using the state remembered before beeping out the voltage to
decide whether to report the continuity.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/kernel/ao_report.c

index 5314fc8fb82fa7a698dd3743939ef23fe54dbeda..f4253b3db9e42f1427a3cda44ec215c13ce74dcf 100644 (file)
@@ -246,15 +246,15 @@ ao_report_continuity(void) __reentrant
 void
 ao_report(void)
 {
-       ao_report_state = ao_flight_state;
        for(;;) {
+               ao_report_state = ao_flight_state;
 #if HAS_BATTERY_REPORT
-               if (ao_flight_state == ao_flight_startup)
+               if (ao_report_state == ao_flight_startup)
                        ao_report_battery();
                else
 #endif
                        ao_report_beep();
-               if (ao_flight_state == ao_flight_landed) {
+               if (ao_report_state == ao_flight_landed) {
                        ao_report_altitude();
 #if HAS_FLIGHT
                        ao_delay(AO_SEC_TO_TICKS(5));
@@ -262,7 +262,7 @@ ao_report(void)
 #endif
                }
 #if HAS_IGNITE_REPORT
-               if (ao_flight_state == ao_flight_idle)
+               if (ao_report_state == ao_flight_idle)
                        ao_report_continuity();
                while (ao_flight_state == ao_flight_pad) {
                        uint8_t c;
@@ -272,10 +272,8 @@ ao_report(void)
                                pause(AO_MS_TO_TICKS(100));
                }
 #endif
-
                while (ao_report_state == ao_flight_state)
                        ao_sleep(DATA_TO_XDATA(&ao_flight_state));
-               ao_report_state = ao_flight_state;
        }
 }