altos: Use 32-bits for flight state data (alt/speed/accel)
[fw/altos] / src / test / ao_flight_test.c
index 0abb4090d397e0a615ea1ca31a00288f7057d5a5..bb5c3a7d86d7618938e05d8795b5f7ef684eca79 100644 (file)
 #define ao_data_ring_next(n)   (((n) + 1) & (AO_DATA_RING - 1))
 #define ao_data_ring_prev(n)   (((n) - 1) & (AO_DATA_RING - 1))
 
+#if 0
 #define AO_M_TO_HEIGHT(m)      ((int16_t) (m))
 #define AO_MS_TO_SPEED(ms)     ((int16_t) ((ms) * 16))
 #define AO_MSS_TO_ACCEL(mss)   ((int16_t) ((mss) * 16))
+#endif
 
 #define AO_GPS_NEW_DATA                1
 #define AO_GPS_NEW_TRACKING    2
@@ -49,13 +51,13 @@ int ao_gps_new;
 #define HAS_MPU6000            1
 #define HAS_MMA655X            1
 #define HAS_HMC5883            1
+#define HAS_BEEP               1
+#define AO_CONFIG_MAX_SIZE     1024
 
 struct ao_adc {
        int16_t                 sense[AO_ADC_NUM_SENSE];
        int16_t                 v_batt;
        int16_t                 v_pbatt;
-       int16_t                 accel_ref;
-       int16_t                 accel;
        int16_t                 temp;
 };
 #else
@@ -93,6 +95,7 @@ struct ao_adc {
 #include <ao_data.h>
 #include <ao_log.h>
 #include <ao_telemetry.h>
+#include <ao_sample.h>
 
 #if TELEMEGA
 int ao_gps_count;
@@ -175,7 +178,7 @@ ao_gps_angle(void)
                        ao_gps_static.latitude / 1e7,
                        ao_gps_static.longitude / 1e7,
                        &dist, &bearing);
-       height = ao_gps_static.altitude - ao_gps_prev.altitude;
+       height = AO_TELEMETRY_LOCATION_ALTITUDE(&ao_gps_static) - AO_TELEMETRY_LOCATION_ALTITUDE(&ao_gps_prev);
 
        angle = atan2(dist, height);
        return angle * 180/M_PI;
@@ -234,7 +237,7 @@ double      main_time;
 
 int    tick_offset;
 
-static int32_t ao_k_height;
+static ao_k_t  ao_k_height;
 
 int16_t
 ao_time(void)
@@ -309,7 +312,7 @@ struct ao_cmds {
 #if TELEMEGA
 #include "ao_convert_pa.c"
 #include <ao_ms5607.h>
-struct ao_ms5607_prom  ms5607_prom;
+struct ao_ms5607_prom  ao_ms5607_prom;
 #include "ao_ms5607_convert.c"
 #define AO_PYRO_NUM    4
 #include <ao_pyro.h>
@@ -317,22 +320,8 @@ struct ao_ms5607_prom      ms5607_prom;
 #include "ao_convert.c"
 #endif
 
-struct ao_config {
-       uint16_t        main_deploy;
-       int16_t         accel_plus_g;
-       int16_t         accel_minus_g;
-       uint8_t         pad_orientation;
-       uint16_t        apogee_lockout;
-#if TELEMEGA
-       struct ao_pyro  pyro[AO_PYRO_NUM];      /* minor version 12 */
-       int16_t         accel_zero_along;
-       int16_t         accel_zero_across;
-       int16_t         accel_zero_through;
-#endif
-};
-
-#define AO_PAD_ORIENTATION_ANTENNA_UP  0
-#define AO_PAD_ORIENTATION_ANTENNA_DOWN        1
+#include <ao_config.h>
+#include <ao_fake_flight.h>
 
 #define ao_config_get()
 
@@ -732,6 +721,18 @@ ao_sleep(void *wchan)
                                        ao_flight_started = 1;
                                        ao_ground_pres = int32(bytes, 4);
                                        ao_ground_height = ao_pa_to_altitude(ao_ground_pres);
+                                       ao_ground_accel_along = int16(bytes, 8);
+                                       ao_ground_accel_across = int16(bytes, 10);
+                                       ao_ground_accel_through = int16(bytes, 12);
+                                       ao_ground_roll = int16(bytes, 14);
+                                       ao_ground_pitch = int16(bytes, 16);
+                                       ao_ground_yaw = int16(bytes, 18);
+                                       ao_ground_mpu6000.accel_x = ao_ground_accel_across;
+                                       ao_ground_mpu6000.accel_y = ao_ground_accel_along;
+                                       ao_ground_mpu6000.accel_z = ao_ground_accel_through;
+                                       ao_ground_mpu6000.gyro_x = ao_ground_pitch >> 9;
+                                       ao_ground_mpu6000.gyro_y = ao_ground_roll >> 9;
+                                       ao_ground_mpu6000.gyro_z = ao_ground_yaw >> 9;
                                        break;
                                case 'A':
                                        ao_data_static.tick = tick;
@@ -758,7 +759,10 @@ ao_sleep(void *wchan)
                                        ao_gps_static.tick = tick;
                                        ao_gps_static.latitude = int32(bytes, 0);
                                        ao_gps_static.longitude = int32(bytes, 4);
-                                       ao_gps_static.altitude = int32(bytes, 8);
+                                       {
+                                               int32_t altitude = int32(bytes, 8);
+                                               AO_TELEMETRY_LOCATION_SET_ALTITUDE(&ao_gps_static, altitude);
+                                       }
                                        ao_gps_static.flags = bytes[13];
                                        if (!ao_gps_count)
                                                ao_gps_first = ao_gps_static;
@@ -768,21 +772,21 @@ ao_sleep(void *wchan)
                                continue;
                        } else if (nword == 3 && strcmp(words[0], "ms5607") == 0) {
                                if (strcmp(words[1], "reserved:") == 0)
-                                       ms5607_prom.reserved = strtoul(words[2], NULL, 10);
+                                       ao_ms5607_prom.reserved = strtoul(words[2], NULL, 10);
                                else if (strcmp(words[1], "sens:") == 0)
-                                       ms5607_prom.sens = strtoul(words[2], NULL, 10);
+                                       ao_ms5607_prom.sens = strtoul(words[2], NULL, 10);
                                else if (strcmp(words[1], "off:") == 0)
-                                       ms5607_prom.off = strtoul(words[2], NULL, 10);
+                                       ao_ms5607_prom.off = strtoul(words[2], NULL, 10);
                                else if (strcmp(words[1], "tcs:") == 0)
-                                       ms5607_prom.tcs = strtoul(words[2], NULL, 10);
+                                       ao_ms5607_prom.tcs = strtoul(words[2], NULL, 10);
                                else if (strcmp(words[1], "tco:") == 0)
-                                       ms5607_prom.tco = strtoul(words[2], NULL, 10);
+                                       ao_ms5607_prom.tco = strtoul(words[2], NULL, 10);
                                else if (strcmp(words[1], "tref:") == 0)
-                                       ms5607_prom.tref = strtoul(words[2], NULL, 10);
+                                       ao_ms5607_prom.tref = strtoul(words[2], NULL, 10);
                                else if (strcmp(words[1], "tempsens:") == 0)
-                                       ms5607_prom.tempsens = strtoul(words[2], NULL, 10);
+                                       ao_ms5607_prom.tempsens = strtoul(words[2], NULL, 10);
                                else if (strcmp(words[1], "crc:") == 0)
-                                       ms5607_prom.crc = strtoul(words[2], NULL, 10);
+                                       ao_ms5607_prom.crc = strtoul(words[2], NULL, 10);
                                continue;
                        } else if (nword >= 3 && strcmp(words[0], "Pyro") == 0) {
                                int     p = strtoul(words[1], NULL, 10);
@@ -791,13 +795,14 @@ ao_sleep(void *wchan)
 
                                for (i = 2; i < nword; i++) {
                                        for (j = 0; j < NUM_PYRO_VALUES; j++)
-                                               if (!strcmp (words[2], ao_pyro_values[j].name))
+                                               if (!strcmp (words[i], ao_pyro_values[j].name))
                                                        break;
                                        if (j == NUM_PYRO_VALUES)
                                                continue;
                                        pyro->flags |= ao_pyro_values[j].flag;
                                        if (ao_pyro_values[j].offset != NO_VALUE && i + 1 < nword) {
                                                int16_t val = strtoul(words[++i], NULL, 10);
+                                               printf("pyro %d condition %s value %d\n", p, words[i-1], val);
                                                *((int16_t *) ((char *) pyro + ao_pyro_values[j].offset)) = val;
                                        }
                                }
@@ -991,6 +996,7 @@ void run_flight_fixed(char *name, FILE *f, int summary, char *info)
        emulator_in = f;
        emulator_info = info;
        ao_summary = summary;
+
        ao_flight_init();
        ao_flight();
 }