altos: Make serial, usb, beeper and accelerometer optional components
[fw/altos] / src / ao_report.c
index 3b469de6983ad8f732138e00c6baea5671be79bf..c9ee7cae05724a1e234cd04fac7f26d5dd0344f5 100644 (file)
 
 #include "ao.h"
 
-static const char * __xdata flight_reports[] = {
-       "...",          /* startup, 'S' */
-       "..",           /* idle 'I' */
-       ".--.",         /* pad 'P' */
-       "-...",         /* boost 'B' */
-       "..-.",         /* fast 'F' */
-       "-.-.",         /* coast 'C' */
-       "-..",          /* drogue 'D' */
-       "--",           /* main 'M' */
-       ".-..",         /* landed 'L' */
-       ".-.-.-",       /* invalid */
+#define BIT(i,x)          ((x) ? (1 << (i)) : 0)
+#define MORSE1(a)          (1 | BIT(3,a))
+#define MORSE2(a,b)        (2 | BIT(3,a) | BIT(4,b))
+#define MORSE3(a,b,c)      (3 | BIT(3,a) | BIT(4,b) | BIT(5,c))
+#define MORSE4(a,b,c,d)    (4 | BIT(3,a) | BIT(4,b) | BIT(5,c) | BIT(6,d))
+#define MORSE5(a,b,c,d,e)  (5 | BIT(3,a) | BIT(4,b) | BIT(5,c) | BIT(6,d) | BIT(7,e))
+
+static const uint8_t flight_reports[] = {
+       MORSE3(0,0,0),          /* startup, 'S' */
+       MORSE2(0,0),            /* idle 'I' */
+       MORSE4(0,1,1,0),        /* pad 'P' */
+       MORSE4(1,0,0,0),        /* boost 'B' */
+       MORSE4(0,0,1,0),        /* fast 'F' */
+       MORSE4(1,0,1,0),        /* coast 'C' */
+       MORSE3(1,0,0),          /* drogue 'D' */
+       MORSE2(1,1),            /* main 'M' */
+       MORSE4(0,1,0,0),        /* landed 'L' */
+       MORSE4(1,0,0,1),        /* invalid 'X' */
 };
 
-#if 1
-#define signal(time)   ao_beep_for(AO_BEEP_MID, time)
+#if HAS_BEEP
+#define low(time)      ao_beep_for(AO_BEEP_LOW, time)
+#define mid(time)      ao_beep_for(AO_BEEP_MID, time)
+#define high(time)     ao_beep_for(AO_BEEP_HIGH, time)
 #else
-#define signal(time)   ao_led_for(AO_LED_RED, time)
+#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)
 #endif
 #define pause(time)    ao_delay(time)
 
@@ -42,17 +53,18 @@ static __xdata enum ao_flight_state ao_report_state;
 static void
 ao_report_beep(void) __reentrant
 {
-       char *r = flight_reports[ao_flight_state];
-       char c;
+       uint8_t r = flight_reports[ao_flight_state];
+       uint8_t l = r & 7;
 
        if (!r)
                return;
-       while (c = *r++) {
-               if (c == '.')
-                       signal(AO_MS_TO_TICKS(200));
+       while (l--) {
+               if (r & 8)
+                       mid(AO_MS_TO_TICKS(600));
                else
-                       signal(AO_MS_TO_TICKS(600));
+                       mid(AO_MS_TO_TICKS(200));
                pause(AO_MS_TO_TICKS(200));
+               r >>= 1;
        }
        pause(AO_MS_TO_TICKS(400));
 }
@@ -61,12 +73,12 @@ static void
 ao_report_digit(uint8_t digit) __reentrant
 {
        if (!digit) {
-               signal(AO_MS_TO_TICKS(500));
+               mid(AO_MS_TO_TICKS(500));
                pause(AO_MS_TO_TICKS(200));
        } else {
                while (digit--) {
-                       signal(AO_MS_TO_TICKS(200));
-                       pause(AO_MS_TO_TICKS(200));
+                       mid(AO_MS_TO_TICKS(200));
+                       mid(AO_MS_TO_TICKS(200));
                }
        }
        pause(AO_MS_TO_TICKS(300));
@@ -110,14 +122,24 @@ ao_report_continuity(void) __reentrant
                     (ao_report_igniter_ready(ao_igniter_main) << 1));
        if (c) {
                while (c--) {
-                       ao_beep_for(AO_BEEP_HIGH, AO_MS_TO_TICKS(25));
+                       high(AO_MS_TO_TICKS(25));
                        pause(AO_MS_TO_TICKS(100));
                }
        } else {
                c = 10;
                while (c--) {
-                       ao_beep_for(AO_BEEP_HIGH, AO_MS_TO_TICKS(20));
-                       ao_beep_for(AO_BEEP_LOW, AO_MS_TO_TICKS(20));
+                       high(AO_MS_TO_TICKS(20));
+                       low(AO_MS_TO_TICKS(20));
+               }
+       }
+       if (ao_log_full()) {
+               pause(AO_MS_TO_TICKS(100));
+               c = 2;
+               while (c--) {
+                       low(AO_MS_TO_TICKS(100));
+                       mid(AO_MS_TO_TICKS(100));
+                       high(AO_MS_TO_TICKS(100));
+                       mid(AO_MS_TO_TICKS(100));
                }
        }
        c = 50;