altos: Add support for UART0 in async mode
[fw/altos] / src / core / ao.h
index 1d5769cb0f6b5c62f77588e9341aec59c6ea4e76..494993f12992b8f7b5e71bd190da155bc3068dc6 100644 (file)
 #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 {
@@ -343,6 +349,9 @@ ao_cmd_put8(uint8_t v);
 void
 ao_cmd_put16(uint16_t v);
 
+uint8_t
+ao_cmd_is_white(void);
+
 void
 ao_cmd_white(void);
 
@@ -367,7 +376,7 @@ struct ao_cmds {
 };
 
 void
-ao_cmd_register(__code struct ao_cmds *cmds);
+ao_cmd_register(const __code struct ao_cmds *cmds);
 
 void
 ao_cmd_init(void);
@@ -929,6 +938,35 @@ void
 ao_serial_init(void);
 #endif
 
+#ifndef HAS_SERIAL_0
+#define HAS_SERIAL_0 0
+#endif
+
+#if HAS_SERIAL_0
+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
  */
@@ -975,10 +1013,10 @@ ao_spi_init(void);
  */
 
 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);
@@ -996,7 +1034,11 @@ ao_spi_slave(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 */
@@ -1156,6 +1198,12 @@ union ao_telemetry_all {
        struct ao_telemetry_baro                baro;
 };
 
+struct ao_telemetry_all_recv {
+       union ao_telemetry_all          telemetry;
+       int8_t                          rssi;
+       uint8_t                         status;
+};
+
 /*
  * ao_gps.c
  */
@@ -1333,16 +1381,26 @@ void
 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);
@@ -1362,9 +1420,10 @@ extern const char const * const ao_state_names[];
 #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];
@@ -1379,13 +1438,18 @@ ao_monitor(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_init(uint8_t led, uint8_t monitoring) __reentrant;
+ao_monitor_disable(void);
+
+void
+ao_monitor_enable(void);
+
+void
+ao_monitor_init(void) __reentrant;
 
 /*
  * ao_stdio.c
@@ -1460,9 +1524,21 @@ ao_igniter_init(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;
@@ -1479,6 +1555,9 @@ struct ao_config {
        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
@@ -1657,12 +1736,46 @@ ao_companion_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 */
 
@@ -1801,4 +1914,45 @@ ao_log_single_init(void);
 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_ */