diff options
| author | Keith Packard <keithp@keithp.com> | 2011-08-01 17:08:24 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2011-08-27 12:45:36 -0700 | 
| commit | 4568bc796a6c362ebf7f72ee9a5fa4a9a3c4ba6a (patch) | |
| tree | ad4b2ed003afdb3bad61720c9400880ff7f0a005 /src | |
| parent | be117376179126824439d98379079025ca0b245a (diff) | |
altosui: Add primitive UI for TeleLaunch
Display status along with arm and fire buttons.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/ao_radio_cmac.c | 140 | 
1 files changed, 94 insertions, 46 deletions
diff --git a/src/ao_radio_cmac.c b/src/ao_radio_cmac.c index c2757b16..41fbbe1f 100644 --- a/src/ao_radio_cmac.c +++ b/src/ao_radio_cmac.c @@ -21,6 +21,7 @@  #define AO_CMAC_MAX_LEN		(128 - AO_CMAC_KEY_LEN)  static __xdata uint8_t ao_radio_cmac_mutex; +__pdata int16_t ao_radio_cmac_rssi;  static __xdata uint8_t cmac_data[AO_CMAC_MAX_LEN + AO_CMAC_KEY_LEN + 2 + AO_CMAC_KEY_LEN];  static __pdata uint8_t ao_radio_cmac_len; @@ -114,9 +115,12 @@ radio_cmac_recv(uint8_t len, uint16_t timeout) __reentrant  	i = ao_radio_recv(cmac_data, len + AO_CMAC_KEY_LEN + 2);  	ao_clear_alarm(); -	if (!i) +	if (!i) { +		ao_radio_cmac_rssi = 0;  		return AO_RADIO_CMAC_TIMEOUT; +	} +	ao_radio_cmac_rssi = (int16_t) (((int8_t) cmac_data[len + AO_CMAC_KEY_LEN]) >> 1) - 74;  	if (!(cmac_data[len + AO_CMAC_KEY_LEN +1] & PKT_APPEND_STATUS_1_CRC_OK))  		return AO_RADIO_CMAC_CRC_ERROR; @@ -221,33 +225,46 @@ radio_cmac_recv_cmd(void) __reentrant  		printf ("PACKET ");  		for (i = 0; i < len; i++)  			printf("%02x", cmac_data[i]); -		printf ("\n"); +		printf (" %d\n", ao_radio_cmac_rssi);  	} else -		printf ("ERROR %d\n", i); +		printf ("ERROR %d %d\n", i, ao_radio_cmac_rssi);  	ao_mutex_put(&ao_radio_cmac_mutex);  }  static __xdata struct ao_launch_command	command;  static __xdata struct ao_launch_query	query; +static pdata uint16_t	launch_serial; +static pdata uint8_t	launch_channel; +static pdata uint16_t	tick_offset; +static void +launch_args(void) __reentrant +{ +	ao_cmd_decimal(); +	launch_serial = ao_cmd_lex_i; +	ao_cmd_decimal(); +	launch_channel = ao_cmd_lex_i; +}  static int8_t -launch_query(uint16_t serial, uint8_t channel) +launch_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.serial = serial; +		command.serial = launch_serial;  		command.cmd = AO_LAUNCH_QUERY; -		command.channel = channel; +		command.channel = launch_channel;  		ao_radio_cmac_send(&command, sizeof (command));  		r = ao_radio_cmac_recv(&query, sizeof (query), AO_MS_TO_TICKS(500));  		if (r == AO_RADIO_CMAC_OK)  			break;  	} +	tick_offset -= query.tick;  	printf("\n"); flush();  	return r;  } @@ -255,17 +272,12 @@ launch_query(uint16_t serial, uint8_t channel)  static void  launch_report_cmd(void) __reentrant  { -	uint8_t		channel; -	uint16_t	serial;  	int8_t		r; -	ao_cmd_decimal(); -	serial = ao_cmd_lex_i; -	ao_cmd_decimal(); -	channel = ao_cmd_lex_i; +	launch_args();  	if (ao_cmd_status != ao_cmd_success)  		return; -	r = launch_query(serial, channel); +	r = launch_query();  	switch (r) {  	case AO_RADIO_CMAC_OK:  		if (query.valid) { @@ -273,24 +285,25 @@ launch_report_cmd(void) __reentrant  			case ao_igniter_ready:  			case ao_igniter_active:  				printf ("Armed: "); -				switch (query.igniter_status) { -				default: -					printf("unknown status\n"); -					break; -				case ao_igniter_ready: -					printf("igniter good\n"); -					break; -				case ao_igniter_open: -					printf("igniter bad\n"); -					break; -				}  				break;  			default: -				printf("Disarmed\n"); +				printf("Disarmed: "); +			} +			switch (query.igniter_status) { +			default: +				printf("unknown\n"); +				break; +			case ao_igniter_ready: +				printf("igniter good\n"); +				break; +			case ao_igniter_open: +				printf("igniter bad\n"); +				break;  			}  		} else { -			printf("Invalid channel %d\n", channel); +			printf("Invalid channel %d\n", launch_channel);  		} +		printf("Rssi: %d\n", ao_radio_cmac_rssi);  		break;  	default:  		printf("Error %d\n", r); @@ -299,55 +312,90 @@ launch_report_cmd(void) __reentrant  }  static void +launch_arm(void) __reentrant +{ +	command.tick = ao_time() - tick_offset; +	command.serial = launch_serial; +	command.cmd = AO_LAUNCH_ARM; +	command.channel = launch_channel; +	ao_radio_cmac_send(&command, sizeof (command)); +} + +static void +launch_ignite(void) __reentrant +{ +	command.tick = ao_time() - tick_offset; +	command.serial = launch_serial; +	command.cmd = AO_LAUNCH_FIRE; +	command.channel = 0; +	ao_radio_cmac_send(&command, sizeof (command)); +} + +static void  launch_fire_cmd(void) __reentrant  {  	static __xdata struct ao_launch_command	command; -	uint8_t		channel; -	uint16_t	serial;  	uint8_t		secs;  	uint8_t		i;  	int8_t		r; -	uint16_t	tick_offset; -	ao_cmd_decimal(); -	serial = ao_cmd_lex_i; -	ao_cmd_decimal(); -	channel = ao_cmd_lex_i; +	launch_args();  	ao_cmd_decimal();  	secs = ao_cmd_lex_i;  	if (ao_cmd_status != ao_cmd_success)  		return; -	tick_offset = ao_time(); -	r = launch_query(serial, channel); -	tick_offset -= query.tick; +	r = launch_query(); +	if (r != AO_RADIO_CMAC_OK) { +		printf("query failed %d\n", r); +		return; +	}  	for (i = 0; i < 4; i++) {  		printf("arm %d\n", i); flush(); -		command.tick = ao_time() - tick_offset; -		command.serial = serial; -		command.cmd = AO_LAUNCH_ARM; -		command.channel = channel; -		ao_radio_cmac_send(&command, sizeof (command)); +		launch_arm();  	} +  	secs = secs * 10 - 5;  	if (secs > 100)  		secs = 100;  	for (i = 0; i < secs; i++) {  		printf("fire %d\n", i); flush(); -		command.tick = ao_time() - tick_offset; -		command.serial = serial; -		command.cmd = AO_LAUNCH_FIRE; -		command.channel = 0; -		ao_radio_cmac_send(&command, sizeof (command)); +		launch_ignite();  		ao_delay(AO_MS_TO_TICKS(100));  	}  } +static void +launch_arm_cmd(void) __reentrant +{ +	uint8_t	i; +	int8_t  r; +	launch_args(); +	r = launch_query(); +	if (r != AO_RADIO_CMAC_OK) { +		printf("query failed %d\n", r); +		return; +	} +	for (i = 0; i < 4; i++) +		launch_arm(); +} + +static void +launch_ignite_cmd(void) __reentrant +{ +	uint8_t i; +	launch_args(); +	for (i = 0; i < 4; i++) +		launch_ignite(); +} +  static __code struct ao_cmds ao_radio_cmac_cmds[] = {  	{ radio_cmac_send_cmd,	"s <length>\0Send AES-CMAC packet. Bytes to send follow on next line" },  	{ radio_cmac_recv_cmd,	"S <length> <timeout>\0Receive AES-CMAC packet. Timeout in ms" },  	{ launch_report_cmd,    "l <serial> <channel>\0Get remote launch status" },  	{ launch_fire_cmd,	"f <serial> <channel> <secs>\0Fire remote igniter" }, +	{ launch_arm_cmd,	"a <serial> <channel>\0Arm remote igniter" }, +	{ launch_ignite_cmd,	"i <serial> <channel>\0Pulse remote igniter" },  	{ 0, NULL },  };  | 
