#include <string.h>
#include "cc1111.h"
+#define TRUE 1
+#define FALSE 0
+
/* Convert a __data pointer into an __xdata pointer */
#define DATA_TO_XDATA(a) ((void __xdata *) ((uint8_t) (a) | 0xff00))
/* 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 0x68
+#define AO_STACK_START 0x80
#define AO_STACK_END 0xfe
#define AO_STACK_SIZE (AO_STACK_END - AO_STACK_START + 1)
extern __xdata struct ao_task *__data ao_cur_task;
-#define AO_NUM_TASKS 10 /* maximum number of tasks */
+#define AO_NUM_TASKS 16 /* maximum number of tasks */
#define AO_NO_TASK 0 /* no task id */
/*
/* Add a task to the run queue */
void
-ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name);
+ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name) __reentrant;
/* Dump task info to console */
void
* 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);
/* Turn on the beeper for the specified time */
void
-ao_beep_for(uint8_t beep, uint16_t ticks);
+ao_beep_for(uint8_t beep, uint16_t ticks) __reentrant;
/* Initialize the beeper */
void
void
ao_led_set(uint8_t colors);
+/* Toggle the specified LEDs */
+void
+ao_led_toggle(uint8_t colors);
+
/* Turn on the specified LEDs for the indicated interval */
void
-ao_led_for(uint8_t colors, uint16_t ticks);
+ao_led_for(uint8_t colors, uint16_t ticks) __reentrant;
/* Initialize the LEDs */
void
-ao_led_init(void);
+ao_led_init(uint8_t enable);
/*
* ao_usb.c
/* Put one character to the USB output queue */
void
-ao_usb_putchar(uint8_t c);
+ao_usb_putchar(char c);
/* Get one character from the USB input queue */
-uint8_t
+char
ao_usb_getchar(void);
/* Flush the USB output queue */
void
ao_usb_isr(void) interrupt 6;
+/* Enable the USB controller */
+void
+ao_usb_enable(void);
+
+/* Disable the USB controller */
+void
+ao_usb_disable(void);
+
/* Initialize the USB system */
void
ao_usb_init(void);
};
extern __xdata uint16_t ao_cmd_lex_i;
-extern __xdata uint8_t ao_cmd_lex_c;
+extern __xdata char ao_cmd_lex_c;
extern __xdata enum ao_cmd_status ao_cmd_status;
void
void
ao_cmd_hex(void);
+void
+ao_cmd_decimal(void);
+
struct ao_cmds {
- uint8_t cmd;
+ char cmd;
void (*func)(void);
const char *help;
};
*/
/* 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);
* 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_POS_NONE (~0UL)
struct ao_log_record {
- uint8_t type;
+ char type;
uint8_t csum;
uint16_t tick;
union {
struct {
- uint16_t serial;
+ int16_t ground_accel;
uint16_t flight;
} flight;
struct {
};
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_pres_to_altitude(int16_t pres) __reentrant;
int16_t
-ao_temp_to_dC(int16_t temp) __reentrant;
+ao_altitude_to_pres(int16_t alt) __reentrant;
int16_t
-ao_accel_to_cm_per_s2(int16_t accel) __reentrant;
+ao_temp_to_dC(int16_t temp) __reentrant;
/*
* ao_dbg.c
void
ao_dbg_reset(void);
+void
+ao_dbg_init(void);
+
/*
* ao_serial.c
*/
ao_serial_tx1_isr(void) interrupt 14;
#endif
-uint8_t
+char
ao_serial_getchar(void) __critical;
void
-ao_serial_putchar(uint8_t c) __critical;
+ao_serial_putchar(char c) __critical;
void
ao_serial_init(void);
void
ao_gps_init(void);
+/*
+ * ao_gps_report.c
+ */
+
+void
+ao_gps_report(void);
+
+void
+ao_gps_report_init(void);
+
/*
* ao_telemetry.c
*/
-#define AO_TELEMETRY_SENSOR 1
-#define AO_TELEMETRY_GPS 2
+#define AO_MAX_CALLSIGN 8
struct ao_telemetry {
- uint8_t addr;
- uint8_t type;
- uint8_t flight_state;
- union {
- struct ao_adc adc;
- struct ao_gps_data gps;
- } u;
+ uint8_t addr;
+ uint8_t flight_state;
+ struct ao_adc adc;
+ struct ao_gps_data gps;
+ char callsign[AO_MAX_CALLSIGN];
};
+/* Set delay between telemetry reports (0 to disable) */
+
+#define AO_TELEMETRY_INTERVAL_PAD AO_MS_TO_TICKS(1000)
+#define AO_TELEMETRY_INTERVAL_FLIGHT AO_MS_TO_TICKS(50)
+#define AO_TELEMETRY_INTERVAL_RECOVER AO_MS_TO_TICKS(1000)
+
void
-ao_telemetry_send(__xdata struct ao_telemetry *telemetry) __reentrant;
+ao_telemetry_set_interval(uint16_t interval);
+
+void
+ao_rdf_set(uint8_t rdf);
void
ao_telemetry_init(void);
struct ao_radio_recv {
struct ao_telemetry telemetry;
- uint8_t rssi;
+ int8_t rssi;
uint8_t status;
};
void
ao_radio_recv(__xdata struct ao_radio_recv *recv) __reentrant;
+void
+ao_radio_rdf(void);
+
+void
+ao_radio_rdf_abort(void);
+
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_set_monitor(uint8_t monitoring);
+
+void
+ao_monitor_init(uint8_t led, uint8_t monitoring) __reentrant;
/*
* ao_stdio.c
void
flush(void);
-#endif /* _AO_H_ */
+/*
+ * 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);
+
+/*
+ * ao_config.c
+ */
+
+#define AO_CONFIG_MAJOR 1
+#define AO_CONFIG_MINOR 0
+
+struct ao_config {
+ uint8_t major;
+ uint8_t minor;
+ uint16_t main_deploy;
+ int16_t accel_zero_g;
+ uint8_t radio_channel;
+ char callsign[AO_MAX_CALLSIGN + 1];
+};
+extern __xdata struct ao_config ao_config;
+
+void
+ao_config_get(void);
+
+void
+ao_config_init(void);
+
+/*
+ * ao_rssi.c
+ */
+
+void
+ao_rssi_set(int rssi_value);
+
+void
+ao_rssi_init(uint8_t rssi_led);
+
+/*
+ * ao_product.c
+ *
+ * values which need to be defined for
+ * each instance of a product
+ */
+
+extern const uint8_t ao_usb_descriptors [];
+extern const uint16_t ao_serial_number;
+extern const char ao_version[];
+extern const char ao_manufacturer[];
+extern const char ao_product[];
+
+#endif /* _AO_H_ */