Add radio support. Build separate executables for TeleMetrum and the TI dongle
[fw/altos] / ao_monitor.c
diff --git a/ao_monitor.c b/ao_monitor.c
new file mode 100644 (file)
index 0000000..1c2d127
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * $Id: $
+ *
+ * Copyright © 2009 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission.  Keith Packard makes no
+ * representations about the suitability of this software for any purpose.  It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "ao.h"
+
+const char const * const ao_state_names[] = {
+       "startup", "idle", "pad", "boost", "coast",
+       "apogee", "drogue", "main", "landed", "invalid"
+};
+
+void
+ao_monitor(void)
+{
+       __xdata struct ao_radio_recv recv;
+       uint8_t state;
+
+       for (;;) {
+               ao_radio_recv(&recv);
+               state = recv.telemetry.flight_state;
+               if (state > ao_flight_invalid)
+                       state = ao_flight_invalid;
+               printf ("SERIAL %3d RSSI %3d STATUS %02x STATE %s ",
+                       recv.telemetry.addr, recv.rssi, recv.status,
+                       ao_state_names[state]);
+               if (!(recv.status & PKT_APPEND_STATUS_1_CRC_OK))
+                       printf("CRC INVALID ");
+               switch (recv.telemetry.type) {
+               case AO_TELEMETRY_SENSOR:
+                       printf("%5u a: %d p: %d t: %d v: %d d: %d m: %d\n",
+                              recv.telemetry.u.adc.tick,
+                              recv.telemetry.u.adc.accel,
+                              recv.telemetry.u.adc.pres,
+                              recv.telemetry.u.adc.temp,
+                              recv.telemetry.u.adc.v_batt,
+                              recv.telemetry.u.adc.sense_d,
+                              recv.telemetry.u.adc.sense_m);
+                       break;
+               case AO_TELEMETRY_GPS:
+                       ao_gps_print(&recv.telemetry.u.gps);
+                       break;
+               }
+               ao_usb_flush();
+       }
+}
+
+__xdata struct ao_task ao_monitor_task;
+
+void
+ao_monitor_init(void)
+{
+       ao_add_task(&ao_monitor_task, ao_monitor, "monitor");
+}