diff options
| author | Bdale Garbee <bdale@gag.com> | 2015-02-07 22:39:54 -0700 | 
|---|---|---|
| committer | Bdale Garbee <bdale@gag.com> | 2015-02-07 22:39:54 -0700 | 
| commit | f766a457323268857b3f2dfc7f42427437b71cb7 (patch) | |
| tree | 8afc8a661d682fc34b16fc0b1b44f2844d34f336 /src/drivers/ao_btm.c | |
| parent | db51224af01731e7323f6f696a7397d64eb80b92 (diff) | |
| parent | e2cefd8593d269ce603aaf33f4a53a5c2dcb3350 (diff) | |
Merge branch 'branch-1.6' into debian
Conflicts:
	ChangeLog
	altoslib/AltosTelemetryReader.java
	configure.ac
Diffstat (limited to 'src/drivers/ao_btm.c')
| -rw-r--r-- | src/drivers/ao_btm.c | 168 | 
1 files changed, 126 insertions, 42 deletions
diff --git a/src/drivers/ao_btm.c b/src/drivers/ao_btm.c index 3b6028a0..e6b28688 100644 --- a/src/drivers/ao_btm.c +++ b/src/drivers/ao_btm.c @@ -16,13 +16,16 @@   */  #include "ao.h" +#ifdef AO_BTM_INT_PORT +#include <ao_exti.h> +#endif  #ifndef ao_serial_btm_getchar  #define ao_serial_btm_putchar	ao_serial1_putchar  #define _ao_serial_btm_pollchar	_ao_serial1_pollchar +#define _ao_serial_btm_sleep()	ao_sleep((void *) &ao_serial1_rx_fifo)  #define ao_serial_btm_set_speed ao_serial1_set_speed  #define ao_serial_btm_drain	ao_serial1_drain -#define ao_serial_btm_rx_fifo	ao_serial1_rx_fifo  #endif  int8_t			ao_btm_stdio; @@ -32,7 +35,7 @@ __xdata uint8_t		ao_btm_connected;  #if BT_DEBUG  __xdata char		ao_btm_buffer[256]; -int			ao_btm_ptr; +uint16_t		ao_btm_ptr;  char			ao_btm_dir;  static void @@ -81,6 +84,10 @@ ao_btm_dump(void)  			putchar(ao_btm_buffer[i]);  	}  	putchar('\n'); +	ao_cmd_decimal(); +	if (ao_cmd_status == ao_cmd_success && ao_cmd_lex_i) +		ao_btm_ptr = 0; +	ao_cmd_status = ao_cmd_success;  }  static void @@ -95,9 +102,44 @@ ao_btm_speed(void)  		ao_cmd_status = ao_cmd_syntax_error;  } +static uint8_t	ao_btm_enable; + +static void +ao_btm_do_echo(void) +{ +	int	c; +	while (ao_btm_enable) { +		ao_arch_block_interrupts(); +		while ((c = _ao_serial_btm_pollchar()) == AO_READ_AGAIN && ao_btm_enable) +			_ao_serial_btm_sleep(); +		ao_arch_release_interrupts(); +		if (c != AO_READ_AGAIN) { +			putchar(c); +			flush(); +		} +	} +	ao_exit(); +} + +static struct ao_task ao_btm_echo_task; + +static void +ao_btm_send(void) +{ +	int c; +	ao_btm_enable = 1; +	ao_add_task(&ao_btm_echo_task, ao_btm_do_echo, "btm-echo"); +	while ((c = getchar()) != '~') { +		ao_serial_btm_putchar(c); +	} +	ao_btm_enable = 0; +	ao_wakeup((void *) &ao_serial_btm_rx_fifo); +} +  __code struct ao_cmds ao_btm_cmds[] = {  	{ ao_btm_dump,		"d\0Dump btm buffer." },  	{ ao_btm_speed,		"s <19200,57600>\0Set btm serial speed." }, +	{ ao_btm_send,		"S\0BTM interactive mode. ~ to exit." },  	{ 0, NULL },  }; @@ -125,7 +167,7 @@ ao_btm_getchar(void)  	ao_arch_block_interrupts();  	while ((c = _ao_serial_btm_pollchar()) == AO_READ_AGAIN) {  		ao_alarm(AO_MS_TO_TICKS(10)); -		c = ao_sleep(&ao_serial_btm_rx_fifo); +		c = _ao_serial_btm_sleep();  		ao_clear_alarm();  		if (c) {  			c = AO_READ_AGAIN; @@ -146,6 +188,7 @@ ao_btm_get_line(void)  {  	uint8_t ao_btm_reply_len = 0;  	int c; +	uint8_t l;  	while ((c = ao_btm_getchar()) != AO_READ_AGAIN) {  		ao_btm_log_in_char(c); @@ -154,8 +197,8 @@ ao_btm_get_line(void)  		if (c == '\r' || c == '\n')  			break;  	} -	for (c = ao_btm_reply_len; c < sizeof (ao_btm_reply);) -		ao_btm_reply[c++] = '\0'; +	for (l = ao_btm_reply_len; l < sizeof (ao_btm_reply);) +		ao_btm_reply[l++] = '\0';  	return ao_btm_reply_len;  } @@ -214,7 +257,7 @@ ao_btm_string(__code char *cmd)  {  	char	c; -	while (c = *cmd++) +	while ((c = *cmd++) != '\0')  		ao_btm_putchar(c);  } @@ -256,6 +299,52 @@ ao_btm_try_speed(uint8_t speed)  	return 0;  } +#if BT_LINK_ON_P2 +#define BT_PICTL_ICON	PICTL_P2ICON +#define BT_PIFG		P2IFG +#define BT_PDIR		P2DIR +#define BT_PINP		P2INP +#define BT_IEN2_PIE	IEN2_P2IE +#define BT_CC1111	1 +#endif +#if BT_LINK_ON_P1 +#define BT_PICTL_ICON	PICTL_P1ICON +#define BT_PIFG		P1IFG +#define BT_PDIR		P1DIR +#define BT_PINP		P1INP +#define BT_IEN2_PIE	IEN2_P1IE +#define BT_CC1111	1 +#endif + +void +ao_btm_check_link() +{ +#if BT_CC1111 +	ao_arch_critical( +		/* Check the pin and configure the interrupt detector to wait for the +		 * pin to flip the other way +		 */ +		if (BT_LINK_PIN) { +			ao_btm_connected = 0; +			PICTL |= BT_PICTL_ICON; +		} else { +			ao_btm_connected = 1; +			PICTL &= ~BT_PICTL_ICON; +		} +		); +#else +	ao_arch_block_interrupts(); +	if (ao_gpio_get(AO_BTM_INT_PORT, AO_BTM_INT_PIN, AO_BTM_INT) == 0) { +		ao_btm_connected = 1; +	} else { +		ao_btm_connected = 0; +	} +	ao_arch_release_interrupts(); +#endif +} + +__xdata struct ao_task ao_btm_task; +  /*   * A thread to initialize the bluetooth device and   * hang around to blink the LED when connected @@ -298,6 +387,13 @@ ao_btm(void)  				    NULL);  	ao_btm_echo(0); +	/* Check current pin state */ +	ao_btm_check_link(); + +#ifdef AO_BTM_INT_PORT +	ao_exti_enable(AO_BTM_INT_PORT, AO_BTM_INT_PIN); +#endif +  	for (;;) {  		while (!ao_btm_connected)  			ao_sleep(&ao_btm_connected); @@ -308,40 +404,8 @@ ao_btm(void)  	}  } -__xdata struct ao_task ao_btm_task; - -#if BT_LINK_ON_P2 -#define BT_PICTL_ICON	PICTL_P2ICON -#define BT_PIFG		P2IFG -#define BT_PDIR		P2DIR -#define BT_PINP		P2INP -#define BT_IEN2_PIE	IEN2_P2IE -#endif -#if BT_LINK_ON_P1 -#define BT_PICTL_ICON	PICTL_P1ICON -#define BT_PIFG		P1IFG -#define BT_PDIR		P1DIR -#define BT_PINP		P1INP -#define BT_IEN2_PIE	IEN2_P1IE -#endif - -void -ao_btm_check_link() -{ -	ao_arch_critical( -		/* Check the pin and configure the interrupt detector to wait for the -		 * pin to flip the other way -		 */ -		if (BT_LINK_PIN) { -			ao_btm_connected = 0; -			PICTL |= BT_PICTL_ICON; -		} else { -			ao_btm_connected = 1; -			PICTL &= ~BT_PICTL_ICON; -		} -		); -} +#if BT_CC1111  void  ao_btm_isr(void)  #if BT_LINK_ON_P1 @@ -357,6 +421,16 @@ ao_btm_isr(void)  	}  	BT_PIFG = 0;  } +#endif + +#ifdef AO_BTM_INT_PORT +void +ao_btm_isr(void) +{ +	ao_btm_check_link(); +	ao_wakeup(&ao_btm_connected); +} +#endif  void  ao_btm_init (void) @@ -365,6 +439,18 @@ ao_btm_init (void)  	ao_serial_btm_set_speed(AO_SERIAL_SPEED_19200); +#ifdef AO_BTM_RESET_PORT +	ao_enable_output(AO_BTM_RESET_PORT,AO_BTM_RESET_PIN,AO_BTM_RESET,0); +#endif + +#ifdef AO_BTM_INT_PORT +	ao_enable_port(AO_BTM_INT_PORT); +	ao_exti_setup(AO_BTM_INT_PORT, AO_BTM_INT_PIN, +		      AO_EXTI_MODE_FALLING|AO_EXTI_MODE_RISING|AO_EXTI_PRIORITY_LOW, +		      ao_btm_isr); +#endif + +#if BT_CC1111  #if BT_LINK_ON_P1  	/*  	 * Configure ser reset line @@ -386,9 +472,7 @@ ao_btm_init (void)  	/* Enable interrupts */  	IEN2 |= BT_IEN2_PIE; - -	/* Check current pin state */ -	ao_btm_check_link(); +#endif  #if BT_LINK_ON_P2  	/* Eable the pin interrupt */  | 
