altos: re-order ao_task to match single-arch code
[fw/altos] / src / core / ao.h
index 8ac9ac3d09a30ede2a3825f669552de9e05afc1f..c926c00152ed28986ea7f8713b4433d6f1eb74d2 100644 (file)
 #include <stdio.h>
 #include <string.h>
 #include <stddef.h>
-#include "cc1111.h"
 #include "ao_pins.h"
+#include <ao_arch.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 0x90
-#define AO_STACK_END   0xfe
-#define AO_STACK_SIZE  (AO_STACK_END - AO_STACK_START + 1)
+#ifndef DATA_TO_XDATA
+#define DATA_TO_XDATA(a)       (a)
+#endif
 
 /* An AltOS task */
 struct ao_task {
        __xdata void *wchan;            /* current wait channel (NULL if running) */
        uint16_t alarm;                 /* abort ao_sleep time */
-       uint8_t stack_count;            /* amount of saved stack */
+       ao_arch_task_members            /* any architecture-specific fields */
        uint8_t task_id;                /* unique id */
        __code char *name;              /* task name */
        uint8_t stack[AO_STACK_SIZE];   /* saved stack */
@@ -75,7 +70,7 @@ ao_alarm(uint16_t delay);
 
 /* Yield the processor to another task */
 void
-ao_yield(void) __naked;
+ao_yield(void) ao_arch_naked_declare;
 
 /* Add a task to the run queue */
 void
@@ -136,7 +131,7 @@ ao_timer_set_adc_interval(uint8_t interval) __critical;
 
 /* Timer interrupt */
 void
-ao_timer_isr(void) __interrupt 9;
+ao_timer_isr(void) ao_arch_interrupt(9);
 
 /* Initialize the timer */
 void
@@ -149,35 +144,13 @@ ao_clock_init(void);
 /*
  * One set of samples read from the A/D converter or telemetry
  */
-struct ao_adc {
-       uint16_t        tick;           /* tick when the sample was read */
-       int16_t         accel;          /* accelerometer */
-       int16_t         pres;           /* pressure sensor */
-       int16_t         temp;           /* temperature sensor */
-       int16_t         v_batt;         /* battery voltage */
-       int16_t         sense_d;        /* drogue continuity sense */
-       int16_t         sense_m;        /* main continuity sense */
-};
-
-#ifndef HAS_ADC
-#error Please define HAS_ADC
-#endif
 
 #if HAS_ADC
 
-#if HAS_ACCEL
-#ifndef HAS_ACCEL_REF
-#error Please define HAS_ACCEL_REF
-#endif
-#else
-#define HAS_ACCEL_REF 0
-#endif
-
 /*
  * ao_adc.c
  */
 
-#define AO_ADC_RING    32
 #define ao_adc_ring_next(n)    (((n) + 1) & (AO_ADC_RING - 1))
 #define ao_adc_ring_prev(n)    (((n) - 1) & (AO_ADC_RING - 1))
 
@@ -207,7 +180,7 @@ ao_adc_get(__xdata struct ao_adc *packet);
 /* The A/D interrupt handler */
 
 void
-ao_adc_isr(void) __interrupt 1;
+ao_adc_isr(void) ao_arch_interrupt(1);
 
 /* Initialize the A/D converter */
 void
@@ -298,25 +271,6 @@ ao_led_for(uint8_t colors, uint16_t ticks) __reentrant;
 void
 ao_led_init(uint8_t enable);
 
-/*
- * ao_romconfig.c
- */
-
-#define AO_ROMCONFIG_VERSION   2
-
-extern __code __at (0x00a0) uint16_t ao_romconfig_version;
-extern __code __at (0x00a2) uint16_t ao_romconfig_check;
-extern __code __at (0x00a4) uint16_t ao_serial_number;
-extern __code __at (0x00a6) uint32_t ao_radio_cal;
-
-#ifndef HAS_USB
-#error Please define HAS_USB
-#endif
-
-#if HAS_USB
-extern __code __at (0x00aa) uint8_t ao_usb_descriptors [];
-#endif
-
 /*
  * ao_usb.c
  */
@@ -342,7 +296,7 @@ ao_usb_flush(void);
 #if HAS_USB
 /* USB interrupt handler */
 void
-ao_usb_isr(void) __interrupt 6;
+ao_usb_isr(void) ao_arch_interrupt(6);
 #endif
 
 /* Enable the USB controller */
@@ -357,6 +311,10 @@ ao_usb_disable(void);
 void
 ao_usb_init(void);
 
+#if HAS_USB
+extern __code __at (0x00aa) uint8_t ao_usb_descriptors [];
+#endif
+
 /*
  * ao_cmd.c
  */
@@ -446,7 +404,7 @@ ao_dma_abort(uint8_t id);
 
 /* DMA interrupt routine */
 void
-ao_dma_isr(void) __interrupt 8;
+ao_dma_isr(void) ao_arch_interrupt(8);
 
 /*
  * ao_mutex.c
@@ -537,6 +495,23 @@ extern __pdata uint32_t ao_log_start_pos;
 extern __xdata uint8_t ao_log_running;
 extern __pdata enum flight_state ao_log_state;
 
+#define AO_LOG_TELESCIENCE_START       ((uint8_t) 's')
+#define AO_LOG_TELESCIENCE_DATA                ((uint8_t) 'd')
+
+#define AO_LOG_TELESCIENCE_NUM_ADC     12
+
+struct ao_log_telescience {
+       uint8_t         type;
+       uint8_t         csum;
+       uint16_t        tick;
+       uint16_t        tm_tick;
+       uint8_t         tm_state;
+       uint8_t         unused;
+       uint16_t        adc[AO_LOG_TELESCIENCE_NUM_ADC];
+};
+
+extern struct ao_log_telescience ao_log_store;
+
 /* required functions from the underlying log system */
 
 #define AO_LOG_FORMAT_UNKNOWN          0       /* unknown; altosui will have to guess */
@@ -927,10 +902,10 @@ ao_dbg_init(void);
 #endif
 
 void
-ao_serial_rx1_isr(void) __interrupt 3;
+ao_serial_rx1_isr(void) ao_arch_interrupt(3);
 
 void
-ao_serial_tx1_isr(void) __interrupt 14;
+ao_serial_tx1_isr(void) ao_arch_interrupt(14);
 
 char
 ao_serial_getchar(void) __critical;
@@ -1002,6 +977,16 @@ ao_spi_recv(void __xdata *block, uint16_t len) __reentrant;
 void
 ao_spi_init(void);
 
+/*
+ * ao_spi_slave.c
+ */
+
+void
+ao_spi_slave_debug(void);
+
+void
+ao_spi_slave_init(void);
+
 /*
  * ao_telemetry.c
  */
@@ -1251,14 +1236,6 @@ struct ao_telemetry_tiny {
        char                    callsign[AO_MAX_CALLSIGN];
 };
 
-/*
- * ao_radio_recv tacks on rssi and status bytes
- */
-
-struct ao_telemetry_raw_recv {
-       uint8_t                 packet[AO_MAX_TELEMETRY + 2];
-};
-
 struct ao_telemetry_orig_recv {
        struct ao_telemetry_orig        telemetry_orig;
        int8_t                          rssi;
@@ -1271,6 +1248,14 @@ struct ao_telemetry_tiny_recv {
        uint8_t                         status;
 };
 
+/*
+ * ao_radio_recv tacks on rssi and status bytes
+ */
+
+struct ao_telemetry_raw_recv {
+       uint8_t                 packet[AO_MAX_TELEMETRY + 2];
+};
+
 /* Set delay between telemetry reports (0 to disable) */
 
 #define AO_TELEMETRY_INTERVAL_PAD      AO_MS_TO_TICKS(1000)
@@ -1302,7 +1287,7 @@ extern __xdata uint8_t ao_radio_done;
 extern __xdata uint8_t ao_radio_mutex;
 
 void
-ao_radio_general_isr(void) __interrupt 16;
+ao_radio_general_isr(void) ao_arch_interrupt(16);
 
 void
 ao_radio_get(uint8_t len);
@@ -1600,11 +1585,17 @@ struct ao_companion_setup {
 };
 
 extern __pdata uint8_t                         ao_companion_running;
-extern __xdata struct ao_companion_setup       ao_companion_setup;
 extern __xdata uint8_t                         ao_companion_mutex;
+extern __xdata struct ao_companion_command     ao_companion_command;
+extern __xdata struct ao_companion_setup       ao_companion_setup;
 extern __xdata uint16_t                                ao_companion_data[AO_COMPANION_MAX_CHANNELS];
 
 void
 ao_companion_init(void);
 
+/* ao_lcd.c */
+  
+void
+ao_lcd_init(void);
+
 #endif /* _AO_H_ */