diff options
Diffstat (limited to 'src/drivers/ao_lco_cmd.c')
| -rw-r--r-- | src/drivers/ao_lco_cmd.c | 113 | 
1 files changed, 52 insertions, 61 deletions
| diff --git a/src/drivers/ao_lco_cmd.c b/src/drivers/ao_lco_cmd.c index b49c9dba..9c35b324 100644 --- a/src/drivers/ao_lco_cmd.c +++ b/src/drivers/ao_lco_cmd.c @@ -18,70 +18,81 @@  #include <ao.h>  #include <ao_pad.h>  #include <ao_lco_cmd.h> +#include <ao_lco_func.h>  #include <ao_radio_cmac.h> -static __xdata struct ao_pad_command	command; -static __xdata struct ao_pad_query	query; -static __pdata uint16_t	launch_box; -static __pdata uint8_t	launch_channels; +static __pdata uint16_t	lco_box; +static __pdata uint8_t	lco_channels;  static __pdata uint16_t	tick_offset;  static void -launch_args(void) __reentrant +lco_args(void) __reentrant  {  	ao_cmd_decimal(); -	launch_box = ao_cmd_lex_i; +	lco_box = ao_cmd_lex_i;  	ao_cmd_hex(); -	launch_channels = ao_cmd_lex_i; +	lco_channels = ao_cmd_lex_i;  } +static struct ao_pad_query	ao_pad_query; +static uint16_t			tick_offset; +  static int8_t -launch_query(void) +lco_query(void)  {  	uint8_t	i;  	int8_t	r = AO_RADIO_CMAC_OK; -	tick_offset = ao_time();  	for (i = 0; i < 10; i++) {  		printf ("."); flush(); -		command.tick = ao_time(); -		command.box = launch_box; -		command.cmd = AO_LAUNCH_QUERY; -		command.channels = launch_channels; -		ao_radio_cmac_send(&command, sizeof (command)); -		r = ao_radio_cmac_recv(&query, sizeof (query), AO_MS_TO_TICKS(500)); +		r = ao_lco_query(lco_box, &ao_pad_query, &tick_offset);  		if (r == AO_RADIO_CMAC_OK)  			break;  	} -	tick_offset -= query.tick;  	printf("\n"); flush();  	return r;  }  static void -launch_report_cmd(void) __reentrant +lco_arm(void) +{ +	ao_lco_arm(lco_box, lco_channels, tick_offset); +} + +static void +lco_ignite(void) +{ +	ao_lco_ignite(lco_box, lco_channels, tick_offset); +} + +static void +lco_report_cmd(void) __reentrant  {  	int8_t		r;  	uint8_t		c; -	launch_args(); +	lco_args();  	if (ao_cmd_status != ao_cmd_success)  		return; -	r = launch_query(); +	r = lco_query();  	switch (r) {  	case AO_RADIO_CMAC_OK: -		switch (query.arm_status) { -		case ao_igniter_ready: -		case ao_igniter_active: +		switch (ao_pad_query.arm_status) { +		case AO_PAD_ARM_STATUS_ARMED:  			printf ("Armed: ");  			break; -		default: +		case AO_PAD_ARM_STATUS_DISARMED:  			printf("Disarmed: "); +			break; +		case AO_PAD_ARM_STATUS_UNKNOWN: +		default: +			printf("Unknown: "); +			break;  		}  		for (c = 0; c < AO_PAD_MAX_CHANNELS; c++) { -			if (query.channels & (1 << c)) { +			if (ao_pad_query.channels & (1 << c)) {  				printf (" pad %d ", c); -				switch (query.igniter_status[c]) { +				switch (ao_pad_query.igniter_status[c]) {  				default:  					printf("unknown, ");  					break; @@ -106,39 +117,19 @@ launch_report_cmd(void) __reentrant  }  static void -launch_arm(void) __reentrant -{ -	command.tick = ao_time() - tick_offset; -	command.box = launch_box; -	command.cmd = AO_LAUNCH_ARM; -	command.channels = launch_channels; -	ao_radio_cmac_send(&command, sizeof (command)); -} - -static void -launch_ignite(void) __reentrant -{ -	command.tick = ao_time() - tick_offset; -	command.box = launch_box; -	command.cmd = AO_LAUNCH_FIRE; -	command.channels = 0; -	ao_radio_cmac_send(&command, sizeof (command)); -} - -static void -launch_fire_cmd(void) __reentrant +lco_fire_cmd(void) __reentrant  {  	static __xdata struct ao_pad_command	command;  	uint8_t		secs;  	uint8_t		i;  	int8_t		r; -	launch_args(); +	lco_args();  	ao_cmd_decimal();  	secs = ao_cmd_lex_i;  	if (ao_cmd_status != ao_cmd_success)  		return; -	r = launch_query(); +	r = lco_query();  	if (r != AO_RADIO_CMAC_OK) {  		printf("query failed %d\n", r);  		return; @@ -146,7 +137,7 @@ launch_fire_cmd(void) __reentrant  	for (i = 0; i < 4; i++) {  		printf("arm %d\n", i); flush(); -		launch_arm(); +		lco_arm();  	}  	secs = secs * 10 - 5; @@ -154,40 +145,40 @@ launch_fire_cmd(void) __reentrant  		secs = 100;  	for (i = 0; i < secs; i++) {  		printf("fire %d\n", i); flush(); -		launch_ignite(); +		lco_ignite();  		ao_delay(AO_MS_TO_TICKS(100));  	}  }  static void -launch_arm_cmd(void) __reentrant +lco_arm_cmd(void) __reentrant  {  	uint8_t	i;  	int8_t  r; -	launch_args(); -	r = launch_query(); +	lco_args(); +	r = lco_query();  	if (r != AO_RADIO_CMAC_OK) {  		printf("query failed %d\n", r);  		return;  	}  	for (i = 0; i < 4; i++) -		launch_arm(); +		lco_arm();  }  static void -launch_ignite_cmd(void) __reentrant +lco_ignite_cmd(void) __reentrant  {  	uint8_t i; -	launch_args(); +	lco_args();  	for (i = 0; i < 4; i++) -		launch_ignite(); +		lco_ignite();  }  static __code struct ao_cmds ao_lco_cmds[] = { -	{ launch_report_cmd,    "l <box> <channel>\0Get remote launch status" }, -	{ launch_fire_cmd,	"F <box> <channel> <secs>\0Fire remote igniter" }, -	{ launch_arm_cmd,	"a <box> <channel>\0Arm remote igniter" }, -	{ launch_ignite_cmd,	"i <box> <channel>\0Pulse remote igniter" }, +	{ lco_report_cmd,	"l <box> <channel>\0Get remote status" }, +	{ lco_fire_cmd,		"F <box> <channel> <secs>\0Fire remote igniters" }, +	{ lco_arm_cmd,		"a <box> <channel>\0Arm remote igniter" }, +	{ lco_ignite_cmd,	"i <box> <channel>\0Pulse remote igniter" },  	{ 0, NULL },  }; | 
