Make ao_flight_test able to read raw logging data
[fw/altos] / ao_flight_test.c
index a88d2b14ddb9d83e8c8c7eefdbcc2523f7b4519d..a94fc7402c6ad4ab143486961e88c16aed0b0048 100644 (file)
@@ -39,6 +39,8 @@ struct ao_adc {
 #define __pdata
 #define __data
 #define __xdata
 #define __pdata
 #define __data
 #define __xdata
+#define __code
+#define __reentrant
 
 enum ao_flight_state {
        ao_flight_startup = 0,
 
 enum ao_flight_state {
        ao_flight_startup = 0,
@@ -60,6 +62,10 @@ uint8_t ao_adc_head;
 #define ao_led_off(l)
 #define ao_timer_set_adc_interval(i)
 #define ao_wakeup(wchan) ao_dump_state()
 #define ao_led_off(l)
 #define ao_timer_set_adc_interval(i)
 #define ao_wakeup(wchan) ao_dump_state()
+#define ao_cmd_register(c)
+#define ao_usb_disable()
+#define ao_telemetry_set_interval(x)
+#define ao_rdf_set(rdf)
 
 enum ao_igniter {
        ao_igniter_drogue = 0,
 
 enum ao_igniter {
        ao_igniter_drogue = 0,
@@ -95,7 +101,52 @@ ao_dump_state(void);
 
 void
 ao_sleep(void *wchan);
 
 void
 ao_sleep(void *wchan);
-       
+
+const char const * const ao_state_names[] = {
+       "startup", "idle", "pad", "boost", "coast",
+       "apogee", "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;
+}
+
+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
 #include "ao_flight.c"
 
 void
@@ -104,14 +155,17 @@ ao_insert(void)
        ao_adc_ring[ao_adc_head] = ao_adc_static;
        ao_adc_head = ao_adc_ring_next(ao_adc_head);
        if (ao_flight_state != ao_flight_startup) {
        ao_adc_ring[ao_adc_head] = ao_adc_static;
        ao_adc_head = ao_adc_ring_next(ao_adc_head);
        if (ao_flight_state != ao_flight_startup) {
-               printf("tick %04x accel %04x pres %04x\n", 
-                      ao_adc_static.tick,
+               printf("time %g accel %d pres %d\n",
+                      (double) ao_adc_static.tick / 100,
                       ao_adc_static.accel,
                       ao_adc_static.pres);
        }
 }
 
 static int     ao_records_read = 0;
                       ao_adc_static.accel,
                       ao_adc_static.pres);
        }
 }
 
 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)
 
 void
 ao_sleep(void *wchan)
@@ -122,23 +176,35 @@ ao_sleep(void *wchan)
                uint16_t        tick;
                uint16_t        a, b;
                int             ret;
                uint16_t        tick;
                uint16_t        a, b;
                int             ret;
+               char            line[1024];
 
                for (;;) {
                        if (ao_records_read > 20 && ao_flight_state == ao_flight_startup)
                        {
 
                for (;;) {
                        if (ao_records_read > 20 && ao_flight_state == ao_flight_startup)
                        {
+                               ao_adc_static.accel = ao_flight_ground_accel;
                                ao_insert();
                                return;
                        }
 
                                ao_insert();
                                return;
                        }
 
-                       ret = fscanf(emulator_in, "%c %hx %hx %hx\n", &type, &tick, &a, &b);
-                       if (ret == EOF) {
+                       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;
                        }
                                ao_insert();
                                return;
                        }
+                       ret = sscanf(line, "%c %hx %hx %hx", &type, &tick, &a, &b);
                        if (ret != 4)
                                continue;
                        if (ret != 4)
                                continue;
+                       if (type != 'F' && !ao_flight_started)
+                               continue;
+
                        switch (type) {
                        case 'F':
                        switch (type) {
                        case 'F':
+                               ao_flight_ground_accel = a;
+                               ao_flight_started = 1;
                                break;
                        case 'S':
                                break;
                                break;
                        case 'S':
                                break;
@@ -162,20 +228,9 @@ ao_sleep(void *wchan)
                                break;
                        }
                }
                                break;
                        }
                }
-               
+
        }
 }
        }
 }
-
-const char const * const ao_state_names[] = {
-       "startup", "idle", "pad", "boost", "coast",
-       "apogee", "drogue", "main", "landed", "invalid"
-};
-
-static int16_t altitude[2048] = {
-#include "altitude.h"
-};
-
-#define GRAVITY 9.80665
 #define COUNTS_PER_G 264.8
 
 void
 #define COUNTS_PER_G 264.8
 
 void
@@ -183,11 +238,12 @@ ao_dump_state(void)
 {
        if (ao_flight_state == ao_flight_startup)
                return;
 {
        if (ao_flight_state == ao_flight_startup)
                return;
-       printf ("\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,
                ao_state_names[ao_flight_state],
                (ao_flight_accel - ao_ground_accel) / COUNTS_PER_G * GRAVITY,
-               (double) ao_flight_vel,
-               altitude[ao_flight_pres >> 4]);
+               (double) ao_flight_vel / 100 / COUNTS_PER_G * GRAVITY,
+               ao_pres_to_altitude(ao_flight_pres),
+               ao_pres_to_altitude(ao_main_pres));
        if (ao_flight_state == ao_flight_landed)
                exit(0);
 }
        if (ao_flight_state == ao_flight_landed)
                exit(0);
 }