altos/test: Add baro-only flight test program
[fw/altos] / src / ao_flight_test.c
index fde38dc334b2ccbbdc43902eba076b27241937e4..a635803f41b226b2bc988a65b229aaab60520883 100644 (file)
@@ -22,6 +22,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#define AO_HERTZ       100
+
 #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))
@@ -51,7 +53,7 @@ enum ao_flight_state {
        ao_flight_pad = 2,
        ao_flight_boost = 3,
        ao_flight_fast = 4,
-       ao_flight_apogee = 5,
+       ao_flight_coast = 5,
        ao_flight_drogue = 6,
        ao_flight_main = 7,
        ao_flight_landed = 8,
@@ -68,6 +70,9 @@ uint8_t ao_adc_head;
 #define ao_cmd_register(c)
 #define ao_usb_disable()
 #define ao_telemetry_set_interval(x)
+#define ao_rdf_set(rdf)
+#define ao_packet_slave_start()
+#define ao_packet_slave_stop()
 
 enum ao_igniter {
        ao_igniter_drogue = 0,
@@ -106,48 +111,36 @@ ao_sleep(void *wchan);
 
 const char const * const ao_state_names[] = {
        "startup", "idle", "pad", "boost", "fast",
-       "apogee", "drogue", "main", "landed", "invalid"
+       "coast", "drogue", "main", "landed", "invalid"
 };
 
 struct ao_cmds {
-       char            cmd;
        void            (*func)(void);
        const char      *help;
 };
 
-
-static int16_t altitude_table[2048] = {
-#include "altitude.h"
-};
-
-int16_t
-ao_pres_to_altitude(int16_t pres) __reentrant
-{
-       pres = pres >> 4;
-       if (pres < 0) pres = 0;
-       if (pres > 2047) pres = 2047;
-       return altitude_table[pres];
-}
-
-int16_t
-ao_altitude_to_pres(int16_t alt) __reentrant
-{
-       int16_t pres;
-
-       for (pres = 0; pres < 2047; pres++)
-               if (altitude_table[pres] <= alt)
-                       break;
-       return pres << 4;
-}
+#include "ao_convert.c"
 
 struct ao_config {
        uint16_t        main_deploy;
-       int16_t         accel_zero_g;
+       int16_t         accel_plus_g;
+       int16_t         accel_minus_g;
 };
 
 #define ao_config_get()
 
-struct ao_config ao_config = { 250, 16000 };
+struct ao_config ao_config;
+
+#define DATA_TO_XDATA(x) (x)
+
+#define HAS_FLIGHT 1
+#define HAS_ADC 1
+#define HAS_USB 1
+#define HAS_GPS 1
+#ifndef HAS_ACCEL
+#define HAS_ACCEL 1
+#define HAS_ACCEL_REF 0
+#endif
 
 #include "ao_flight.c"
 
@@ -173,7 +166,7 @@ void
 ao_sleep(void *wchan)
 {
        ao_dump_state();
-       if (wchan == &ao_adc_ring) {
+       if (wchan == &ao_adc_head) {
                char            type;
                uint16_t        tick;
                uint16_t        a, b;
@@ -212,7 +205,12 @@ ao_sleep(void *wchan)
                                type = words[0][0];
                                tick = strtoul(words[1], NULL, 16);
                                a = strtoul(words[2], NULL, 16);
-                               b = strtoul(words[2], NULL, 16);
+                               b = strtoul(words[3], NULL, 16);
+                       } else if (nword >= 6 && strcmp(words[0], "Accel")) {
+                               ao_config.accel_plus_g = atoi(words[3]);
+                               ao_config.accel_minus_g = atoi(words[5]);
+                       } else if (nword >= 4 && strcmp(words[0], "Main")) {
+                               ao_config.main_deploy = atoi(words[2]);
                        } else if (nword >= 36 && strcmp(words[0], "CALL") == 0) {
                                tick = atoi(words[10]);
                                if (!ao_flight_started) {
@@ -231,6 +229,12 @@ ao_sleep(void *wchan)
                        switch (type) {
                        case 'F':
                                ao_flight_ground_accel = a;
+                               if (ao_config.accel_plus_g == 0) {
+                                       ao_config.accel_plus_g = a;
+                                       ao_config.accel_minus_g = a + 530;
+                               }
+                               if (ao_config.main_deploy == 0)
+                                       ao_config.main_deploy = 250;
                                ao_flight_started = 1;
                                break;
                        case 'S':
@@ -265,12 +269,19 @@ ao_dump_state(void)
 {
        if (ao_flight_state == ao_flight_startup)
                return;
+#if HAS_ACCEL
        printf ("\t\t\t\t\t%s accel %g vel %g alt %d main %d\n",
                ao_state_names[ao_flight_state],
                (ao_ground_accel - ao_flight_accel) / COUNTS_PER_G * GRAVITY,
                (double) ao_flight_vel / 100 / COUNTS_PER_G * GRAVITY,
                ao_pres_to_altitude(ao_flight_pres) - ao_pres_to_altitude(ao_ground_pres),
                ao_pres_to_altitude(ao_main_pres) - ao_pres_to_altitude(ao_ground_pres));
+#else
+       printf ("\t\t\t\t\t%s alt %d main %d\n",
+               ao_state_names[ao_flight_state],
+               ao_pres_to_altitude(ao_flight_pres) - ao_pres_to_altitude(ao_ground_pres),
+               ao_pres_to_altitude(ao_main_pres) - ao_pres_to_altitude(ao_ground_pres));
+#endif
        if (ao_flight_state == ao_flight_landed)
                exit(0);
 }