#ifndef DATA_TO_XDATA
#define DATA_TO_XDATA(a) (a)
#endif
+#ifndef PDATA_TO_XDATA
+#define PDATA_TO_XDATA(a) (a)
+#endif
+#ifndef CODE_TO_XDATA
+#define CODE_TO_XDATA(a) (a)
+#endif
/* An AltOS task */
struct ao_task {
#define AO_PANIC_FLASH 9 /* Invalid flash part (or wrong blocksize) */
#define AO_PANIC_USB 10 /* Trying to send USB packet while busy */
#define AO_PANIC_BT 11 /* Communications with bluetooth device failed */
+#define AO_PANIC_STACK 12 /* Stack overflow */
+#define AO_PANIC_SPI 13 /* SPI communication failure */
/* Stop the operating system, beeping and blinking the reason */
void
#define AO_LED_NONE 0
+#ifndef AO_LED_TYPE
+#define AO_LED_TYPE uint8_t
+#endif
+
/* Turn on the specified LEDs */
void
-ao_led_on(uint8_t colors);
+ao_led_on(AO_LED_TYPE colors);
/* Turn off the specified LEDs */
void
-ao_led_off(uint8_t colors);
+ao_led_off(AO_LED_TYPE colors);
/* Set all of the LEDs to the specified state */
void
-ao_led_set(uint8_t colors);
+ao_led_set(AO_LED_TYPE colors);
/* Toggle the specified LEDs */
void
-ao_led_toggle(uint8_t colors);
+ao_led_toggle(AO_LED_TYPE colors);
/* Turn on the specified LEDs for the indicated interval */
void
-ao_led_for(uint8_t colors, uint16_t ticks) __reentrant;
+ao_led_for(AO_LED_TYPE colors, uint16_t ticks) __reentrant;
/* Initialize the LEDs */
void
-ao_led_init(uint8_t enable);
+ao_led_init(AO_LED_TYPE enable);
/*
* ao_usb.c
void
ao_cmd_put16(uint16_t v);
+uint8_t
+ao_cmd_is_white(void);
+
void
ao_cmd_white(void);
};
void
-ao_cmd_register(__code struct ao_cmds *cmds);
+ao_cmd_register(const __code struct ao_cmds *cmds);
void
ao_cmd_init(void);
ao_cmd_filter(void);
#endif
-/*
- * ao_dma.c
- */
-
-/* Allocate a DMA channel. the 'done' parameter will be set when the
- * dma is finished and will be used to wakeup any waiters
- */
-
-uint8_t
-ao_dma_alloc(__xdata uint8_t * done);
-
-/* Setup a DMA channel */
-void
-ao_dma_set_transfer(uint8_t id,
- void __xdata *srcaddr,
- void __xdata *dstaddr,
- uint16_t count,
- uint8_t cfg0,
- uint8_t cfg1);
-
-/* Start a DMA channel */
-void
-ao_dma_start(uint8_t id);
-
-/* Manually trigger a DMA channel */
-void
-ao_dma_trigger(uint8_t id);
-
-/* Abort a running DMA transfer */
-void
-ao_dma_abort(uint8_t id);
-
-/* DMA interrupt routine */
-void
-ao_dma_isr(void) ao_arch_interrupt(8);
-
/*
* ao_mutex.c
*/
#error Please define HAS_SERIAL_1
#endif
-#if HAS_SERIAL_1
+#if HAS_SERIAL_1 | HAS_SERIAL_2 | HAS_SERIAL_3
#ifndef USE_SERIAL_STDIN
#error Please define USE_SERIAL_STDIN
#endif
ao_serial_pollchar(void) __critical;
void
-ao_serial_set_stdin(uint8_t stdin);
+ao_serial_set_stdin(uint8_t in);
#endif
void
ao_serial_init(void);
#endif
-/*
- * ao_spi.c
- */
+#ifndef HAS_SERIAL_0
+#define HAS_SERIAL_0 0
+#endif
-extern __xdata uint8_t ao_spi_mutex;
+#if HAS_SERIAL_0
-#define ao_spi_get_mask(reg,mask) do {\
- ao_mutex_get(&ao_spi_mutex); \
- (reg) &= ~(mask); \
- } while (0)
+extern volatile __xdata struct ao_fifo ao_usart0_rx_fifo;
+extern volatile __xdata struct ao_fifo ao_usart0_tx_fifo;
-#define ao_spi_put_mask(reg,mask) do { \
- (reg) |= (mask); \
- ao_mutex_put(&ao_spi_mutex); \
- } while (0)
+void
+ao_serial0_rx0_isr(void) ao_arch_interrupt(2);
-#define ao_spi_get_bit(bit) do {\
- ao_mutex_get(&ao_spi_mutex); \
- (bit) = 0; \
- } while (0)
+void
+ao_serial0_tx0_isr(void) ao_arch_interrupt(7);
-#define ao_spi_put_bit(bit) do { \
- (bit) = 1; \
- ao_mutex_put(&ao_spi_mutex); \
- } while (0)
+char
+ao_serial0_getchar(void) __critical;
-/*
- * The SPI mutex must be held to call either of these
- * functions -- this mutex covers the entire SPI operation,
- * from chip select low to chip select high
- */
+void
+ao_serial0_putchar(char c) __critical;
void
-ao_spi_send(void __xdata *block, uint16_t len) __reentrant;
+ao_serial0_drain(void) __critical;
void
-ao_spi_recv(void __xdata *block, uint16_t len) __reentrant;
+ao_serial0_set_speed(uint8_t speed);
void
-ao_spi_init(void);
+ao_serial0_init(void);
+
+#endif
+
/*
* ao_spi_slave.c
*/
uint8_t
-ao_spi_read(uint8_t *buf, uint8_t len);
+ao_spi_slave_recv(uint8_t *buf, uint8_t len);
void
-ao_spi_write(uint8_t *buf, uint8_t len);
+ao_spi_slave_send(uint8_t *buf, uint8_t len);
void
ao_spi_slave_init(void);
*/
#define AO_MAX_CALLSIGN 8
#define AO_MAX_VERSION 8
+#if LEGACY_MONITOR
#define AO_MAX_TELEMETRY 128
+#else
+#define AO_MAX_TELEMETRY 32
+#endif
struct ao_telemetry_generic {
uint16_t serial; /* 0 */
struct ao_telemetry_baro baro;
};
+struct ao_telemetry_all_recv {
+ union ao_telemetry_all telemetry;
+ int8_t rssi;
+ uint8_t status;
+};
+
/*
* ao_gps.c
*/
ao_radio_set_packet(void);
void
-ao_radio_send(__xdata void *data, uint8_t size) __reentrant;
+ao_radio_send(__xdata void *d, uint8_t size) __reentrant;
uint8_t
-ao_radio_recv(__xdata void *data, uint8_t size) __reentrant;
+ao_radio_recv(__xdata void *d, uint8_t size) __reentrant;
void
ao_radio_recv_abort(void);
+/*
+ * Compute the packet length as follows:
+ *
+ * 2000 bps (for a 1kHz tone)
+ * so, for 'ms' milliseconds, we need
+ * 2 * ms bits, or ms / 4 bytes
+ */
+
+#define AO_MS_TO_RDF_LEN(ms) ((ms) > 255 * 4 ? 255 : ((ms) >> 2))
+
void
-ao_radio_rdf(int ms);
+ao_radio_rdf(uint8_t pkt_len);
void
ao_radio_rdf_abort(void);
#define AO_MONITOR_RING 8
union ao_monitor {
- struct ao_telemetry_raw_recv raw;
- struct ao_telemetry_orig_recv orig;
- struct ao_telemetry_tiny_recv tiny;
+ struct ao_telemetry_raw_recv raw;
+ struct ao_telemetry_all_recv all;
+ struct ao_telemetry_orig_recv orig;
+ struct ao_telemetry_tiny_recv tiny;
};
extern __xdata union ao_monitor ao_monitor_ring[AO_MONITOR_RING];
#define AO_MONITORING_OFF 0
#define AO_MONITORING_ORIG 1
-#define AO_MONITORING_TINY 2
void
-ao_set_monitor(uint8_t monitoring);
+ao_monitor_set(uint8_t monitoring);
+
+void
+ao_monitor_disable(void);
+
+void
+ao_monitor_enable(void);
void
-ao_monitor_init(uint8_t led, uint8_t monitoring) __reentrant;
+ao_monitor_init(void) __reentrant;
/*
* ao_stdio.c
*/
#define AO_CONFIG_MAJOR 1
-#define AO_CONFIG_MINOR 9
+#define AO_CONFIG_MINOR 10
#define AO_AES_LEN 16
+#if HAS_RADIO_CHANNELS
+#define AO_CHANNEL_NAME_LEN 10
+
+#define AO_NUM_CHANNELS 10
+
+struct ao_radio_channel {
+ char name[AO_CHANNEL_NAME_LEN];
+ uint32_t kHz;
+};
+#endif
+
struct ao_config {
uint8_t major;
uint8_t minor;
uint32_t radio_setting; /* minor version 7 */
uint8_t radio_enable; /* minor version 8 */
uint8_t aes_key[AO_AES_LEN]; /* minor version 9 */
+ uint32_t frequency; /* minor version 10 */
+#if HAS_RADIO_CHANNELS
+ struct ao_radio_channel radio_channels[AO_NUM_CHANNELS]; /* minor version 10 */
+#endif
};
#define AO_IGNITE_MODE_DUAL 0
void
ao_config_put(void);
+void
+ao_config_set_radio(void);
+
void
ao_config_init(void);
/* ao_lcd.c */
+void
+ao_lcd_putchar(uint8_t d);
+
+void
+ao_lcd_putstring(char *string);
+
+void
+ao_lcd_contrast_set(uint8_t contrast);
+
+void
+ao_lcd_clear(void);
+
+void
+ao_lcd_cursor_on(void);
+
+void
+ao_lcd_cursor_off(void);
+
+#define AO_LCD_ADDR(row,col) ((row << 6) | (col))
+
+void
+ao_lcd_goto(uint8_t addr);
+
+void
+ao_lcd_start(void);
+
void
ao_lcd_init(void);
+/* ao_lcd_port.c */
+
+void
+ao_lcd_port_put_nibble(uint8_t rs, uint8_t d);
+
+void
+ao_lcd_port_init(void);
+
/* ao_aes.c */
-__xdata uint8_t ao_aes_mutex;
+extern __xdata uint8_t ao_aes_mutex;
/* AES keys and blocks are 128 bits */
void
ao_log_single(void);
+/*
+ * ao_pyro_slave.c
+ */
+
+#define AO_TELEPYRO_NUM_ADC 9
+
+#ifndef ao_xmemcpy
+#define ao_xmemcpy(d,s,c) memcpy(d,s,c)
+#define ao_xmemset(d,v,c) memset(d,v,c)
+#define ao_xmemcmp(d,s,c) memcmp(d,s,c)
+#endif
+
+/*
+ * ao_terraui.c
+ */
+
+void
+ao_terraui_init(void);
+
+/*
+ * ao_battery.c
+ */
+
+#ifdef BATTERY_PIN
+void
+ao_battery_isr(void) ao_arch_interrupt(1);
+
+uint16_t
+ao_battery_get(void);
+
+void
+ao_battery_init(void);
+#endif /* BATTERY_PIN */
+
+/*
+ * ao_sqrt.c
+ */
+
+uint32_t
+ao_sqrt(uint32_t op);
+
+/*
+ * ao_freq.c
+ */
+
+int32_t ao_freq_to_set(int32_t freq, int32_t cal) __reentrant;
+
+#include <ao_arch_funcs.h>
+
+/*
+ * ao_ms5607.c
+ */
+
+void ao_ms5607_init(void);
+
#endif /* _AO_H_ */