Make ao_flight_test able to read raw logging data
[fw/altos] / ao_flight_test.c
index 0b18969e7409238d197b636ce2319a20ed35aea1..a94fc7402c6ad4ab143486961e88c16aed0b0048 100644 (file)
@@ -108,7 +108,7 @@ const char const * const ao_state_names[] = {
 };
 
 struct ao_cmds {
-       uint8_t         cmd;
+       char            cmd;
        void            (*func)(void);
        const char      *help;
 };
@@ -127,6 +127,26 @@ ao_pres_to_altitude(int16_t pres) __reentrant
        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;
+}
+
+struct ao_config {
+       uint16_t        main_deploy;
+       int16_t         accel_zero_g;
+};
+
+#define ao_config_get()
+
+struct ao_config ao_config = { 250, 16000 };
+
 #include "ao_flight.c"
 
 void
@@ -143,6 +163,9 @@ ao_insert(void)
 }
 
 static int     ao_records_read = 0;
+static int     ao_eof_read = 0;
+static int     ao_flight_ground_accel;
+static int     ao_flight_started = 0;
 
 void
 ao_sleep(void *wchan)
@@ -153,24 +176,35 @@ ao_sleep(void *wchan)
                uint16_t        tick;
                uint16_t        a, b;
                int             ret;
+               char            line[1024];
 
                for (;;) {
                        if (ao_records_read > 20 && ao_flight_state == ao_flight_startup)
                        {
+                               ao_adc_static.accel = ao_flight_ground_accel;
                                ao_insert();
                                return;
                        }
 
-                       ret = fscanf(emulator_in, "%c %hx %hx %hx\n", &type, &tick, &a, &b);
-                       if (ret == EOF) {
-                               printf ("no more data, exiting simulation\n");
-                               exit(0);
+                       if (!fgets(line, sizeof (line), emulator_in)) {
+                               if (++ao_eof_read >= 1000) {
+                                       printf ("no more data, exiting simulation\n");
+                                       exit(0);
+                               }
+                               ao_adc_static.tick += 10;
+                               ao_insert();
                                return;
                        }
+                       ret = sscanf(line, "%c %hx %hx %hx", &type, &tick, &a, &b);
                        if (ret != 4)
                                continue;
+                       if (type != 'F' && !ao_flight_started)
+                               continue;
+
                        switch (type) {
                        case 'F':
+                               ao_flight_ground_accel = a;
+                               ao_flight_started = 1;
                                break;
                        case 'S':
                                break;
@@ -204,11 +238,12 @@ ao_dump_state(void)
 {
        if (ao_flight_state == ao_flight_startup)
                return;
-       printf ("\t\t\t\t\t%s accel %g vel %g alt %d\n",
+       printf ("\t\t\t\t\t%s accel %g vel %g alt %d main %d\n",
                ao_state_names[ao_flight_state],
                (ao_flight_accel - ao_ground_accel) / COUNTS_PER_G * GRAVITY,
                (double) ao_flight_vel / 100 / COUNTS_PER_G * GRAVITY,
-               altitude_table[ao_flight_pres >> 4]);
+               ao_pres_to_altitude(ao_flight_pres),
+               ao_pres_to_altitude(ao_main_pres));
        if (ao_flight_state == ao_flight_landed)
                exit(0);
 }