2cca31379deedf8cbbd32870592ccd259224b88d
[fw/altos] / ao_monitor.c
1 /*
2  * $Id: $
3  *
4  * Copyright © 2009 Keith Packard
5  *
6  * Permission to use, copy, modify, distribute, and sell this software and its
7  * documentation for any purpose is hereby granted without fee, provided that
8  * the above copyright notice appear in all copies and that both that
9  * copyright notice and this permission notice appear in supporting
10  * documentation, and that the name of Keith Packard not be used in
11  * advertising or publicity pertaining to distribution of the software without
12  * specific, written prior permission.  Keith Packard makes no
13  * representations about the suitability of this software for any purpose.  It
14  * is provided "as is" without express or implied warranty.
15  *
16  * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18  * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22  * PERFORMANCE OF THIS SOFTWARE.
23  */
24
25 #include "ao.h"
26
27 const char const * const ao_state_names[] = {
28         "startup", "idle", "pad", "boost", "coast",
29         "apogee", "drogue", "main", "landed", "invalid"
30 };
31
32 __xdata uint8_t ao_monitoring;
33
34 void
35 ao_monitor(void)
36 {
37         __xdata struct ao_radio_recv recv;
38         uint8_t state;
39
40         for (;;) {
41                 __critical while (!ao_monitoring)
42                         ao_sleep(&ao_monitoring);
43                 ao_radio_recv(&recv);
44                 state = recv.telemetry.flight_state;
45                 if (state > ao_flight_invalid)
46                         state = ao_flight_invalid;
47                 printf ("SERIAL %3d RSSI %3d STATUS %02x STATE %s ",
48                         recv.telemetry.addr, recv.rssi, recv.status,
49                         ao_state_names[state]);
50                 if (!(recv.status & PKT_APPEND_STATUS_1_CRC_OK))
51                         printf("CRC INVALID ");
52                 printf("%5u a: %d p: %d t: %d v: %d d: %d m: %d\n",
53                        recv.telemetry.adc.tick,
54                        recv.telemetry.adc.accel,
55                        recv.telemetry.adc.pres,
56                        recv.telemetry.adc.temp,
57                        recv.telemetry.adc.v_batt,
58                        recv.telemetry.adc.sense_d,
59                        recv.telemetry.adc.sense_m);
60                 ao_gps_print(&recv.telemetry.gps);
61                 ao_usb_flush();
62         }
63 }
64
65 __xdata struct ao_task ao_monitor_task;
66
67 static void
68 ao_set_monitor(void)
69 {
70         ao_cmd_hex();
71         ao_monitoring = ao_cmd_lex_i != 0;
72         ao_wakeup(&ao_monitoring);
73 }
74
75 __code struct ao_cmds ao_monitor_cmds[] = {
76         { 'M',  ao_set_monitor, "M                                  Enable/disable radio monitoring" },
77         { 0,    ao_set_monitor, NULL },
78 };
79
80 void
81 ao_monitor_init(void)
82 {
83         ao_monitoring = 0;
84         ao_cmd_register(&ao_monitor_cmds[0]);
85         ao_add_task(&ao_monitor_task, ao_monitor, "monitor");
86 }