diff options
Diffstat (limited to 'src/ao.h')
| -rw-r--r-- | src/ao.h | 142 | 
1 files changed, 116 insertions, 26 deletions
| @@ -40,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 */ @@ -55,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; @@ -71,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); @@ -89,6 +106,7 @@ ao_start_scheduler(void);  #define AO_PANIC_EE		4	/* Mis-using eeprom API */  #define AO_PANIC_LOG		5	/* Failing to read/write log data */  #define AO_PANIC_CMD		6	/* Too many command sets registered */ +#define AO_PANIC_STDIO		7	/* Too many stdio handlers registered */  /* Stop the operating system, beeping and blinking the reason */  void @@ -130,7 +148,7 @@ 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)) @@ -273,6 +291,12 @@ ao_usb_putchar(char c);  char  ao_usb_getchar(void); +/* Poll for a charcter on the USB input queue. + * returns AO_READ_AGAIN if none are available + */ +char +ao_usb_pollchar(void); +  /* Flush the USB output queue */  void  ao_usb_flush(void); @@ -341,9 +365,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); @@ -668,7 +697,8 @@ void  ao_serial_putchar(char c) __critical;  #define AO_SERIAL_SPEED_4800	0 -#define AO_SERIAL_SPEED_57600	1 +#define AO_SERIAL_SPEED_9600	1 +#define AO_SERIAL_SPEED_57600	2  void  ao_serial_set_speed(uint8_t speed); @@ -787,6 +817,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; @@ -796,16 +843,22 @@ 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);  /* @@ -827,9 +880,24 @@ ao_monitor_init(uint8_t led, uint8_t monitoring) __reentrant;   * ao_stdio.c   */ +#define AO_READ_AGAIN	((char) -1) + +struct ao_stdio { +	char	(*pollchar)(void); +	void	(*putchar)(char c) __reentrant; +	void	(*flush)(void); +}; +  void  flush(void); +extern __xdata uint8_t ao_stdin_ready; + +void +ao_add_stdio(char (*pollchar)(void), +	     void (*putchar)(char) __reentrant, +	     void (*flush)(void)); +  /*   * ao_ignite.c   */ @@ -934,37 +1002,59 @@ 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 +#define AO_PACKET_SYN		(uint8_t) 0xff  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); +struct ao_packet_recv { +	struct ao_packet	packet; +	int8_t			rssi; +	uint8_t			status; +}; + +extern __xdata struct ao_packet_recv ao_rx_packet; +extern __xdata struct ao_packet ao_tx_packet; +extern __xdata struct ao_task	ao_packet_task; +extern __xdata uint8_t ao_packet_enable; +extern __xdata uint8_t ao_packet_master_sleeping; +extern __pdata uint8_t ao_packet_rx_len, ao_packet_rx_used, ao_packet_tx_used; + +void +ao_packet_send(void);  uint8_t -ao_packet_accept(void); +ao_packet_recv(void); + +void +ao_packet_flush(void); + +void +ao_packet_putchar(char c) __reentrant; + +char +ao_packet_pollchar(void) __critical; -int -ao_packet_send(uint8_t *data, int len); +/* ao_packet_master.c */ -int -ao_packet_recv(uint8_t *data, int len); +void +ao_packet_master_init(void); + +/* ao_packet_slave.c */ + +void +ao_packet_slave_start(void); + +void +ao_packet_slave_stop(void);  void -ao_packet_init(void); +ao_packet_slave_init(void);  #endif /* _AO_H_ */ | 
