altos: Split task definitions out to ao_task.h
[fw/altos] / src / core / ao.h
1 /*
2  * Copyright © 2009 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 2 of the License
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License along
14  * with this program; if not, write to the Free Software Foundation, Inc.,
15  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
16  */
17
18 #ifndef _AO_H_
19 #define _AO_H_
20
21 #include <stdint.h>
22 #include <stdio.h>
23 #include <string.h>
24 #include <stddef.h>
25 #include <ao_pins.h>
26 #include <ao_arch.h>
27
28 #define TRUE 1
29 #define FALSE 0
30
31 /* Convert a __data pointer into an __xdata pointer */
32 #ifndef DATA_TO_XDATA
33 #define DATA_TO_XDATA(a)        (a)
34 #endif
35 #ifndef PDATA_TO_XDATA
36 #define PDATA_TO_XDATA(a)       (a)
37 #endif
38 #ifndef CODE_TO_XDATA
39 #define CODE_TO_XDATA(a)        (a)
40 #endif
41
42 #ifndef HAS_TASK
43 #define HAS_TASK        1
44 #endif
45
46 #if HAS_TASK
47 #include <ao_task.h>
48 #endif
49
50 /*
51  * ao_panic.c
52  */
53
54 #define AO_PANIC_NO_TASK        1       /* AO_NUM_TASKS is not large enough */
55 #define AO_PANIC_DMA            2       /* Attempt to start DMA while active */
56 #define AO_PANIC_MUTEX          3       /* Mis-using mutex API */
57 #define AO_PANIC_EE             4       /* Mis-using eeprom API */
58 #define AO_PANIC_LOG            5       /* Failing to read/write log data */
59 #define AO_PANIC_CMD            6       /* Too many command sets registered */
60 #define AO_PANIC_STDIO          7       /* Too many stdio handlers registered */
61 #define AO_PANIC_REBOOT         8       /* Reboot failed */
62 #define AO_PANIC_FLASH          9       /* Invalid flash part (or wrong blocksize) */
63 #define AO_PANIC_USB            10      /* Trying to send USB packet while busy */
64 #define AO_PANIC_BT             11      /* Communications with bluetooth device failed */
65 #define AO_PANIC_STACK          12      /* Stack overflow */
66 #define AO_PANIC_SPI            13      /* SPI communication failure */
67 #define AO_PANIC_SELF_TEST_CC1120       0x40 | 1        /* Self test failure */
68 #define AO_PANIC_SELF_TEST_HMC5883      0x40 | 2        /* Self test failure */
69 #define AO_PANIC_SELF_TEST_MPU6000      0x40 | 3        /* Self test failure */
70 #define AO_PANIC_SELF_TEST_MS5607       0x40 | 4        /* Self test failure */
71
72 /* Stop the operating system, beeping and blinking the reason */
73 void
74 ao_panic(uint8_t reason);
75
76 /*
77  * ao_timer.c
78  */
79
80 #ifndef AO_TICK_TYPE
81 #define AO_TICK_TYPE    uint16_t
82 #define AO_TICK_SIGNED  int16_t
83 #endif
84
85 extern volatile __data AO_TICK_TYPE ao_tick_count;
86
87 /* Our timer runs at 100Hz */
88 #define AO_HERTZ                100
89 #define AO_MS_TO_TICKS(ms)      ((ms) / (1000 / AO_HERTZ))
90 #define AO_SEC_TO_TICKS(s)      ((s) * AO_HERTZ)
91
92 /* Returns the current time in ticks */
93 uint16_t
94 ao_time(void);
95
96 /* Suspend the current task until ticks time has passed */
97 void
98 ao_delay(uint16_t ticks);
99
100 /* Set the ADC interval */
101 void
102 ao_timer_set_adc_interval(uint8_t interval) __critical;
103
104 /* Timer interrupt */
105 void
106 ao_timer_isr(void) ao_arch_interrupt(9);
107
108 /* Initialize the timer */
109 void
110 ao_timer_init(void);
111
112 /* Initialize the hardware clock. Must be called first */
113 void
114 ao_clock_init(void);
115
116 /*
117  * ao_mutex.c
118  */
119
120 void
121 ao_mutex_get(__xdata uint8_t *ao_mutex) __reentrant;
122
123 void
124 ao_mutex_put(__xdata uint8_t *ao_mutex) __reentrant;
125
126 /*
127  * ao_cmd.c
128  */
129
130 enum ao_cmd_status {
131         ao_cmd_success = 0,
132         ao_cmd_lex_error = 1,
133         ao_cmd_syntax_error = 2,
134 };
135
136 extern __pdata uint16_t ao_cmd_lex_i;
137 extern __pdata uint32_t ao_cmd_lex_u32;
138 extern __pdata char     ao_cmd_lex_c;
139 extern __pdata enum ao_cmd_status ao_cmd_status;
140
141 void
142 ao_cmd_lex(void);
143
144 void
145 ao_cmd_put8(uint8_t v);
146
147 void
148 ao_cmd_put16(uint16_t v);
149
150 uint8_t
151 ao_cmd_is_white(void);
152
153 void
154 ao_cmd_white(void);
155
156 int8_t
157 ao_cmd_hexchar(char c);
158
159 void
160 ao_cmd_hexbyte(void);
161
162 void
163 ao_cmd_hex(void);
164
165 void
166 ao_cmd_decimal(void);
167
168 uint8_t
169 ao_match_word(__code char *word);
170
171 struct ao_cmds {
172         void            (*func)(void);
173         __code char     *help;
174 };
175
176 void
177 ao_cmd_register(const __code struct ao_cmds *cmds);
178
179 void
180 ao_cmd_init(void);
181
182 #if HAS_CMD_FILTER
183 /*
184  * Provided by an external module to filter raw command lines
185  */
186 uint8_t
187 ao_cmd_filter(void);
188 #endif
189
190 /*
191  * Various drivers
192  */
193 #if HAS_ADC
194 #include <ao_adc.h>
195 #endif
196
197 #if HAS_BEEP
198 #include <ao_beep.h>
199 #endif
200
201 #if LEDS_AVAILABLE
202 #include <ao_led.h>
203 #endif
204
205 #if HAS_USB
206 #include <ao_usb.h>
207 #endif
208
209 #if HAS_EEPROM
210 #include <ao_storage.h>
211 #endif
212
213 #if HAS_LOG
214 #include <ao_log.h>
215 #endif
216
217 #if HAS_FLIGHT
218 #include <ao_flight.h>
219 #include <ao_sample.h>
220 #endif
221
222 /*
223  * ao_report.c
224  */
225
226 #define AO_RDF_INTERVAL_TICKS   AO_SEC_TO_TICKS(5)
227 #define AO_RDF_LENGTH_MS        500
228 #define AO_RDF_CONTINUITY_MS    32
229 #define AO_RDF_CONTINUITY_PAUSE 96
230 #define AO_RDF_CONTINUITY_TOTAL ((AO_RDF_CONTINUITY_PAUSE + AO_RDF_CONTINUITY_MS) * 3 + AO_RDF_CONTINUITY_PAUSE)
231
232 /* This assumes that we're generating a 1kHz tone, which
233  * modulates the carrier at 2kbps, or 250kBps
234  */
235 #define AO_MS_TO_RDF_LEN(ms) ((ms) / 4)
236
237 #define AO_RADIO_RDF_LEN        AO_MS_TO_RDF_LEN(AO_RDF_LENGTH_MS)
238 #define AO_RADIO_CONT_TONE_LEN  AO_MS_TO_RDF_LEN(AO_RDF_CONTINUITY_MS)
239 #define AO_RADIO_CONT_PAUSE_LEN AO_MS_TO_RDF_LEN(AO_RDF_CONTINUITY_PAUSE)
240 #define AO_RADIO_CONT_TOTAL_LEN AO_MS_TO_RDF_LEN(AO_RDF_CONTINUITY_TOTAL)
241
242 /* returns a value 0-3 to indicate igniter continuity */
243 uint8_t
244 ao_report_igniter(void);
245
246 void
247 ao_report_init(void);
248
249 /*
250  * ao_convert.c
251  *
252  * Given raw data, convert to SI units
253  */
254
255 /* pressure from the sensor to altitude in meters */
256 int16_t
257 ao_pres_to_altitude(int16_t pres) __reentrant;
258
259 int16_t
260 ao_altitude_to_pres(int16_t alt) __reentrant;
261
262 int16_t
263 ao_temp_to_dC(int16_t temp) __reentrant;
264
265 /*
266  * ao_convert_pa.c
267  *
268  * Convert between pressure in Pa and altitude in meters
269  */
270
271 int32_t
272 ao_pa_to_altitude(int32_t pa);
273
274 int32_t
275 ao_altitude_to_pa(int32_t alt);
276
277 #if HAS_DBG
278 #include <ao_dbg.h>
279 #endif
280
281 #if HAS_SERIAL_0 || HAS_SERIAL_1 || HAS_SERIAL_2 || HAS_SERIAL_3
282 #include <ao_serial.h>
283 #endif
284
285
286 /*
287  * ao_spi_slave.c
288  */
289
290 uint8_t
291 ao_spi_slave_recv(uint8_t *buf, uint8_t len);
292
293 void
294 ao_spi_slave_send(uint8_t *buf, uint8_t len);
295
296 void
297 ao_spi_slave_init(void);
298
299 /* This must be defined by the product; it will get called when chip
300  * select goes low, at which point it should use ao_spi_read and
301  * ao_spi_write to deal with the request
302  */
303
304 void
305 ao_spi_slave(void);
306
307 #include <ao_telemetry.h>
308 /*
309  * ao_gps.c
310  */
311
312 #define AO_GPS_NUM_SAT_MASK     (0xf << 0)
313 #define AO_GPS_NUM_SAT_SHIFT    (0)
314
315 #define AO_GPS_VALID            (1 << 4)
316 #define AO_GPS_RUNNING          (1 << 5)
317 #define AO_GPS_DATE_VALID       (1 << 6)
318 #define AO_GPS_COURSE_VALID     (1 << 7)
319
320 extern __pdata uint16_t ao_gps_tick;
321 extern __xdata uint8_t ao_gps_mutex;
322 extern __xdata struct ao_telemetry_location ao_gps_data;
323 extern __xdata struct ao_telemetry_satellite ao_gps_tracking_data;
324
325 struct ao_gps_orig {
326         uint8_t                 year;
327         uint8_t                 month;
328         uint8_t                 day;
329         uint8_t                 hour;
330         uint8_t                 minute;
331         uint8_t                 second;
332         uint8_t                 flags;
333         int32_t                 latitude;       /* degrees * 10⁷ */
334         int32_t                 longitude;      /* degrees * 10⁷ */
335         int16_t                 altitude;       /* m */
336         uint16_t                ground_speed;   /* cm/s */
337         uint8_t                 course;         /* degrees / 2 */
338         uint8_t                 hdop;           /* * 5 */
339         int16_t                 climb_rate;     /* cm/s */
340         uint16_t                h_error;        /* m */
341         uint16_t                v_error;        /* m */
342 };
343
344 struct ao_gps_sat_orig {
345         uint8_t         svid;
346         uint8_t         c_n_1;
347 };
348
349 #define AO_MAX_GPS_TRACKING     12
350
351 struct ao_gps_tracking_orig {
352         uint8_t                 channels;
353         struct ao_gps_sat_orig  sats[AO_MAX_GPS_TRACKING];
354 };
355
356 void
357 ao_gps(void);
358
359 void
360 ao_gps_print(__xdata struct ao_gps_orig *gps_data);
361
362 void
363 ao_gps_tracking_print(__xdata struct ao_gps_tracking_orig *gps_tracking_data);
364
365 void
366 ao_gps_init(void);
367
368 /*
369  * ao_gps_report.c
370  */
371
372 void
373 ao_gps_report(void);
374
375 void
376 ao_gps_report_init(void);
377
378 /*
379  * ao_gps_report_mega.c
380  */
381
382 void
383 ao_gps_report_mega(void);
384
385 void
386 ao_gps_report_mega_init(void);
387
388 /*
389  * ao_telemetry_orig.c
390  */
391
392 #if LEGACY_MONITOR
393 struct ao_adc_orig {
394         uint16_t        tick;           /* tick when the sample was read */
395         int16_t         accel;          /* accelerometer */
396         int16_t         pres;           /* pressure sensor */
397         int16_t         temp;           /* temperature sensor */
398         int16_t         v_batt;         /* battery voltage */
399         int16_t         sense_d;        /* drogue continuity sense */
400         int16_t         sense_m;        /* main continuity sense */
401 };
402
403 struct ao_telemetry_orig {
404         uint16_t                serial;
405         uint16_t                flight;
406         uint8_t                 flight_state;
407         int16_t                 accel;
408         int16_t                 ground_accel;
409         union {
410                 struct {
411                         int16_t                 speed;
412                         int16_t                 unused;
413                 } k;
414                 int32_t         flight_vel;
415         } u;
416         int16_t                 height;
417         int16_t                 ground_pres;
418         int16_t                 accel_plus_g;
419         int16_t                 accel_minus_g;
420         struct ao_adc_orig      adc;
421         struct ao_gps_orig      gps;
422         char                    callsign[AO_MAX_CALLSIGN];
423         struct ao_gps_tracking_orig     gps_tracking;
424 };
425
426 struct ao_telemetry_tiny {
427         uint16_t                serial;
428         uint16_t                flight;
429         uint8_t                 flight_state;
430         int16_t                 height;         /* AGL in meters */
431         int16_t                 speed;          /* in m/s * 16 */
432         int16_t                 accel;          /* in m/s² * 16 */
433         int16_t                 ground_pres;    /* sensor units */
434         struct ao_adc           adc;            /* raw ADC readings */
435         char                    callsign[AO_MAX_CALLSIGN];
436 };
437
438 struct ao_telemetry_orig_recv {
439         struct ao_telemetry_orig        telemetry_orig;
440         int8_t                          rssi;
441         uint8_t                         status;
442 };
443
444 struct ao_telemetry_tiny_recv {
445         struct ao_telemetry_tiny        telemetry_tiny;
446         int8_t                          rssi;
447         uint8_t                         status;
448 };
449
450 #endif /* LEGACY_MONITOR */
451
452 /* Unfortunately, we've exposed the CC1111 rssi units as the 'usual' method
453  * for reporting RSSI. So, now we use these values everywhere
454  */
455 #define AO_RSSI_FROM_RADIO(radio)       ((int16_t) ((int8_t) (radio) >> 1) - 74)
456 #define AO_RADIO_FROM_RSSI(rssi)        (((int8_t) (rssi) + 74) << 1)
457
458 /*
459  * ao_radio_recv tacks on rssi and status bytes
460  */
461
462 struct ao_telemetry_raw_recv {
463         uint8_t                 packet[AO_MAX_TELEMETRY + 2];
464 };
465
466 /* Set delay between telemetry reports (0 to disable) */
467
468 #ifdef AO_SEND_ALL_BARO
469 #define AO_TELEMETRY_INTERVAL_PAD       AO_MS_TO_TICKS(100)
470 #define AO_TELEMETRY_INTERVAL_FLIGHT    AO_MS_TO_TICKS(100)
471 #define AO_TELEMETRY_INTERVAL_RECOVER   AO_MS_TO_TICKS(100)
472 #else
473 #define AO_TELEMETRY_INTERVAL_PAD       AO_MS_TO_TICKS(1000)
474 #define AO_TELEMETRY_INTERVAL_FLIGHT    AO_MS_TO_TICKS(100)
475 #define AO_TELEMETRY_INTERVAL_RECOVER   AO_MS_TO_TICKS(1000)
476 #endif
477
478 void
479 ao_telemetry_set_interval(uint16_t interval);
480
481 void
482 ao_rdf_set(uint8_t rdf);
483
484 void
485 ao_telemetry_init(void);
486
487 void
488 ao_telemetry_orig_init(void);
489
490 void
491 ao_telemetry_tiny_init(void);
492
493 /*
494  * ao_radio.c
495  */
496
497 extern __xdata uint8_t  ao_radio_dma;
498
499 #ifdef PKT_APPEND_STATUS_1_CRC_OK
500 #define AO_RADIO_STATUS_CRC_OK  PKT_APPEND_STATUS_1_CRC_OK
501 #else
502 #include <ao_fec.h>
503 #define AO_RADIO_STATUS_CRC_OK  AO_FEC_DECODE_CRC_OK
504 #endif
505
506 void
507 ao_radio_general_isr(void) ao_arch_interrupt(16);
508
509 void
510 ao_radio_send(const __xdata void *d, uint8_t size) __reentrant;
511
512 uint8_t
513 ao_radio_recv(__xdata void *d, uint8_t size) __reentrant;
514
515 void
516 ao_radio_recv_abort(void);
517
518 void
519 ao_radio_test(uint8_t on);
520
521 /*
522  * Compute the packet length as follows:
523  *
524  * 2000 bps (for a 1kHz tone)
525  * so, for 'ms' milliseconds, we need
526  * 2 * ms bits, or ms / 4 bytes
527  */
528
529 void
530 ao_radio_rdf(void);
531
532 void
533 ao_radio_continuity(uint8_t c);
534
535 void
536 ao_radio_rdf_abort(void);
537
538 void
539 ao_radio_init(void);
540
541 /*
542  * ao_monitor.c
543  */
544
545 #if HAS_MONITOR
546
547 extern const char const * const ao_state_names[];
548
549 #define AO_MONITOR_RING 8
550
551 union ao_monitor {
552         struct ao_telemetry_raw_recv    raw;
553         struct ao_telemetry_all_recv    all;
554         struct ao_telemetry_orig_recv   orig;
555         struct ao_telemetry_tiny_recv   tiny;
556 };
557
558 extern __xdata union ao_monitor ao_monitor_ring[AO_MONITOR_RING];
559
560 #define ao_monitor_ring_next(n) (((n) + 1) & (AO_MONITOR_RING - 1))
561
562 extern __data uint8_t ao_monitoring;
563 extern __data uint8_t ao_monitor_head;
564
565 void
566 ao_monitor(void);
567
568 #define AO_MONITORING_OFF       0
569 #define AO_MONITORING_ORIG      1
570
571 void
572 ao_monitor_set(uint8_t monitoring);
573
574 void
575 ao_monitor_disable(void);
576
577 void
578 ao_monitor_enable(void);
579
580 void
581 ao_monitor_init(void) __reentrant;
582
583 #endif
584
585 /*
586  * ao_stdio.c
587  */
588
589 #define AO_READ_AGAIN   ((char) -1)
590
591 struct ao_stdio {
592         char    (*pollchar)(void);
593         void    (*putchar)(char c) __reentrant;
594         void    (*flush)(void);
595         uint8_t echo;
596 };
597
598 extern __xdata struct ao_stdio ao_stdios[];
599 extern __pdata int8_t ao_cur_stdio;
600 extern __pdata int8_t ao_num_stdios;
601
602 void
603 flush(void);
604
605 extern __xdata uint8_t ao_stdin_ready;
606
607 uint8_t
608 ao_echo(void);
609
610 int8_t
611 ao_add_stdio(char (*pollchar)(void),
612              void (*putchar)(char) __reentrant,
613              void (*flush)(void)) __reentrant;
614
615 /*
616  * ao_ignite.c
617  */
618
619 enum ao_igniter {
620         ao_igniter_drogue = 0,
621         ao_igniter_main = 1
622 };
623
624 void
625 ao_ignite(enum ao_igniter igniter);
626
627 enum ao_igniter_status {
628         ao_igniter_unknown,     /* unknown status (ambiguous voltage) */
629         ao_igniter_ready,       /* continuity detected */
630         ao_igniter_active,      /* igniter firing */
631         ao_igniter_open,        /* open circuit detected */
632 };
633
634 struct ao_ignition {
635         uint8_t request;
636         uint8_t fired;
637         uint8_t firing;
638 };
639
640 extern __xdata struct ao_ignition ao_ignition[2];
641
642 enum ao_igniter_status
643 ao_igniter_status(enum ao_igniter igniter);
644
645 extern __pdata uint8_t ao_igniter_present;
646
647 void
648 ao_ignite_set_pins(void);
649
650 void
651 ao_igniter_init(void);
652
653 /*
654  * ao_config.c
655  */
656
657 #if AO_PYRO_NUM
658 #include <ao_pyro.h>
659 #endif
660
661 #if HAS_FORCE_FREQ
662 /*
663  * Set this to force the frequency to 434.550MHz
664  */
665 extern __xdata uint8_t ao_force_freq;
666 #endif
667
668 #define AO_CONFIG_MAJOR 1
669 #define AO_CONFIG_MINOR 12
670
671 #define AO_AES_LEN 16
672
673 extern __xdata uint8_t ao_config_aes_seq;
674
675 struct ao_config {
676         uint8_t         major;
677         uint8_t         minor;
678         uint16_t        main_deploy;
679         int16_t         accel_plus_g;           /* changed for minor version 2 */
680         uint8_t         _legacy_radio_channel;
681         char            callsign[AO_MAX_CALLSIGN + 1];
682         uint8_t         apogee_delay;           /* minor version 1 */
683         int16_t         accel_minus_g;          /* minor version 2 */
684         uint32_t        radio_cal;              /* minor version 3 */
685         uint32_t        flight_log_max;         /* minor version 4 */
686         uint8_t         ignite_mode;            /* minor version 5 */
687         uint8_t         pad_orientation;        /* minor version 6 */
688         uint32_t        radio_setting;          /* minor version 7 */
689         uint8_t         radio_enable;           /* minor version 8 */
690         uint8_t         aes_key[AO_AES_LEN];    /* minor version 9 */
691         uint32_t        frequency;              /* minor version 10 */
692         uint16_t        apogee_lockout;         /* minor version 11 */
693 #if AO_PYRO_NUM
694         struct ao_pyro  pyro[AO_PYRO_NUM];      /* minor version 12 */
695 #endif
696 };
697
698 #define AO_IGNITE_MODE_DUAL             0
699 #define AO_IGNITE_MODE_APOGEE           1
700 #define AO_IGNITE_MODE_MAIN             2
701
702 #define AO_PAD_ORIENTATION_ANTENNA_UP   0
703 #define AO_PAD_ORIENTATION_ANTENNA_DOWN 1
704
705 extern __xdata struct ao_config ao_config;
706
707 #define AO_CONFIG_MAX_SIZE      128
708
709 void
710 _ao_config_edit_start(void);
711
712 void
713 _ao_config_edit_finish(void);
714
715 void
716 ao_config_get(void);
717
718 void
719 ao_config_put(void);
720
721 void
722 ao_config_set_radio(void);
723
724 void
725 ao_config_init(void);
726
727 /*
728  * ao_rssi.c
729  */
730
731 void
732 ao_rssi_set(int rssi_value);
733
734 void
735 ao_rssi_init(uint8_t rssi_led);
736
737 /*
738  * ao_product.c
739  *
740  * values which need to be defined for
741  * each instance of a product
742  */
743
744 extern const char ao_version[];
745 extern const char ao_manufacturer[];
746 extern const char ao_product[];
747
748 /*
749  * Fifos
750  */
751
752 #define AO_FIFO_SIZE    32
753
754 struct ao_fifo {
755         uint8_t insert;
756         uint8_t remove;
757         char    fifo[AO_FIFO_SIZE];
758 };
759
760 #define ao_fifo_insert(f,c) do { \
761         (f).fifo[(f).insert] = (c); \
762         (f).insert = ((f).insert + 1) & (AO_FIFO_SIZE-1); \
763 } while(0)
764
765 #define ao_fifo_remove(f,c) do {\
766         c = (f).fifo[(f).remove]; \
767         (f).remove = ((f).remove + 1) & (AO_FIFO_SIZE-1); \
768 } while(0)
769
770 #define ao_fifo_full(f)         ((((f).insert + 1) & (AO_FIFO_SIZE-1)) == (f).remove)
771 #define ao_fifo_empty(f)        ((f).insert == (f).remove)
772
773 #if PACKET_HAS_MASTER || PACKET_HAS_SLAVE
774 #include <ao_packet.h>
775 #endif
776
777 #if HAS_BTM
778 #include <ao_btm.h>
779 #endif
780
781 #if HAS_COMPANION
782 #include <ao_companion.h>
783 #endif
784
785 #if HAS_LCD
786 #include <ao_lcd.h>
787 #endif
788
789 #if HAS_AES
790 #include <ao_aes.h>
791 #endif
792
793 /* ao_launch.c */
794
795 struct ao_launch_command {
796         uint16_t        tick;
797         uint16_t        serial;
798         uint8_t         cmd;
799         uint8_t         channel;
800         uint16_t        unused;
801 };
802
803 #define AO_LAUNCH_QUERY         1
804
805 struct ao_launch_query {
806         uint16_t        tick;
807         uint16_t        serial;
808         uint8_t         channel;
809         uint8_t         valid;
810         uint8_t         arm_status;
811         uint8_t         igniter_status;
812 };
813
814 #define AO_LAUNCH_ARM           2
815 #define AO_LAUNCH_FIRE          3
816
817 void
818 ao_launch_init(void);
819
820 /*
821  * ao_log_single.c
822  */
823
824 #define AO_LOG_TELESCIENCE_START        ((uint8_t) 's')
825 #define AO_LOG_TELESCIENCE_DATA         ((uint8_t) 'd')
826
827 #define AO_LOG_TELESCIENCE_NUM_ADC      12
828
829 struct ao_log_telescience {
830         uint8_t         type;
831         uint8_t         csum;
832         uint16_t        tick;
833         uint16_t        tm_tick;
834         uint8_t         tm_state;
835         uint8_t         unused;
836         uint16_t        adc[AO_LOG_TELESCIENCE_NUM_ADC];
837 };
838
839 #define AO_LOG_SINGLE_SIZE              32
840
841 union ao_log_single {
842         struct ao_log_telescience       telescience;
843         union ao_telemetry_all          telemetry;
844         uint8_t                         bytes[AO_LOG_SINGLE_SIZE];
845 };
846
847 extern __xdata union ao_log_single      ao_log_single_write_data;
848 extern __xdata union ao_log_single      ao_log_single_read_data;
849
850 void
851 ao_log_single_extra_query(void);
852
853 void
854 ao_log_single_list(void);
855
856 void
857 ao_log_single_main(void);
858
859 uint8_t
860 ao_log_single_write(void);
861
862 uint8_t
863 ao_log_single_read(uint32_t pos);
864
865 void
866 ao_log_single_start(void);
867
868 void
869 ao_log_single_stop(void);
870
871 void
872 ao_log_single_restart(void);
873
874 void
875 ao_log_single_set(void);
876
877 void
878 ao_log_single_delete(void);
879
880 void
881 ao_log_single_init(void);
882
883 void
884 ao_log_single(void);
885
886 /*
887  * ao_pyro_slave.c
888  */
889
890 #define AO_TELEPYRO_NUM_ADC     9
891
892 #ifndef ao_xmemcpy
893 #define ao_xmemcpy(d,s,c) memcpy(d,s,c)
894 #define ao_xmemset(d,v,c) memset(d,v,c)
895 #define ao_xmemcmp(d,s,c) memcmp(d,s,c)
896 #endif
897
898 /*
899  * ao_terraui.c
900  */
901
902 void
903 ao_terraui_init(void);
904
905 /*
906  * ao_battery.c
907  */
908
909 #ifdef BATTERY_PIN
910 void
911 ao_battery_isr(void) ao_arch_interrupt(1);
912
913 uint16_t
914 ao_battery_get(void);
915
916 void
917 ao_battery_init(void);
918 #endif /* BATTERY_PIN */
919
920 /*
921  * ao_sqrt.c
922  */
923
924 uint32_t
925 ao_sqrt(uint32_t op);
926
927 /*
928  * ao_freq.c
929  */
930
931 int32_t ao_freq_to_set(int32_t freq, int32_t cal) __reentrant;
932
933 /*
934  * ao_ms5607.c
935  */
936
937 void ao_ms5607_init(void);
938
939 #include <ao_arch_funcs.h>
940
941 #endif /* _AO_H_ */