Eliminate RDF tone generation.
[fw/altos] / ao_flight_test.c
index dea7b31ce05043ded361cde6f5991651b146dc7d..f4731aa8718a9ef326134e379cda363f8fbfa08c 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
+#define _GNU_SOURCE
+
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
 #define AO_ADC_RING    64
 #define ao_adc_ring_next(n)    (((n) + 1) & (AO_ADC_RING - 1))
@@ -65,7 +68,6 @@ 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)
 
 enum ao_igniter {
        ao_igniter_drogue = 0,
@@ -163,6 +165,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)
@@ -173,24 +178,60 @@ ao_sleep(void *wchan)
                uint16_t        tick;
                uint16_t        a, b;
                int             ret;
+               char            line[1024];
+               char            *saveptr;
+               char            *l;
+               char            *words[64];
+               int             nword;
 
                for (;;) {
-                       if (ao_records_read > 20 && ao_flight_state == ao_flight_startup)
+                       if (ao_records_read > 2 && 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;
                        }
-                       if (ret != 4)
+                       l = line;
+                       for (nword = 0; nword < 64; nword++) {
+                               words[nword] = strtok_r(l, " \t\n", &saveptr);
+                               l = NULL;
+                               if (words[nword] == NULL)
+                                       break;
+                       }
+                       if (nword == 4) {
+                               type = words[0][0];
+                               tick = strtoul(words[1], NULL, 16);
+                               a = strtoul(words[2], NULL, 16);
+                               b = strtoul(words[2], NULL, 16);
+                       } else if (nword >= 36 && strcmp(words[0], "CALL") == 0) {
+                               tick = atoi(words[10]);
+                               if (!ao_flight_started) {
+                                       type = 'F';
+                                       a = atoi(words[26]);
+                                       ao_flight_started = 1;
+                               } else {
+                                       type = 'A';
+                                       a = atoi(words[12]);
+                                       b = atoi(words[14]);
+                               }
+                       }
+                       if (type != 'F' && !ao_flight_started)
                                continue;
+
                        switch (type) {
                        case 'F':
+                               ao_flight_ground_accel = a;
+                               ao_flight_started = 1;
                                break;
                        case 'S':
                                break;
@@ -226,10 +267,10 @@ ao_dump_state(void)
                return;
        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_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_main_pres));
+               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));
        if (ao_flight_state == ao_flight_landed)
                exit(0);
 }