#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 {
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_serial_init(void);
#endif
+#ifndef HAS_SERIAL_0
+#define HAS_SERIAL_0 0
+#endif
+
+#if HAS_SERIAL_0
+
+extern volatile __xdata struct ao_fifo ao_usart0_rx_fifo;
+extern volatile __xdata struct ao_fifo ao_usart0_tx_fifo;
+
+void
+ao_serial0_rx0_isr(void) ao_arch_interrupt(2);
+
+void
+ao_serial0_tx0_isr(void) ao_arch_interrupt(7);
+
+char
+ao_serial0_getchar(void) __critical;
+
+void
+ao_serial0_putchar(char c) __critical;
+
+void
+ao_serial0_drain(void) __critical;
+
+void
+ao_serial0_set_speed(uint8_t speed);
+
+void
+ao_serial0_init(void);
+
+#endif
+
+
/*
* ao_spi.c
*/
* ao_spi_slave.c
*/
+uint8_t
+ao_spi_slave_recv(uint8_t *buf, uint8_t len);
+
void
-ao_spi_slave_debug(void);
+ao_spi_slave_send(uint8_t *buf, uint8_t len);
void
ao_spi_slave_init(void);
+/* This must be defined by the product; it will get called when chip
+ * select goes low, at which point it should use ao_spi_read and
+ * ao_spi_write to deal with the request
+ */
+
+void
+ao_spi_slave(void);
+
/*
* ao_telemetry.c
*/
#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_monitor_ring_next(n) (((n) + 1) & (AO_MONITOR_RING - 1))
+extern __data uint8_t ao_monitoring;
extern __data uint8_t ao_monitor_head;
void
#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_init(uint8_t led, uint8_t monitoring) __reentrant;
+ao_monitor_enable(void);
+
+void
+ao_monitor_init(void) __reentrant;
/*
* ao_stdio.c
enum ao_igniter_status
ao_igniter_status(enum ao_igniter igniter);
+extern __pdata uint8_t ao_igniter_present;
+
void
ao_ignite_set_pins(void);
*/
#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;
+ uint32_t radio_setting;
+};
+#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 */
+#if HAS_RADIO_CHANNELS
+ struct ao_radio_channel radio_channels[AO_NUM_CHANNELS]; /* minor version 10 */
+#endif
};
#define AO_IGNITE_MODE_DUAL 0
/* 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);
+
#endif /* _AO_H_ */