diff options
| -rw-r--r-- | src/ao_launch.c | 44 | ||||
| -rw-r--r-- | src/ao_radio_cmac.c | 101 | ||||
| -rw-r--r-- | src/core/ao_config.c | 2 | 
3 files changed, 111 insertions, 36 deletions
diff --git a/src/ao_launch.c b/src/ao_launch.c index 6c154719..35afbda8 100644 --- a/src/ao_launch.c +++ b/src/ao_launch.c @@ -19,6 +19,12 @@  __xdata uint16_t ao_launch_ignite; +#if 0 +#define PRINTD(...) printf(__VA_ARGS__) +#else +#define PRINTD(...)  +#endif +  static void  ao_launch_run(void)  { @@ -71,19 +77,20 @@ ao_launch(void)  	ao_led_off(AO_LED_RED);  	ao_beep_for(AO_BEEP_MID, AO_MS_TO_TICKS(200));  	for (;;) { +		flush();  		if (ao_radio_cmac_recv(&command, sizeof (command), 0) != AO_RADIO_CMAC_OK)  			continue; -		printf ("tick %d serial %d cmd %d channel %d\n", +		PRINTD ("tick %d serial %d cmd %d channel %d\n",  			command.tick, command.serial, command.cmd, command.channel); -		if (command.serial != ao_serial_number) { -			printf ("serial number mismatch\n"); -			continue; -		} -  		switch (command.cmd) {  		case AO_LAUNCH_QUERY: +			if (command.serial != ao_serial_number) { +				PRINTD ("serial number mismatch\n"); +				break; +			} +  			if (command.channel == 0) {  				query.valid = 1;  				query.arm_status = ao_igniter_status(ao_igniter_drogue); @@ -94,35 +101,38 @@ ao_launch(void)  			query.tick = ao_time();  			query.serial = ao_serial_number;  			query.channel = command.channel; -			printf ("query tick %d serial %d channel %d valid %d arm %d igniter %d\n", +			PRINTD ("query tick %d serial %d channel %d valid %d arm %d igniter %d\n",  				query.tick, query.serial, query.channel, query.valid, query.arm_status,  				query.igniter_status);  			ao_radio_cmac_send(&query, sizeof (query));  			break;  		case AO_LAUNCH_ARM: +			if (command.serial != ao_serial_number) { +				PRINTD ("serial number mismatch\n"); +				break; +			} +  			if (command.channel != 0)  				break;  			time_difference = command.tick - ao_time(); -			printf ("arm tick %d local tick %d\n", command.tick, ao_time()); +			PRINTD ("arm tick %d local tick %d\n", command.tick, ao_time());  			if (time_difference < 0)  				time_difference = -time_difference;  			if (time_difference > 10) { -				printf ("time difference too large %d\n", time_difference); +				PRINTD ("time difference too large %d\n", time_difference);  				break;  			} -			printf ("armed\n"); +			PRINTD ("armed\n");  			ao_launch_armed = 1;  			ao_launch_arm_time = ao_time();  			break;  		case AO_LAUNCH_FIRE: -			if (command.channel != 0) -				break;  			if (!ao_launch_armed) { -				printf ("not armed\n"); +				PRINTD ("not armed\n");  				break;  			} -			if ((uint16_t) (ao_launch_arm_time - ao_time()) > AO_SEC_TO_TICKS(20)) { -				printf ("late launch arm_time %d time %d\n", +			if ((uint16_t) (ao_time() - ao_launch_arm_time) > AO_SEC_TO_TICKS(20)) { +				PRINTD ("late launch arm_time %d time %d\n",  					ao_launch_arm_time, ao_time());  				break;  			} @@ -130,10 +140,10 @@ ao_launch(void)  			if (time_difference < 0)  				time_difference = -time_difference;  			if (time_difference > 10) { -				printf ("time different too large %d\n", time_difference); +				PRINTD ("time different too large %d\n", time_difference);  				break;  			} -			printf ("ignite\n"); +			PRINTD ("ignite\n");  			ao_launch_ignite = 1;  			ao_wakeup(&ao_launch_ignite);  			break; diff --git a/src/ao_radio_cmac.c b/src/ao_radio_cmac.c index 9694b5b3..c2757b16 100644 --- a/src/ao_radio_cmac.c +++ b/src/ao_radio_cmac.c @@ -227,14 +227,37 @@ radio_cmac_recv_cmd(void) __reentrant  	ao_mutex_put(&ao_radio_cmac_mutex);  } +static __xdata struct ao_launch_command	command; +static __xdata struct ao_launch_query	query; + + +static int8_t +launch_query(uint16_t serial, uint8_t channel) +{ +	uint8_t	i; +	int8_t	r = AO_RADIO_CMAC_OK; + +	for (i = 0; i < 10; i++) { +		printf ("."); flush(); +		command.tick = ao_time(); +		command.serial = serial; +		command.cmd = AO_LAUNCH_QUERY; +		command.channel = 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; +	} +	printf("\n"); flush(); +	return r; +} +  static void  launch_report_cmd(void) __reentrant  { -	static __xdata struct ao_launch_command	command; -	static __xdata struct ao_launch_query	query;  	uint8_t		channel;  	uint16_t	serial; -	uint8_t		i; +	int8_t		r;  	ao_cmd_decimal();  	serial = ao_cmd_lex_i; @@ -242,17 +265,10 @@ launch_report_cmd(void) __reentrant  	channel = ao_cmd_lex_i;  	if (ao_cmd_status != ao_cmd_success)  		return; -	flush(); -	for (i = 0; i < 10; i++) { -		printf ("."); flush(); -		command.tick = 0; -		command.serial = serial; -		command.cmd = AO_LAUNCH_QUERY; -		command.channel = channel; -		ao_radio_cmac_send(&command, sizeof (command)); -		switch (ao_radio_cmac_recv(&query, sizeof (query), AO_MS_TO_TICKS(500))) { -		case AO_RADIO_CMAC_OK: -			printf("\n"); +	r = launch_query(serial, channel); +	switch (r) { +	case AO_RADIO_CMAC_OK: +		if (query.valid) {  			switch (query.arm_status) {  			case ao_igniter_ready:  			case ao_igniter_active: @@ -268,21 +284,70 @@ launch_report_cmd(void) __reentrant  					printf("igniter bad\n");  					break;  				} +				break;  			default:  				printf("Disarmed\n");  			} -			return; -		default: -			continue; +		} else { +			printf("Invalid channel %d\n", channel);  		} +		break; +	default: +		printf("Error %d\n", r); +		break; +	} +} + +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; +	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; + +	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)); +	} +	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)); +		ao_delay(AO_MS_TO_TICKS(100));  	} -	printf ("Timeout\n");  }  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" },  	{ 0, NULL },  }; diff --git a/src/core/ao_config.c b/src/core/ao_config.c index 7f999feb..28854ab5 100644 --- a/src/core/ao_config.c +++ b/src/core/ao_config.c @@ -108,7 +108,7 @@ _ao_config_get(void)  		if (ao_config.minor < 8)  			ao_config.radio_enable = TRUE;  		if (ao_config.minor < 9) -			memset(&ao_config.aes_key, '\0', AO_AES_LEN); +			memset(&ao_config.aes_key, 0, AO_AES_LEN);  		ao_config.minor = AO_CONFIG_MINOR;  		ao_config_dirty = 1;  	}  | 
