altos: Rename *_mm.c back to *.c
authorKeith Packard <keithp@keithp.com>
Tue, 10 Jul 2012 22:11:36 +0000 (15:11 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 10 Jul 2012 22:11:36 +0000 (15:11 -0700)
Was just a temporary hack to keep cc1111 products building during MM development.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/core/ao_flight.c [new file with mode: 0644]
src/core/ao_flight_mm.c [deleted file]
src/core/ao_sample.c [new file with mode: 0644]
src/core/ao_sample_mm.c [deleted file]
src/megametrum-v0.1/Makefile
src/product/Makefile.telemetrum
src/product/Makefile.telemini
src/product/Makefile.telenano
src/test/Makefile
src/test/ao_flight_test.c

diff --git a/src/core/ao_flight.c b/src/core/ao_flight.c
new file mode 100644 (file)
index 0000000..a0affc4
--- /dev/null
@@ -0,0 +1,418 @@
+/*
+ * Copyright © 2009 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef AO_FLIGHT_TEST
+#include "ao.h"
+#include <ao_log.h>
+#endif
+
+#ifndef HAS_ACCEL
+#error Please define HAS_ACCEL
+#endif
+
+#ifndef HAS_GPS
+#error Please define HAS_GPS
+#endif
+
+#ifndef HAS_USB
+#error Please define HAS_USB
+#endif
+
+#ifndef HAS_TELEMETRY
+#define HAS_TELEMETRY  HAS_RADIO
+#endif
+
+/* Main flight thread. */
+
+__pdata enum ao_flight_state   ao_flight_state;        /* current flight state */
+__pdata uint16_t               ao_boost_tick;          /* time of launch detect */
+
+/*
+ * track min/max data over a long interval to detect
+ * resting
+ */
+static __data uint16_t         ao_interval_end;
+static __data int16_t          ao_interval_min_height;
+static __data int16_t          ao_interval_max_height;
+static __data int16_t          ao_coast_avg_accel;
+
+__pdata uint8_t                        ao_flight_force_idle;
+
+/* We also have a clock, which can be used to sanity check things in
+ * case of other failures
+ */
+
+#define BOOST_TICKS_MAX        AO_SEC_TO_TICKS(15)
+
+/* Landing is detected by getting constant readings from both pressure and accelerometer
+ * for a fairly long time (AO_INTERVAL_TICKS)
+ */
+#define AO_INTERVAL_TICKS      AO_SEC_TO_TICKS(10)
+
+#define abs(a) ((a) < 0 ? -(a) : (a))
+
+void
+ao_flight(void)
+{
+       ao_sample_init();
+       ao_flight_state = ao_flight_startup;
+       for (;;) {
+
+               /*
+                * Process ADC samples, just looping
+                * until the sensors are calibrated.
+                */
+               if (!ao_sample())
+                       continue;
+
+               switch (ao_flight_state) {
+               case ao_flight_startup:
+
+                       /* Check to see what mode we should go to.
+                        *  - Invalid mode if accel cal appears to be out
+                        *  - pad mode if we're upright,
+                        *  - idle mode otherwise
+                        */
+#if HAS_ACCEL
+                       if (ao_config.accel_plus_g == 0 ||
+                           ao_config.accel_minus_g == 0 ||
+                           ao_ground_accel < ao_config.accel_plus_g - ACCEL_NOSE_UP ||
+                           ao_ground_accel > ao_config.accel_minus_g + ACCEL_NOSE_UP)
+                       {
+                               /* Detected an accel value outside -1.5g to 1.5g
+                                * (or uncalibrated values), so we go into invalid mode
+                                */
+                               ao_flight_state = ao_flight_invalid;
+
+#if HAS_RADIO && PACKET_HAS_SLAVE
+                               /* Turn on packet system in invalid mode on TeleMetrum */
+                               ao_packet_slave_start();
+#endif
+                       } else
+#endif
+                               if (!ao_flight_force_idle
+#if HAS_ACCEL
+                                   && ao_ground_accel < ao_config.accel_plus_g + ACCEL_NOSE_UP
+#endif
+                                       )
+                       {
+                               /* Set pad mode - we can fly! */
+                               ao_flight_state = ao_flight_pad;
+#if HAS_USB && HAS_RADIO
+                               /* Disable the USB controller in flight mode
+                                * to save power
+                                */
+                               ao_usb_disable();
+#endif
+
+#if !HAS_ACCEL
+                               /* Disable packet mode in pad state on TeleMini */
+                               ao_packet_slave_stop();
+#endif
+
+#if HAS_TELEMETRY
+                               /* Turn on telemetry system */
+                               ao_rdf_set(1);
+                               ao_telemetry_set_interval(AO_TELEMETRY_INTERVAL_PAD);
+#endif
+                               /* signal successful initialization by turning off the LED */
+                               ao_led_off(AO_LED_RED);
+                       } else {
+                               /* Set idle mode */
+                               ao_flight_state = ao_flight_idle;
+#if HAS_ACCEL && HAS_RADIO && PACKET_HAS_SLAVE
+                               /* Turn on packet system in idle mode on TeleMetrum */
+                               ao_packet_slave_start();
+#endif
+
+                               /* signal successful initialization by turning off the LED */
+                               ao_led_off(AO_LED_RED);
+                       }
+                       /* wakeup threads due to state change */
+                       ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
+
+                       break;
+               case ao_flight_pad:
+
+                       /* pad to boost:
+                        *
+                        * barometer: > 20m vertical motion
+                        *             OR
+                        * accelerometer: > 2g AND velocity > 5m/s
+                        *
+                        * The accelerometer should always detect motion before
+                        * the barometer, but we use both to make sure this
+                        * transition is detected. If the device
+                        * doesn't have an accelerometer, then ignore the
+                        * speed and acceleration as they are quite noisy
+                        * on the pad.
+                        */
+                       if (ao_height > AO_M_TO_HEIGHT(20)
+#if HAS_ACCEL
+                           || (ao_accel > AO_MSS_TO_ACCEL(20) &&
+                               ao_speed > AO_MS_TO_SPEED(5))
+#endif
+                               )
+                       {
+                               ao_flight_state = ao_flight_boost;
+                               ao_boost_tick = ao_sample_tick;
+
+                               /* start logging data */
+                               ao_log_start();
+
+#if HAS_TELEMETRY
+                               /* Increase telemetry rate */
+                               ao_telemetry_set_interval(AO_TELEMETRY_INTERVAL_FLIGHT);
+
+                               /* disable RDF beacon */
+                               ao_rdf_set(0);
+#endif
+
+#if HAS_GPS
+                               /* Record current GPS position by waking up GPS log tasks */
+                               ao_wakeup(&ao_gps_data);
+                               ao_wakeup(&ao_gps_tracking_data);
+#endif
+
+                               ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
+                       }
+                       break;
+               case ao_flight_boost:
+
+                       /* boost to fast:
+                        *
+                        * accelerometer: start to fall at > 1/4 G
+                        *              OR
+                        * time: boost for more than 15 seconds
+                        *
+                        * Detects motor burn out by the switch from acceleration to
+                        * deceleration, or by waiting until the maximum burn duration
+                        * (15 seconds) has past.
+                        */
+                       if ((ao_accel < AO_MSS_TO_ACCEL(-2.5) && ao_height > AO_M_TO_HEIGHT(100)) ||
+                           (int16_t) (ao_sample_tick - ao_boost_tick) > BOOST_TICKS_MAX)
+                       {
+#if HAS_ACCEL
+                               ao_flight_state = ao_flight_fast;
+                               ao_coast_avg_accel = ao_accel;
+#else
+                               ao_flight_state = ao_flight_coast;
+#endif
+                               ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
+                       }
+                       break;
+#if HAS_ACCEL
+               case ao_flight_fast:
+                       /*
+                        * This is essentially the same as coast,
+                        * but the barometer is being ignored as
+                        * it may be unreliable.
+                        */
+                       if (ao_speed < AO_MS_TO_SPEED(AO_MAX_BARO_SPEED))
+                       {
+                               ao_flight_state = ao_flight_coast;
+                               ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
+                       } else
+                               goto check_re_boost;
+                       break;
+#endif
+               case ao_flight_coast:
+
+                       /*
+                        * By customer request - allow the user
+                        * to lock out apogee detection for a specified
+                        * number of seconds.
+                        */
+                       if (ao_config.apogee_lockout) {
+                               if ((ao_sample_tick - ao_boost_tick) <
+                                   AO_SEC_TO_TICKS(ao_config.apogee_lockout))
+                                       break;
+                       }
+
+                       /* apogee detect: coast to drogue deploy:
+                        *
+                        * speed: < 0
+                        *
+                        * Also make sure the model altitude is tracking
+                        * the measured altitude reasonably closely; otherwise
+                        * we're probably transsonic.
+                        */
+                       if (ao_speed < 0
+#if !HAS_ACCEL
+                           && (ao_sample_alt >= AO_MAX_BARO_HEIGHT || ao_error_h_sq_avg < 100)
+#endif
+                               )
+                       {
+#if HAS_IGNITE
+                               /* ignite the drogue charge */
+                               ao_ignite(ao_igniter_drogue);
+#endif
+
+#if HAS_TELEMETRY
+                               /* slow down the telemetry system */
+                               ao_telemetry_set_interval(AO_TELEMETRY_INTERVAL_RECOVER);
+
+                               /* Turn the RDF beacon back on */
+                               ao_rdf_set(1);
+#endif
+
+                               /* and enter drogue state */
+                               ao_flight_state = ao_flight_drogue;
+                               ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
+                       }
+#if HAS_ACCEL
+                       else {
+                       check_re_boost:
+                               ao_coast_avg_accel = ao_coast_avg_accel - (ao_coast_avg_accel >> 6) + (ao_accel >> 6);
+                               if (ao_coast_avg_accel > AO_MSS_TO_ACCEL(20)) {
+                                       ao_boost_tick = ao_sample_tick;
+                                       ao_flight_state = ao_flight_boost;
+                                       ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
+                               }
+                       }
+#endif
+
+                       break;
+               case ao_flight_drogue:
+
+                       /* drogue to main deploy:
+                        *
+                        * barometer: reach main deploy altitude
+                        *
+                        * Would like to use the accelerometer for this test, but
+                        * the orientation of the flight computer is unknown after
+                        * drogue deploy, so we ignore it. Could also detect
+                        * high descent rate using the pressure sensor to
+                        * recognize drogue deploy failure and eject the main
+                        * at that point. Perhaps also use the drogue sense lines
+                        * to notice continutity?
+                        */
+                       if (ao_height <= ao_config.main_deploy)
+                       {
+#if HAS_IGNITE
+                               ao_ignite(ao_igniter_main);
+#endif
+
+                               /*
+                                * Start recording min/max height
+                                * to figure out when the rocket has landed
+                                */
+
+                               /* initialize interval values */
+                               ao_interval_end = ao_sample_tick + AO_INTERVAL_TICKS;
+
+                               ao_interval_min_height = ao_interval_max_height = ao_avg_height;
+
+                               ao_flight_state = ao_flight_main;
+                               ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
+                       }
+                       break;
+
+                       /* fall through... */
+               case ao_flight_main:
+
+                       /* main to land:
+                        *
+                        * barometer: altitude stable
+                        */
+
+                       if (ao_avg_height < ao_interval_min_height)
+                               ao_interval_min_height = ao_avg_height;
+                       if (ao_avg_height > ao_interval_max_height)
+                               ao_interval_max_height = ao_avg_height;
+
+                       if ((int16_t) (ao_sample_tick - ao_interval_end) >= 0) {
+                               if (ao_interval_max_height - ao_interval_min_height <= AO_M_TO_HEIGHT(4))
+                               {
+                                       ao_flight_state = ao_flight_landed;
+
+                                       /* turn off the ADC capture */
+                                       ao_timer_set_adc_interval(0);
+
+                                       ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
+                               }
+                               ao_interval_min_height = ao_interval_max_height = ao_avg_height;
+                               ao_interval_end = ao_sample_tick + AO_INTERVAL_TICKS;
+                       }
+                       break;
+               case ao_flight_landed:
+                       break;
+               }
+       }
+}
+
+#if !HAS_RADIO
+static inline int int_part(int16_t i)  { return i >> 4; }
+static inline int frac_part(int16_t i) { return ((i & 0xf) * 100 + 8) / 16; }
+
+static void
+ao_flight_dump(void)
+{
+#if HAS_ACCEL
+       int16_t accel;
+
+       accel = ((ao_ground_accel - ao_sample_accel) * ao_accel_scale) >> 16;
+#endif
+
+       printf ("sample:\n");
+       printf ("  tick        %d\n", ao_sample_tick);
+       printf ("  raw pres    %d\n", ao_sample_pres);
+#if HAS_ACCEL
+       printf ("  raw accel   %d\n", ao_sample_accel);
+#endif
+       printf ("  ground pres %d\n", ao_ground_pres);
+#if HAS_ACCEL
+       printf ("  raw accel   %d\n", ao_sample_accel);
+       printf ("  groundaccel %d\n", ao_ground_accel);
+       printf ("  accel_2g    %d\n", ao_accel_2g);
+#endif
+
+       printf ("  alt         %d\n", ao_sample_alt);
+       printf ("  height      %d\n", ao_sample_height);
+#if HAS_ACCEL
+       printf ("  accel       %d.%02d\n", int_part(accel), frac_part(accel));
+#endif
+
+
+       printf ("kalman:\n");
+       printf ("  height      %d\n", ao_height);
+       printf ("  speed       %d.%02d\n", int_part(ao_speed), frac_part(ao_speed));
+       printf ("  accel       %d.%02d\n", int_part(ao_accel), frac_part(ao_accel));
+       printf ("  max_height  %d\n", ao_max_height);
+       printf ("  avg_height  %d\n", ao_avg_height);
+       printf ("  error_h     %d\n", ao_error_h);
+       printf ("  error_avg   %d\n", ao_error_h_sq_avg);
+}
+
+__code struct ao_cmds ao_flight_cmds[] = {
+       { ao_flight_dump,       "F\0Dump flight status" },
+       { 0, NULL },
+};
+#endif
+
+static __xdata struct ao_task  flight_task;
+
+void
+ao_flight_init(void)
+{
+       ao_flight_state = ao_flight_startup;
+#if !HAS_RADIO
+       ao_cmd_register(&ao_flight_cmds[0]);
+#endif
+       ao_add_task(&flight_task, ao_flight, "flight");
+}
diff --git a/src/core/ao_flight_mm.c b/src/core/ao_flight_mm.c
deleted file mode 100644 (file)
index a0affc4..0000000
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
- * Copyright © 2009 Keith Packard <keithp@keithp.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-
-#ifndef AO_FLIGHT_TEST
-#include "ao.h"
-#include <ao_log.h>
-#endif
-
-#ifndef HAS_ACCEL
-#error Please define HAS_ACCEL
-#endif
-
-#ifndef HAS_GPS
-#error Please define HAS_GPS
-#endif
-
-#ifndef HAS_USB
-#error Please define HAS_USB
-#endif
-
-#ifndef HAS_TELEMETRY
-#define HAS_TELEMETRY  HAS_RADIO
-#endif
-
-/* Main flight thread. */
-
-__pdata enum ao_flight_state   ao_flight_state;        /* current flight state */
-__pdata uint16_t               ao_boost_tick;          /* time of launch detect */
-
-/*
- * track min/max data over a long interval to detect
- * resting
- */
-static __data uint16_t         ao_interval_end;
-static __data int16_t          ao_interval_min_height;
-static __data int16_t          ao_interval_max_height;
-static __data int16_t          ao_coast_avg_accel;
-
-__pdata uint8_t                        ao_flight_force_idle;
-
-/* We also have a clock, which can be used to sanity check things in
- * case of other failures
- */
-
-#define BOOST_TICKS_MAX        AO_SEC_TO_TICKS(15)
-
-/* Landing is detected by getting constant readings from both pressure and accelerometer
- * for a fairly long time (AO_INTERVAL_TICKS)
- */
-#define AO_INTERVAL_TICKS      AO_SEC_TO_TICKS(10)
-
-#define abs(a) ((a) < 0 ? -(a) : (a))
-
-void
-ao_flight(void)
-{
-       ao_sample_init();
-       ao_flight_state = ao_flight_startup;
-       for (;;) {
-
-               /*
-                * Process ADC samples, just looping
-                * until the sensors are calibrated.
-                */
-               if (!ao_sample())
-                       continue;
-
-               switch (ao_flight_state) {
-               case ao_flight_startup:
-
-                       /* Check to see what mode we should go to.
-                        *  - Invalid mode if accel cal appears to be out
-                        *  - pad mode if we're upright,
-                        *  - idle mode otherwise
-                        */
-#if HAS_ACCEL
-                       if (ao_config.accel_plus_g == 0 ||
-                           ao_config.accel_minus_g == 0 ||
-                           ao_ground_accel < ao_config.accel_plus_g - ACCEL_NOSE_UP ||
-                           ao_ground_accel > ao_config.accel_minus_g + ACCEL_NOSE_UP)
-                       {
-                               /* Detected an accel value outside -1.5g to 1.5g
-                                * (or uncalibrated values), so we go into invalid mode
-                                */
-                               ao_flight_state = ao_flight_invalid;
-
-#if HAS_RADIO && PACKET_HAS_SLAVE
-                               /* Turn on packet system in invalid mode on TeleMetrum */
-                               ao_packet_slave_start();
-#endif
-                       } else
-#endif
-                               if (!ao_flight_force_idle
-#if HAS_ACCEL
-                                   && ao_ground_accel < ao_config.accel_plus_g + ACCEL_NOSE_UP
-#endif
-                                       )
-                       {
-                               /* Set pad mode - we can fly! */
-                               ao_flight_state = ao_flight_pad;
-#if HAS_USB && HAS_RADIO
-                               /* Disable the USB controller in flight mode
-                                * to save power
-                                */
-                               ao_usb_disable();
-#endif
-
-#if !HAS_ACCEL
-                               /* Disable packet mode in pad state on TeleMini */
-                               ao_packet_slave_stop();
-#endif
-
-#if HAS_TELEMETRY
-                               /* Turn on telemetry system */
-                               ao_rdf_set(1);
-                               ao_telemetry_set_interval(AO_TELEMETRY_INTERVAL_PAD);
-#endif
-                               /* signal successful initialization by turning off the LED */
-                               ao_led_off(AO_LED_RED);
-                       } else {
-                               /* Set idle mode */
-                               ao_flight_state = ao_flight_idle;
-#if HAS_ACCEL && HAS_RADIO && PACKET_HAS_SLAVE
-                               /* Turn on packet system in idle mode on TeleMetrum */
-                               ao_packet_slave_start();
-#endif
-
-                               /* signal successful initialization by turning off the LED */
-                               ao_led_off(AO_LED_RED);
-                       }
-                       /* wakeup threads due to state change */
-                       ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
-
-                       break;
-               case ao_flight_pad:
-
-                       /* pad to boost:
-                        *
-                        * barometer: > 20m vertical motion
-                        *             OR
-                        * accelerometer: > 2g AND velocity > 5m/s
-                        *
-                        * The accelerometer should always detect motion before
-                        * the barometer, but we use both to make sure this
-                        * transition is detected. If the device
-                        * doesn't have an accelerometer, then ignore the
-                        * speed and acceleration as they are quite noisy
-                        * on the pad.
-                        */
-                       if (ao_height > AO_M_TO_HEIGHT(20)
-#if HAS_ACCEL
-                           || (ao_accel > AO_MSS_TO_ACCEL(20) &&
-                               ao_speed > AO_MS_TO_SPEED(5))
-#endif
-                               )
-                       {
-                               ao_flight_state = ao_flight_boost;
-                               ao_boost_tick = ao_sample_tick;
-
-                               /* start logging data */
-                               ao_log_start();
-
-#if HAS_TELEMETRY
-                               /* Increase telemetry rate */
-                               ao_telemetry_set_interval(AO_TELEMETRY_INTERVAL_FLIGHT);
-
-                               /* disable RDF beacon */
-                               ao_rdf_set(0);
-#endif
-
-#if HAS_GPS
-                               /* Record current GPS position by waking up GPS log tasks */
-                               ao_wakeup(&ao_gps_data);
-                               ao_wakeup(&ao_gps_tracking_data);
-#endif
-
-                               ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
-                       }
-                       break;
-               case ao_flight_boost:
-
-                       /* boost to fast:
-                        *
-                        * accelerometer: start to fall at > 1/4 G
-                        *              OR
-                        * time: boost for more than 15 seconds
-                        *
-                        * Detects motor burn out by the switch from acceleration to
-                        * deceleration, or by waiting until the maximum burn duration
-                        * (15 seconds) has past.
-                        */
-                       if ((ao_accel < AO_MSS_TO_ACCEL(-2.5) && ao_height > AO_M_TO_HEIGHT(100)) ||
-                           (int16_t) (ao_sample_tick - ao_boost_tick) > BOOST_TICKS_MAX)
-                       {
-#if HAS_ACCEL
-                               ao_flight_state = ao_flight_fast;
-                               ao_coast_avg_accel = ao_accel;
-#else
-                               ao_flight_state = ao_flight_coast;
-#endif
-                               ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
-                       }
-                       break;
-#if HAS_ACCEL
-               case ao_flight_fast:
-                       /*
-                        * This is essentially the same as coast,
-                        * but the barometer is being ignored as
-                        * it may be unreliable.
-                        */
-                       if (ao_speed < AO_MS_TO_SPEED(AO_MAX_BARO_SPEED))
-                       {
-                               ao_flight_state = ao_flight_coast;
-                               ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
-                       } else
-                               goto check_re_boost;
-                       break;
-#endif
-               case ao_flight_coast:
-
-                       /*
-                        * By customer request - allow the user
-                        * to lock out apogee detection for a specified
-                        * number of seconds.
-                        */
-                       if (ao_config.apogee_lockout) {
-                               if ((ao_sample_tick - ao_boost_tick) <
-                                   AO_SEC_TO_TICKS(ao_config.apogee_lockout))
-                                       break;
-                       }
-
-                       /* apogee detect: coast to drogue deploy:
-                        *
-                        * speed: < 0
-                        *
-                        * Also make sure the model altitude is tracking
-                        * the measured altitude reasonably closely; otherwise
-                        * we're probably transsonic.
-                        */
-                       if (ao_speed < 0
-#if !HAS_ACCEL
-                           && (ao_sample_alt >= AO_MAX_BARO_HEIGHT || ao_error_h_sq_avg < 100)
-#endif
-                               )
-                       {
-#if HAS_IGNITE
-                               /* ignite the drogue charge */
-                               ao_ignite(ao_igniter_drogue);
-#endif
-
-#if HAS_TELEMETRY
-                               /* slow down the telemetry system */
-                               ao_telemetry_set_interval(AO_TELEMETRY_INTERVAL_RECOVER);
-
-                               /* Turn the RDF beacon back on */
-                               ao_rdf_set(1);
-#endif
-
-                               /* and enter drogue state */
-                               ao_flight_state = ao_flight_drogue;
-                               ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
-                       }
-#if HAS_ACCEL
-                       else {
-                       check_re_boost:
-                               ao_coast_avg_accel = ao_coast_avg_accel - (ao_coast_avg_accel >> 6) + (ao_accel >> 6);
-                               if (ao_coast_avg_accel > AO_MSS_TO_ACCEL(20)) {
-                                       ao_boost_tick = ao_sample_tick;
-                                       ao_flight_state = ao_flight_boost;
-                                       ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
-                               }
-                       }
-#endif
-
-                       break;
-               case ao_flight_drogue:
-
-                       /* drogue to main deploy:
-                        *
-                        * barometer: reach main deploy altitude
-                        *
-                        * Would like to use the accelerometer for this test, but
-                        * the orientation of the flight computer is unknown after
-                        * drogue deploy, so we ignore it. Could also detect
-                        * high descent rate using the pressure sensor to
-                        * recognize drogue deploy failure and eject the main
-                        * at that point. Perhaps also use the drogue sense lines
-                        * to notice continutity?
-                        */
-                       if (ao_height <= ao_config.main_deploy)
-                       {
-#if HAS_IGNITE
-                               ao_ignite(ao_igniter_main);
-#endif
-
-                               /*
-                                * Start recording min/max height
-                                * to figure out when the rocket has landed
-                                */
-
-                               /* initialize interval values */
-                               ao_interval_end = ao_sample_tick + AO_INTERVAL_TICKS;
-
-                               ao_interval_min_height = ao_interval_max_height = ao_avg_height;
-
-                               ao_flight_state = ao_flight_main;
-                               ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
-                       }
-                       break;
-
-                       /* fall through... */
-               case ao_flight_main:
-
-                       /* main to land:
-                        *
-                        * barometer: altitude stable
-                        */
-
-                       if (ao_avg_height < ao_interval_min_height)
-                               ao_interval_min_height = ao_avg_height;
-                       if (ao_avg_height > ao_interval_max_height)
-                               ao_interval_max_height = ao_avg_height;
-
-                       if ((int16_t) (ao_sample_tick - ao_interval_end) >= 0) {
-                               if (ao_interval_max_height - ao_interval_min_height <= AO_M_TO_HEIGHT(4))
-                               {
-                                       ao_flight_state = ao_flight_landed;
-
-                                       /* turn off the ADC capture */
-                                       ao_timer_set_adc_interval(0);
-
-                                       ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
-                               }
-                               ao_interval_min_height = ao_interval_max_height = ao_avg_height;
-                               ao_interval_end = ao_sample_tick + AO_INTERVAL_TICKS;
-                       }
-                       break;
-               case ao_flight_landed:
-                       break;
-               }
-       }
-}
-
-#if !HAS_RADIO
-static inline int int_part(int16_t i)  { return i >> 4; }
-static inline int frac_part(int16_t i) { return ((i & 0xf) * 100 + 8) / 16; }
-
-static void
-ao_flight_dump(void)
-{
-#if HAS_ACCEL
-       int16_t accel;
-
-       accel = ((ao_ground_accel - ao_sample_accel) * ao_accel_scale) >> 16;
-#endif
-
-       printf ("sample:\n");
-       printf ("  tick        %d\n", ao_sample_tick);
-       printf ("  raw pres    %d\n", ao_sample_pres);
-#if HAS_ACCEL
-       printf ("  raw accel   %d\n", ao_sample_accel);
-#endif
-       printf ("  ground pres %d\n", ao_ground_pres);
-#if HAS_ACCEL
-       printf ("  raw accel   %d\n", ao_sample_accel);
-       printf ("  groundaccel %d\n", ao_ground_accel);
-       printf ("  accel_2g    %d\n", ao_accel_2g);
-#endif
-
-       printf ("  alt         %d\n", ao_sample_alt);
-       printf ("  height      %d\n", ao_sample_height);
-#if HAS_ACCEL
-       printf ("  accel       %d.%02d\n", int_part(accel), frac_part(accel));
-#endif
-
-
-       printf ("kalman:\n");
-       printf ("  height      %d\n", ao_height);
-       printf ("  speed       %d.%02d\n", int_part(ao_speed), frac_part(ao_speed));
-       printf ("  accel       %d.%02d\n", int_part(ao_accel), frac_part(ao_accel));
-       printf ("  max_height  %d\n", ao_max_height);
-       printf ("  avg_height  %d\n", ao_avg_height);
-       printf ("  error_h     %d\n", ao_error_h);
-       printf ("  error_avg   %d\n", ao_error_h_sq_avg);
-}
-
-__code struct ao_cmds ao_flight_cmds[] = {
-       { ao_flight_dump,       "F\0Dump flight status" },
-       { 0, NULL },
-};
-#endif
-
-static __xdata struct ao_task  flight_task;
-
-void
-ao_flight_init(void)
-{
-       ao_flight_state = ao_flight_startup;
-#if !HAS_RADIO
-       ao_cmd_register(&ao_flight_cmds[0]);
-#endif
-       ao_add_task(&flight_task, ao_flight, "flight");
-}
diff --git a/src/core/ao_sample.c b/src/core/ao_sample.c
new file mode 100644 (file)
index 0000000..ac11eef
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * Copyright © 2011 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef AO_FLIGHT_TEST
+#include "ao.h"
+#include <ao_data.h>
+#endif
+
+/*
+ * Current sensor values
+ */
+
+#ifndef PRES_TYPE
+#define PRES_TYPE int32_t
+#define ALT_TYPE int32_t
+#define ACCEL_TYPE int16_t
+#endif
+
+__pdata uint16_t       ao_sample_tick;         /* time of last data */
+__pdata pres_t         ao_sample_pres;
+__pdata alt_t          ao_sample_alt;
+__pdata alt_t          ao_sample_height;
+#if HAS_ACCEL
+__pdata accel_t                ao_sample_accel;
+#endif
+
+__data uint8_t         ao_sample_data;
+
+/*
+ * Sensor calibration values
+ */
+
+__pdata pres_t         ao_ground_pres;         /* startup pressure */
+__pdata alt_t          ao_ground_height;       /* MSL of ao_ground_pres */
+
+#if HAS_ACCEL
+__pdata accel_t                ao_ground_accel;        /* startup acceleration */
+__pdata accel_t                ao_accel_2g;            /* factory accel calibration */
+__pdata int32_t                ao_accel_scale;         /* sensor to m/s² conversion */
+#endif
+
+static __pdata uint8_t ao_preflight;           /* in preflight mode */
+
+static __pdata uint16_t        nsamples;
+__pdata int32_t ao_sample_pres_sum;
+#if HAS_ACCEL
+__pdata int32_t ao_sample_accel_sum;
+#endif
+
+static void
+ao_sample_preflight(void)
+{
+       /* startup state:
+        *
+        * Collect 512 samples of acceleration and pressure
+        * data and average them to find the resting values
+        */
+       if (nsamples < 512) {
+#if HAS_ACCEL
+               ao_sample_accel_sum += ao_sample_accel;
+#endif
+               ao_sample_pres_sum += ao_sample_pres;
+               ++nsamples;
+       } else {
+               ao_config_get();
+#if HAS_ACCEL
+               ao_ground_accel = ao_sample_accel_sum >> 9;
+               ao_accel_2g = ao_config.accel_minus_g - ao_config.accel_plus_g;
+               ao_accel_scale = to_fix32(GRAVITY * 2 * 16) / ao_accel_2g;
+#endif
+               ao_ground_pres = ao_sample_pres_sum >> 9;
+               ao_ground_height = pres_to_altitude(ao_ground_pres);
+               ao_preflight = FALSE;
+       }
+}
+
+
+uint8_t
+ao_sample(void)
+{
+       ao_config_get();
+       ao_wakeup(DATA_TO_XDATA(&ao_sample_data));
+       ao_sleep((void *) DATA_TO_XDATA(&ao_data_head));
+       while (ao_sample_data != ao_data_head) {
+               __xdata struct ao_data *ao_data;
+
+               /* Capture a sample */
+               ao_data = (struct ao_data *) &ao_data_ring[ao_sample_data];
+               ao_sample_tick = ao_data->tick;
+
+               ao_data_pres_cook(ao_data);
+               ao_sample_pres = ao_data_pres(ao_data);
+               ao_sample_alt = pres_to_altitude(ao_sample_pres);
+               ao_sample_height = ao_sample_alt - ao_ground_height;
+
+#if HAS_ACCEL
+               ao_sample_accel = ao_data_accel_cook(ao_data);
+               if (ao_config.pad_orientation != AO_PAD_ORIENTATION_ANTENNA_UP)
+                       ao_sample_accel = ao_data_accel_invert(ao_sample_accel);
+               ao_data_set_accel(ao_data, ao_sample_accel);
+#endif
+
+               if (ao_preflight)
+                       ao_sample_preflight();
+               else
+                       ao_kalman();
+               ao_sample_data = ao_data_ring_next(ao_sample_data);
+       }
+       return !ao_preflight;
+}
+
+void
+ao_sample_init(void)
+{
+       nsamples = 0;
+       ao_sample_pres_sum = 0;
+       ao_sample_pres = 0;
+#if HAS_ACCEL
+       ao_sample_accel_sum = 0;
+       ao_sample_accel = 0;
+#endif
+       ao_sample_data = ao_data_head;
+       ao_preflight = TRUE;
+}
diff --git a/src/core/ao_sample_mm.c b/src/core/ao_sample_mm.c
deleted file mode 100644 (file)
index ac11eef..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright © 2011 Keith Packard <keithp@keithp.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-
-#ifndef AO_FLIGHT_TEST
-#include "ao.h"
-#include <ao_data.h>
-#endif
-
-/*
- * Current sensor values
- */
-
-#ifndef PRES_TYPE
-#define PRES_TYPE int32_t
-#define ALT_TYPE int32_t
-#define ACCEL_TYPE int16_t
-#endif
-
-__pdata uint16_t       ao_sample_tick;         /* time of last data */
-__pdata pres_t         ao_sample_pres;
-__pdata alt_t          ao_sample_alt;
-__pdata alt_t          ao_sample_height;
-#if HAS_ACCEL
-__pdata accel_t                ao_sample_accel;
-#endif
-
-__data uint8_t         ao_sample_data;
-
-/*
- * Sensor calibration values
- */
-
-__pdata pres_t         ao_ground_pres;         /* startup pressure */
-__pdata alt_t          ao_ground_height;       /* MSL of ao_ground_pres */
-
-#if HAS_ACCEL
-__pdata accel_t                ao_ground_accel;        /* startup acceleration */
-__pdata accel_t                ao_accel_2g;            /* factory accel calibration */
-__pdata int32_t                ao_accel_scale;         /* sensor to m/s² conversion */
-#endif
-
-static __pdata uint8_t ao_preflight;           /* in preflight mode */
-
-static __pdata uint16_t        nsamples;
-__pdata int32_t ao_sample_pres_sum;
-#if HAS_ACCEL
-__pdata int32_t ao_sample_accel_sum;
-#endif
-
-static void
-ao_sample_preflight(void)
-{
-       /* startup state:
-        *
-        * Collect 512 samples of acceleration and pressure
-        * data and average them to find the resting values
-        */
-       if (nsamples < 512) {
-#if HAS_ACCEL
-               ao_sample_accel_sum += ao_sample_accel;
-#endif
-               ao_sample_pres_sum += ao_sample_pres;
-               ++nsamples;
-       } else {
-               ao_config_get();
-#if HAS_ACCEL
-               ao_ground_accel = ao_sample_accel_sum >> 9;
-               ao_accel_2g = ao_config.accel_minus_g - ao_config.accel_plus_g;
-               ao_accel_scale = to_fix32(GRAVITY * 2 * 16) / ao_accel_2g;
-#endif
-               ao_ground_pres = ao_sample_pres_sum >> 9;
-               ao_ground_height = pres_to_altitude(ao_ground_pres);
-               ao_preflight = FALSE;
-       }
-}
-
-
-uint8_t
-ao_sample(void)
-{
-       ao_config_get();
-       ao_wakeup(DATA_TO_XDATA(&ao_sample_data));
-       ao_sleep((void *) DATA_TO_XDATA(&ao_data_head));
-       while (ao_sample_data != ao_data_head) {
-               __xdata struct ao_data *ao_data;
-
-               /* Capture a sample */
-               ao_data = (struct ao_data *) &ao_data_ring[ao_sample_data];
-               ao_sample_tick = ao_data->tick;
-
-               ao_data_pres_cook(ao_data);
-               ao_sample_pres = ao_data_pres(ao_data);
-               ao_sample_alt = pres_to_altitude(ao_sample_pres);
-               ao_sample_height = ao_sample_alt - ao_ground_height;
-
-#if HAS_ACCEL
-               ao_sample_accel = ao_data_accel_cook(ao_data);
-               if (ao_config.pad_orientation != AO_PAD_ORIENTATION_ANTENNA_UP)
-                       ao_sample_accel = ao_data_accel_invert(ao_sample_accel);
-               ao_data_set_accel(ao_data, ao_sample_accel);
-#endif
-
-               if (ao_preflight)
-                       ao_sample_preflight();
-               else
-                       ao_kalman();
-               ao_sample_data = ao_data_ring_next(ao_sample_data);
-       }
-       return !ao_preflight;
-}
-
-void
-ao_sample_init(void)
-{
-       nsamples = 0;
-       ao_sample_pres_sum = 0;
-       ao_sample_pres = 0;
-#if HAS_ACCEL
-       ao_sample_accel_sum = 0;
-       ao_sample_accel = 0;
-#endif
-       ao_sample_data = ao_data_head;
-       ao_preflight = TRUE;
-}
index 6fc9324e1d501a25b15dc88b141ec2486707e865..13e46c97aff66520cc17b3e5744ee0b62511ced6 100644 (file)
@@ -67,9 +67,9 @@ ALTOS_SRC = \
        ao_convert_pa.c \
        ao_log.c \
        ao_log_mega.c \
-       ao_sample_mm.c \
+       ao_sample.c \
        ao_kalman.c \
-       ao_flight_mm.c \
+       ao_flight.c \
        ao_telemetry.c \
        ao_packet_slave.c \
        ao_packet.c \
index fba2c19ab582b2194755e90b20bdc1e5bb22caf5..57586c9572f77c7c8cb5af3c5d09ce07854ab0dc 100644 (file)
@@ -36,8 +36,8 @@ CORE_SRC = \
        ao_stdio.c \
        ao_storage.c \
        ao_task.c \
-       ao_flight_mm.c \
-       ao_sample_mm.c \
+       ao_flight.c \
+       ao_sample.c \
        ao_kalman.c \
        ao_log.c \
        ao_log_big.c \
index f0ab2b14723e2c6019375df51704c1a354efc0cf..23aed1c7dcb3b44eadb4dec86067c6ff9a4031d6 100644 (file)
@@ -24,14 +24,14 @@ CORE_SRC = \
        ao_cmd.c \
        ao_config.c \
        ao_convert.c \
-       ao_flight_mm.c \
+       ao_flight.c \
        ao_kalman.c \
        ao_log.c \
        ao_log_tiny.c \
        ao_mutex.c \
        ao_panic.c \
        ao_report.c \
-       ao_sample_mm.c \
+       ao_sample.c \
        ao_stdio.c \
        ao_storage.c \
        ao_task.c \
index a55bcf951ff78c69ec2d02a6134d92cff09a425a..ca719bbf9980e1e4813b5f377c6373438d760675 100644 (file)
@@ -31,7 +31,7 @@ CORE_SRC = \
        ao_mutex.c \
        ao_panic.c \
        ao_report.c \
-       ao_sample_mm.c \
+       ao_sample.c \
        ao_stdio.c \
        ao_storage.c \
        ao_task.c \
index 4631fb78d9232646f82e5120c53dfbae912051e4..963f413162c34298f1c2a9df0310aed64a1ca72e 100644 (file)
@@ -4,7 +4,7 @@ PROGS=ao_flight_test ao_flight_test_baro ao_flight_test_accel ao_flight_test_noi
 
 KALMAN=make-kalman 
 
-CFLAGS=-I.. -I. -I../core -I../drivers -O0 -g -Wall
+CFLAGS=-I.. -I. -I../core -I../drivers -O3 -g -Wall
 
 all: $(PROGS)
 
@@ -13,10 +13,10 @@ clean:
 
 install:
 
-ao_flight_test: ao_flight_test.c ao_host.h ao_flight_mm.c ao_sample_mm.c ao_kalman.c altitude.h ao_kalman.h
+ao_flight_test: ao_flight_test.c ao_host.h ao_flight.c ao_sample.c ao_kalman.c altitude.h ao_kalman.h
        cc $(CFLAGS) -o $@ $<
 
-ao_flight_test_noisy_accel: ao_flight_test.c ao_host.h ao_flight_mm.c ao_sample_mm.c ao_kalman.c altitude.h ao_kalman.h
+ao_flight_test_noisy_accel: ao_flight_test.c ao_host.h ao_flight.c ao_sample.c ao_kalman.c altitude.h ao_kalman.h
        cc -DNOISY_ACCEL=1 $(CFLAGS) -o $@ $<
 
 ao_flight_test_baro: ao_flight_test.c ao_host.h ao_flight.c  ao_sample.c ao_kalman.c altitude.h ao_kalman.h
@@ -42,3 +42,6 @@ ao_kalman.h: $(KALMAN)
 
 ao_fec_test: ao_fec_test.c ao_fec_tx.c ao_fec_rx.c
        cc $(CFLAGS) -DAO_FEC_DEBUG=1 -o $@ ao_fec_test.c ../core/ao_fec_tx.c ../core/ao_fec_rx.c -lm
+
+check: ao_fec_test ao_flight_test ao_flight_test_baro run-tests
+       ./ao_fec_test && ./run-tests
\ No newline at end of file
index baf2ad1dcea2f2dd3f5b4368a29fd5ffba427c0c..9bb03d682f55c3c97fe2de9da639fdee5aecdb2c 100644 (file)
@@ -141,7 +141,7 @@ struct ao_task {
        int dummy;
 };
 
-#define ao_add_task(t,f,n)
+#define ao_add_task(t,f,n) ((void) (t))
 
 #define ao_log_start()
 #define ao_log_stop()
@@ -156,6 +156,7 @@ int ao_flight_debug;
 FILE *emulator_in;
 char *emulator_app;
 char *emulator_name;
+char *emulator_info;
 double emulator_error_max = 4;
 double emulator_height_error_max = 20; /* noise in the baro sensor */
 
@@ -199,6 +200,7 @@ struct ao_config ao_config;
 #define DATA_TO_XDATA(x) (x)
 
 #define HAS_FLIGHT 1
+#define HAS_IGNITE 1
 #define HAS_ADC 1
 #define HAS_USB 1
 #define HAS_GPS 1
@@ -223,8 +225,8 @@ int ao_sample_prev_tick;
 uint16_t       prev_tick;
 
 #include "ao_kalman.c"
-#include "ao_sample_mm.c"
-#include "ao_flight_mm.c"
+#include "ao_sample.c"
+#include "ao_flight.c"
 
 #define to_double(f)   ((f) / 65536.0)
 
@@ -259,10 +261,11 @@ ao_test_exit(void)
        main_error = fabs(ao_test_main_height_time - main_time);
        landed_error = fabs(ao_test_landed_height - landed_height);
        landed_time_error = ao_test_landed_time - landed_time;
-       if (drogue_error > emulator_error_max || main_error > emulator_error_max ||
-           landed_time_error > emulator_error_max || landed_error > emulator_height_error_max) {
+       if (drogue_error > emulator_error_max || main_error > emulator_error_max) {
                printf ("%s %s\n",
                        emulator_app, emulator_name);
+               if (emulator_info)
+                       printf ("\t%s\n", emulator_info);
                printf ("\tApogee error %g\n", drogue_error);
                printf ("\tMain error %g\n", main_error);
                printf ("\tLanded height error %g\n", landed_error);
@@ -477,10 +480,9 @@ void
 ao_sleep(void *wchan)
 {
        if (wchan == &ao_data_head) {
-               char            type;
-               uint16_t        tick;
-               uint16_t        a, b;
-               int             ret;
+               char            type = 0;
+               uint16_t        tick = 0;
+               uint16_t        a = 0, b = 0;
                uint8_t         bytes[1024];
                union ao_telemetry_all  telem;
                char            line[1024];
@@ -676,13 +678,15 @@ ao_dump_state(void)
 static const struct option options[] = {
        { .name = "summary", .has_arg = 0, .val = 's' },
        { .name = "debug", .has_arg = 0, .val = 'd' },
+       { .name = "info", .has_arg = 1, .val = 'i' },
        { 0, 0, 0, 0},
 };
 
-void run_flight_fixed(char *name, FILE *f, int summary)
+void run_flight_fixed(char *name, FILE *f, int summary, char *info)
 {
        emulator_name = name;
        emulator_in = f;
+       emulator_info = info;
        ao_summary = summary;
        ao_flight_init();
        ao_flight();
@@ -694,13 +698,14 @@ main (int argc, char **argv)
        int     summary = 0;
        int     c;
        int     i;
+       char    *info = NULL;
 
 #if HAS_ACCEL
        emulator_app="full";
 #else
        emulator_app="baro";
 #endif
-       while ((c = getopt_long(argc, argv, "sd", options, NULL)) != -1) {
+       while ((c = getopt_long(argc, argv, "sdi:", options, NULL)) != -1) {
                switch (c) {
                case 's':
                        summary = 1;
@@ -708,11 +713,14 @@ main (int argc, char **argv)
                case 'd':
                        ao_flight_debug = 1;
                        break;
+               case 'i':
+                       info = optarg;
+                       break;
                }
        }
 
        if (optind == argc)
-               run_flight_fixed("<stdin>", stdin, summary);
+               run_flight_fixed("<stdin>", stdin, summary, info);
        else
                for (i = optind; i < argc; i++) {
                        FILE    *f = fopen(argv[i], "r");
@@ -720,7 +728,8 @@ main (int argc, char **argv)
                                perror(argv[i]);
                                continue;
                        }
-                       run_flight_fixed(argv[i], f, summary);
+                       run_flight_fixed(argv[i], f, summary, info);
                        fclose(f);
                }
+       exit(0);
 }