/* Stack runs from above the allocated __data space to 0xfe, which avoids
* writing to 0xff as that triggers the stack overflow indicator
*/
-#define AO_STACK_START 0x62
+#define AO_STACK_START 0x7e
#define AO_STACK_END 0xfe
#define AO_STACK_SIZE (AO_STACK_END - AO_STACK_START + 1)
*/
/* Suspend the current task until wchan is awoken */
-int
+void
ao_sleep(__xdata void *wchan);
/* Wake all tasks sleeping on wchan */
-int
+void
ao_wakeup(__xdata void *wchan);
/* Yield the processor to another task */
#define AO_PANIC_MUTEX 3 /* Mis-using mutex API */
#define AO_PANIC_EE 4 /* Mis-using eeprom API */
#define AO_PANIC_LOG 5 /* Failing to read/write log data */
+#define AO_PANIC_CMD 6 /* Too many command sets registered */
/* Stop the operating system, beeping and blinking the reason */
void
void
ao_delay(uint16_t ticks);
+/* Set the ADC interval */
+void
+ao_timer_set_adc_interval(uint8_t interval) __critical;
+
/* Timer interrupt */
void
ao_timer_isr(void) interrupt 9;
* ao_adc.c
*/
-#define AO_ADC_RING 128
+#define AO_ADC_RING 64
+#define ao_adc_ring_next(n) (((n) + 1) & (AO_ADC_RING - 1))
+#define ao_adc_ring_prev(n) (((n) - 1) & (AO_ADC_RING - 1))
/*
* One set of samples read from the A/D converter
/* Trigger a conversion sequence (called from the timer interrupt) */
void
ao_adc_poll(void);
-
+
/* Suspend the current task until another A/D sample is converted */
void
ao_adc_sleep(void);
ao_adc_get(__xdata struct ao_adc *packet);
/* The A/D interrupt handler */
+#if !AO_NO_ADC_ISR
void
ao_adc_isr(void) interrupt 1;
+#endif
/* Initialize the A/D converter */
void
/*
* ao_cmd.c
*/
+
+enum ao_cmd_status {
+ ao_cmd_success = 0,
+ ao_cmd_lex_error = 1,
+ ao_cmd_syntax_error = 2,
+};
+
+extern __xdata uint16_t ao_cmd_lex_i;
+extern __xdata uint8_t ao_cmd_lex_c;
+extern __xdata enum ao_cmd_status ao_cmd_status;
+
+void
+ao_cmd_lex(void);
+
+void
+ao_cmd_put8(uint8_t v);
+
+void
+ao_cmd_put16(uint16_t v);
+
+void
+ao_cmd_white(void);
+
+void
+ao_cmd_hex(void);
+
+struct ao_cmds {
+ uint8_t cmd;
+ void (*func)(void);
+ const char *help;
+};
+
+void
+ao_cmd_register(__code struct ao_cmds *cmds);
+
void
ao_cmd_init(void);
*/
/* Allocate a DMA channel. the 'done' parameter will be set to 1
- * when the dma is finished and will be used to wakeup any waiters
+ * when the dma is finished and will be used to wakeup any waiters
*/
uint8_t
ao_dma_alloc(__xdata uint8_t * done);
* ao_log.c
*/
+/* Structure containing GPS position, either lat or lon */
+
+struct ao_gps_pos {
+ uint8_t degrees;
+ uint8_t minutes;
+ uint16_t minutes_fraction; /* in units of 1/10000 minutes */
+};
+
/*
* The data log is recorded in the eeprom as a sequence
* of data packets.
* packet type, the packet checksum and the tick count. Then
* they all contain 2 16 bit values which hold packet-specific
* data.
- *
+ *
* For each flight, the first packet
* is FLIGHT packet, indicating the serial number of the
* device and a unique number marking the number of flights
#define AO_LOG_TEMP_VOLT 'T'
#define AO_LOG_DEPLOY 'D'
#define AO_LOG_STATE 'S'
+#define AO_LOG_GPS_TIME 'G'
+#define AO_LOG_GPS_LAT 'N'
+#define AO_LOG_GPS_LON 'W'
+#define AO_LOG_GPS_ALT 'H'
#define AO_LOG_POS_NONE (~0UL)
uint16_t state;
uint16_t reason;
} state;
+ struct {
+ uint8_t hour;
+ uint8_t minute;
+ uint8_t second;
+ uint8_t flags;
+ } gps_time;
+ struct ao_gps_pos gps_latitude;
+ struct ao_gps_pos gps_longitude;
+ struct {
+ int16_t altitude;
+ uint16_t unused;
+ } gps_altitude;
struct {
uint16_t d0;
uint16_t d1;
*/
enum ao_flight_state {
- ao_flight_startup,
- ao_flight_idle,
- ao_flight_launchpad,
- ao_flight_boost,
- ao_flight_coast,
- ao_flight_apogee,
- ao_flight_drogue,
- ao_flight_main,
- ao_flight_landed,
- ao_flight_invalid
+ ao_flight_startup = 0,
+ ao_flight_idle = 1,
+ ao_flight_launchpad = 2,
+ ao_flight_boost = 3,
+ ao_flight_coast = 4,
+ ao_flight_apogee = 5,
+ ao_flight_drogue = 6,
+ ao_flight_main = 7,
+ ao_flight_landed = 8,
+ ao_flight_invalid = 9
};
extern __xdata struct ao_adc ao_flight_data;
-extern __pdata enum flight_state ao_flight_state;
+extern __pdata enum ao_flight_state ao_flight_state;
extern __pdata uint16_t ao_flight_tick;
extern __pdata int16_t ao_flight_accel;
extern __pdata int16_t ao_flight_pres;
* ao_report.c
*/
-void
-ao_report_notify(void);
-
void
ao_report_init(void);
ao_temp_to_dC(int16_t temp) __reentrant;
int16_t
-ao_accel_to_dm_per_s2(int16_t accel)
-{
- return (998 - (accel >> 4)) * 3300 / 2047;
-}
+ao_accel_to_cm_per_s2(int16_t accel) __reentrant;
/*
* ao_dbg.c
void
ao_dbg_reset(void);
+void
+ao_dbg_init(void);
+
/*
* ao_serial.c
*/
+#if !AO_NO_SERIAL_ISR
void
ao_serial_rx1_isr(void) interrupt 3;
void
ao_serial_tx1_isr(void) interrupt 14;
+#endif
uint8_t
ao_serial_getchar(void) __critical;
* ao_gps.c
*/
-struct ao_gps_pos {
- uint8_t degrees;
- uint8_t minutes;
- uint16_t minutes_fraction; /* in units of 1/10000 minutes */
-};
-
#define AO_GPS_NUM_SAT_MASK (0xf << 0)
#define AO_GPS_NUM_SAT_SHIFT (0)
void
ao_gps(void);
+void
+ao_gps_print(__xdata struct ao_gps_data *gps_data);
+
void
ao_gps_init(void);
+/*
+ * ao_telemetry.c
+ */
+
+struct ao_telemetry {
+ uint8_t addr;
+ uint8_t flight_state;
+ struct ao_adc adc;
+ struct ao_gps_data gps;
+};
+
+void
+ao_telemetry_init(void);
+
+/*
+ * ao_radio.c
+ */
+
+void
+ao_radio_send(__xdata struct ao_telemetry *telemetry) __reentrant;
+
+struct ao_radio_recv {
+ struct ao_telemetry telemetry;
+ uint8_t rssi;
+ uint8_t status;
+};
+
+void
+ao_radio_recv(__xdata struct ao_radio_recv *recv) __reentrant;
+
+void
+ao_radio_init(void);
+
+/*
+ * ao_monitor.c
+ */
+
+extern const char const * const ao_state_names[];
+
+void
+ao_monitor(void);
+
+void
+ao_monitor_init(void);
+
+/*
+ * ao_stdio.c
+ */
+
+void
+flush(void);
+
+/*
+ * ao_ignite.c
+ */
+
+enum ao_igniter {
+ ao_igniter_drogue = 0,
+ ao_igniter_main = 1
+};
+
+void
+ao_ignite(enum ao_igniter igniter);
+
+enum ao_igniter_status {
+ ao_igniter_unknown, /* unknown status (ambiguous voltage) */
+ ao_igniter_ready, /* continuity detected */
+ ao_igniter_active, /* igniter firing */
+ ao_igniter_open, /* open circuit detected */
+};
+
+enum ao_igniter_status
+ao_igniter_status(enum ao_igniter igniter);
+
+void
+ao_igniter_init(void);
#endif /* _AO_H_ */