altos/easymotor-v2: Beep out 'pad mode' repeatedly
[fw/altos] / src / kernel / ao_report.c
index 08967af8450f3f2701b82e3c3df146e801dfa5e1..831ba874cc3656d312aca76ff2409cbb03e8a7fa 100644 (file)
@@ -40,6 +40,8 @@ static const uint8_t flight_reports[] = {
        MORSE4(1,0,0,1),        /* invalid 'X' */
 };
 
+static enum ao_flight_state ao_report_state;
+
 #if HAS_BEEP
 #define low(time)      ao_beep_for(AO_BEEP_LOW, time)
 #define mid(time)      ao_beep_for(AO_BEEP_MID, time)
@@ -58,8 +60,6 @@ static const uint8_t flight_reports[] = {
 #endif
 #define pause(time)    ao_delay(time)
 
-static enum ao_flight_state ao_report_state;
-
 /*
  * Farnsworth spacing
  *
@@ -115,7 +115,7 @@ static enum ao_flight_state ao_report_state;
  */
 
 static void
-ao_report_beep(void) 
+ao_report_flight_state(void) 
 {
        uint8_t r = flight_reports[ao_flight_state];
        uint8_t l = r & 7;
@@ -190,6 +190,7 @@ ao_report_battery(void)
 #endif
 
 #if HAS_IGNITE_REPORT
+#if HAS_IGNITE
 static uint8_t
 ao_report_igniter_ready(enum ao_igniter igniter)
 {
@@ -202,16 +203,13 @@ ao_report_igniter(void)
        return (ao_report_igniter_ready(ao_igniter_drogue) |
                     (ao_report_igniter_ready(ao_igniter_main) << 1));
 }
+#endif
 
 static void
 ao_report_continuity(void) 
 {
-       uint8_t c;
-
-#if !HAS_IGNITE
-       if (!ao_igniter_present)
-               return;
-#endif
+       uint8_t c;
+#if HAS_IGNITE
        c = ao_report_igniter();
        if (c) {
                while (c--) {
@@ -225,8 +223,11 @@ ao_report_continuity(void)
                        low(AO_MS_TO_TICKS(20));
                }
        }
+#endif
 #if AO_PYRO_NUM
+#if HAS_IGNITE
        pause(AO_MS_TO_TICKS(250));
+#endif
        for(c = 0; c < AO_PYRO_NUM; c++) {
                enum ao_igniter_status  status = ao_pyro_status(c);
                if (status == ao_igniter_ready)
@@ -251,7 +252,7 @@ ao_report_continuity(void)
 }
 #endif
 
-void
+static void
 ao_report(void)
 {
        for(;;) {
@@ -261,7 +262,12 @@ ao_report(void)
                        ao_report_battery();
                else
 #endif
-                       ao_report_beep();
+                       ao_report_flight_state();
+#if HAS_SENSOR_ERRORS
+               if (ao_report_state == ao_flight_invalid && ao_sensor_errors)
+                       ao_report_number(ao_sensor_errors);
+#endif
+
                if (ao_report_state == ao_flight_landed) {
                        ao_report_altitude();
 #if HAS_FLIGHT
@@ -279,6 +285,15 @@ ao_report(void)
                        while (c-- && ao_flight_state == ao_flight_pad)
                                pause(AO_MS_TO_TICKS(100));
                }
+#endif
+#if HAS_PAD_REPORT
+               while (ao_flight_state == ao_flight_pad) {
+                       uint8_t c;
+                       ao_report_flight_state();
+                       c = 50;
+                       while (c-- && ao_flight_state == ao_flight_pad)
+                               pause(AO_MS_TO_TICKS(100));
+               }
 #endif
                while (ao_report_state == ao_flight_state)
                        ao_sleep(&ao_flight_state);