X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fao.h;h=2e2fb589f1916dd20304c3a2cfe82ade5092ed4f;hp=c4cb5bf7176d526b2ea4a4bbe887684778070a59;hb=b428faf74ae145126ec1da972028fcfe0b4b2b18;hpb=210dbaa23cdacf3a6f2d6e23493e96ee2ac9bca7 diff --git a/src/ao.h b/src/ao.h index c4cb5bf7..2e2fb589 100644 --- a/src/ao.h +++ b/src/ao.h @@ -21,6 +21,7 @@ #include #include #include +#include #include "cc1111.h" #define TRUE 1 @@ -39,6 +40,7 @@ /* 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 */ uint8_t task_id; /* index in the task array */ __code char *name; /* task name */ @@ -54,14 +56,26 @@ extern __xdata struct ao_task *__data ao_cur_task; ao_task.c */ -/* Suspend the current task until wchan is awoken */ -void +/* Suspend the current task until wchan is awoken. + * returns: + * 0 on normal wake + * 1 on alarm + */ +uint8_t ao_sleep(__xdata void *wchan); /* Wake all tasks sleeping on wchan */ void ao_wakeup(__xdata void *wchan); +/* Wake up a specific task */ +void +ao_wake_task(__xdata struct ao_task *task); + +/* set an alarm to go off in 'delay' ticks */ +void +ao_alarm(uint16_t delay); + /* Yield the processor to another task */ void ao_yield(void) _naked; @@ -70,6 +84,10 @@ ao_yield(void) _naked; void ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name) __reentrant; +/* Terminate the current task */ +void +ao_exit(void); + /* Dump task info to console */ void ao_task_info(void); @@ -121,11 +139,15 @@ ao_timer_isr(void) interrupt 9; void ao_timer_init(void); +/* Initialize the hardware clock. Must be called first */ +void +ao_clock_init(void); + /* * ao_adc.c */ -#define AO_ADC_RING 64 +#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)) @@ -336,9 +358,14 @@ ao_cmd_init(void); * ao_dma.c */ -/* 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 +/* Allocate a DMA channel. the 'done' parameter will be set + * when the dma is finished or aborted and will be used to + * wakeup any waiters */ + +#define AO_DMA_DONE 1 +#define AO_DMA_ABORTED 2 + uint8_t ao_dma_alloc(__xdata uint8_t * done); @@ -419,14 +446,6 @@ ao_ee_init(void); * ao_log.c */ -/* Structure containing GPS position, either lat or lon */ - -struct ao_gps_pos { - uint8_t degrees; - uint8_t minutes; - uint16_t minutes_fraction; /* in units of 1/10000 minutes */ -}; - /* * The data log is recorded in the eeprom as a sequence * of data packets. @@ -461,6 +480,7 @@ struct ao_gps_pos { #define AO_LOG_GPS_LAT 'N' #define AO_LOG_GPS_LON 'W' #define AO_LOG_GPS_ALT 'H' +#define AO_LOG_GPS_SAT 'V' #define AO_LOG_POS_NONE (~0UL) @@ -495,12 +515,17 @@ struct ao_log_record { uint8_t second; uint8_t flags; } gps_time; - struct ao_gps_pos gps_latitude; - struct ao_gps_pos gps_longitude; + int32_t gps_latitude; + int32_t gps_longitude; struct { int16_t altitude; uint16_t unused; } gps_altitude; + struct { + uint16_t svid; + uint8_t state; + uint8_t c_n; + } gps_sat; struct { uint16_t d0; uint16_t d1; @@ -553,10 +578,10 @@ ao_log_init(void); enum ao_flight_state { ao_flight_startup = 0, ao_flight_idle = 1, - ao_flight_launchpad = 2, + ao_flight_pad = 2, ao_flight_boost = 3, - ao_flight_coast = 4, - ao_flight_apogee = 5, + ao_flight_fast = 4, + ao_flight_coast = 5, ao_flight_drogue = 6, ao_flight_main = 7, ao_flight_landed = 8, @@ -664,6 +689,13 @@ ao_serial_getchar(void) __critical; void ao_serial_putchar(char c) __critical; +#define AO_SERIAL_SPEED_4800 0 +#define AO_SERIAL_SPEED_9600 1 +#define AO_SERIAL_SPEED_57600 2 + +void +ao_serial_set_speed(uint8_t speed); + void ao_serial_init(void); @@ -675,26 +707,47 @@ ao_serial_init(void); #define AO_GPS_NUM_SAT_SHIFT (0) #define AO_GPS_VALID (1 << 4) -#define AO_GPS_LONGITUDE_MASK (1 << 5) -#define AO_GPS_LONGITUDE_EAST (0 << 5) -#define AO_GPS_LONGITUDE_WEST (1 << 5) - -#define AO_GPS_LATITUDE_MASK (1 << 6) -#define AO_GPS_LATITUDE_NORTH (0 << 6) -#define AO_GPS_LATITUDE_SOUTH (1 << 6) +#define AO_GPS_RUNNING (1 << 5) struct ao_gps_data { uint8_t hour; uint8_t minute; uint8_t second; uint8_t flags; - struct ao_gps_pos latitude; - struct ao_gps_pos longitude; - int16_t altitude; + int32_t latitude; /* degrees * 10⁷ */ + int32_t longitude; /* degrees * 10⁷ */ + int16_t altitude; /* m */ + uint16_t ground_speed; /* cm/s */ + uint8_t course; /* degrees / 2 */ + uint8_t hdop; /* * 5 */ + int16_t climb_rate; /* cm/s */ + uint16_t h_error; /* m */ + uint16_t v_error; /* m */ +}; + +#define SIRF_SAT_STATE_ACQUIRED (1 << 0) +#define SIRF_SAT_STATE_CARRIER_PHASE_VALID (1 << 1) +#define SIRF_SAT_BIT_SYNC_COMPLETE (1 << 2) +#define SIRF_SAT_SUBFRAME_SYNC_COMPLETE (1 << 3) +#define SIRF_SAT_CARRIER_PULLIN_COMPLETE (1 << 4) +#define SIRF_SAT_CODE_LOCKED (1 << 5) +#define SIRF_SAT_ACQUISITION_FAILED (1 << 6) +#define SIRF_SAT_EPHEMERIS_AVAILABLE (1 << 7) + +struct ao_gps_sat_data { + uint8_t svid; + uint8_t state; + uint8_t c_n_1; +}; + +struct ao_gps_tracking_data { + uint8_t channels; + struct ao_gps_sat_data sats[12]; }; extern __xdata uint8_t ao_gps_mutex; extern __xdata struct ao_gps_data ao_gps_data; +extern __xdata struct ao_gps_tracking_data ao_gps_tracking_data; void ao_gps(void); @@ -702,6 +755,9 @@ ao_gps(void); void ao_gps_print(__xdata struct ao_gps_data *gps_data); +void +ao_gps_tracking_print(__xdata struct ao_gps_tracking_data *gps_tracking_data); + void ao_gps_init(void); @@ -732,6 +788,7 @@ struct ao_telemetry { struct ao_adc adc; struct ao_gps_data gps; char callsign[AO_MAX_CALLSIGN]; + struct ao_gps_tracking_data gps_tracking; }; /* Set delay between telemetry reports (0 to disable) */ @@ -743,6 +800,9 @@ struct ao_telemetry { void ao_telemetry_set_interval(uint16_t interval); +void +ao_rdf_set(uint8_t rdf); + void ao_telemetry_init(void); @@ -750,6 +810,23 @@ ao_telemetry_init(void); * ao_radio.c */ +extern __xdata uint8_t ao_radio_dma; +extern __xdata uint8_t ao_radio_dma_done; +extern __xdata uint8_t ao_radio_done; +extern __xdata uint8_t ao_radio_mutex; + +void +ao_radio_general_isr(void) interrupt 16; + +void +ao_radio_set_telemetry(void); + +void +ao_radio_set_packet(void); + +void +ao_radio_set_rdf(void); + void ao_radio_send(__xdata struct ao_telemetry *telemetry) __reentrant; @@ -759,9 +836,21 @@ struct ao_radio_recv { uint8_t status; }; -void +uint8_t ao_radio_recv(__xdata struct ao_radio_recv *recv) __reentrant; +void +ao_radio_rdf(int ms); + +void +ao_radio_abort(void); + +void +ao_radio_rdf_abort(void); + +void +ao_radio_idle(void); + void ao_radio_init(void); @@ -817,7 +906,7 @@ ao_igniter_init(void); */ #define AO_CONFIG_MAJOR 1 -#define AO_CONFIG_MINOR 0 +#define AO_CONFIG_MINOR 1 struct ao_config { uint8_t major; @@ -826,6 +915,7 @@ struct ao_config { int16_t accel_zero_g; uint8_t radio_channel; char callsign[AO_MAX_CALLSIGN + 1]; + uint8_t apogee_delay; }; extern __xdata struct ao_config ao_config; @@ -890,35 +980,21 @@ struct ao_fifo { * Packet-based command interface */ -#define AO_PACKET_MAX 32 -#define AO_PACKET_WIN 256 - -#define AO_PACKET_FIN (1 << 0) -#define AO_PACKET_SYN (1 << 1) -#define AO_PACKET_RST (1 << 2) -#define AO_PACKET_ACK (1 << 3) +#define AO_PACKET_MAX 8 struct ao_packet { uint8_t addr; - uint8_t flags; - uint16_t seq; - uint16_t ack; - uint16_t window; uint8_t len; + uint8_t seq; + uint8_t ack; uint8_t d[AO_PACKET_MAX]; }; -uint8_t -ao_packet_connect(uint8_t dest); - -uint8_t -ao_packet_accept(void); - -int -ao_packet_send(uint8_t *data, int len); - -int -ao_packet_recv(uint8_t *data, int len); +struct ao_packet_recv { + struct ao_packet packet; + int8_t rssi; + uint8_t status; +}; void ao_packet_init(void);