diff options
| -rw-r--r-- | src/core/ao_radio_cmac_cmd.c | 104 | ||||
| -rw-r--r-- | src/core/ao_radio_cmac_cmd.h | 24 | ||||
| -rw-r--r-- | src/drivers/ao_lco_cmd.c | 74 | 
3 files changed, 128 insertions, 74 deletions
| diff --git a/src/core/ao_radio_cmac_cmd.c b/src/core/ao_radio_cmac_cmd.c new file mode 100644 index 00000000..64410921 --- /dev/null +++ b/src/core/ao_radio_cmac_cmd.c @@ -0,0 +1,104 @@ +/* + * Copyright © 2012 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include <ao.h> +#include <ao_radio_cmac_cmd.h> +#include <ao_radio_cmac.h> + +static __xdata uint8_t cmac_data[AO_CMAC_MAX_LEN]; + +static uint8_t +getnibble(void) +{ +	int8_t	b; + +	b = ao_cmd_hexchar(getchar()); +	if (b < 0) { +		ao_cmd_status = ao_cmd_lex_error; +		return 0; +	} +	return (uint8_t) b; +} + +static uint8_t +getbyte(void) +{ +	uint8_t	b; +	b = getnibble() << 4; +	b |= getnibble(); +	return b; +} +	 +static void +radio_cmac_send_cmd(void) __reentrant +{ +	uint8_t	i; +	uint8_t	len; + +	ao_cmd_decimal(); +	if (ao_cmd_status != ao_cmd_success) +		return; +	len = ao_cmd_lex_i; +	if (len > AO_CMAC_MAX_LEN) { +		ao_cmd_status = ao_cmd_syntax_error; +		return; +	} +	flush(); +	len = ao_cmd_lex_i; +	for (i = 0; i < len; i++) { +		cmac_data[i] = getbyte(); +		if (ao_cmd_status != ao_cmd_success) +			return; +	} +	ao_radio_cmac_send(cmac_data, len); +} + +static void +radio_cmac_recv_cmd(void) __reentrant +{ +	uint8_t		len, i; +	uint16_t	timeout; + +	ao_cmd_decimal(); +	if (ao_cmd_status != ao_cmd_success) +		return; +	len = ao_cmd_lex_i; +	ao_cmd_decimal(); +	if (ao_cmd_status != ao_cmd_success) +		return; +	timeout = AO_MS_TO_TICKS(ao_cmd_lex_i); +	i = ao_radio_cmac_recv(cmac_data, len, timeout); +	if (i == AO_RADIO_CMAC_OK) { +		printf ("PACKET "); +		for (i = 0; i < len; i++) +			printf("%02x", cmac_data[i]); +		printf (" %d\n", ao_radio_cmac_rssi); +	} else +		printf ("ERROR %d %d\n", i, ao_radio_cmac_rssi); +} + +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" }, +	{ 0, NULL }, +}; + +void +ao_radio_cmac_cmd_init(void) +{ +	ao_cmd_register(&ao_radio_cmac_cmds[0]); +} diff --git a/src/core/ao_radio_cmac_cmd.h b/src/core/ao_radio_cmac_cmd.h new file mode 100644 index 00000000..6b8782de --- /dev/null +++ b/src/core/ao_radio_cmac_cmd.h @@ -0,0 +1,24 @@ +/* + * Copyright © 2012 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#ifndef _AO_RADIO_CMAC_CMD_H_ +#define _AO_RADIO_CMAC_CMD_H_ + +void +ao_radio_cmac_cmd_init(void); + +#endif /* _AO_RADIO_CMAC_CMD_H_ */ diff --git a/src/drivers/ao_lco_cmd.c b/src/drivers/ao_lco_cmd.c index 3fe0d9cc..cce7a259 100644 --- a/src/drivers/ao_lco_cmd.c +++ b/src/drivers/ao_lco_cmd.c @@ -177,81 +177,7 @@ launch_ignite_cmd(void) __reentrant  		launch_ignite();  } -static uint8_t -getnibble(void) -{ -	int8_t	b; - -	b = ao_cmd_hexchar(getchar()); -	if (b < 0) { -		ao_cmd_status = ao_cmd_lex_error; -		return 0; -	} -	return (uint8_t) b; -} - -static uint8_t -getbyte(void) -{ -	uint8_t	b; -	b = getnibble() << 4; -	b |= getnibble(); -	return b; -} -	 -static __xdata uint8_t cmac_data[AO_CMAC_MAX_LEN]; - -static void -radio_cmac_send_cmd(void) __reentrant -{ -	uint8_t	i; -	uint8_t	len; - -	ao_cmd_decimal(); -	if (ao_cmd_status != ao_cmd_success) -		return; -	len = ao_cmd_lex_i; -	if (len > AO_CMAC_MAX_LEN) { -		ao_cmd_status = ao_cmd_syntax_error; -		return; -	} -	flush(); -	len = ao_cmd_lex_i; -	for (i = 0; i < len; i++) { -		cmac_data[i] = getbyte(); -		if (ao_cmd_status != ao_cmd_success) -			return; -	} -	ao_radio_cmac_send(cmac_data, len); -} - -static void -radio_cmac_recv_cmd(void) __reentrant -{ -	uint8_t		len, i; -	uint16_t	timeout; - -	ao_cmd_decimal(); -	if (ao_cmd_status != ao_cmd_success) -		return; -	len = ao_cmd_lex_i; -	ao_cmd_decimal(); -	if (ao_cmd_status != ao_cmd_success) -		return; -	timeout = AO_MS_TO_TICKS(ao_cmd_lex_i); -	i = ao_radio_cmac_recv(cmac_data, len, timeout); -	if (i == AO_RADIO_CMAC_OK) { -		printf ("PACKET "); -		for (i = 0; i < len; i++) -			printf("%02x", cmac_data[i]); -		printf (" %d\n", ao_radio_cmac_rssi); -	} else -		printf ("ERROR %d %d\n", i, ao_radio_cmac_rssi); -} -  static __code struct ao_cmds ao_lco_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" }, | 
