diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/ao_pyro.c | 120 | ||||
| -rw-r--r-- | src/test/Makefile | 2 | ||||
| -rw-r--r-- | src/test/ao_flight_test.c | 57 | 
3 files changed, 130 insertions, 49 deletions
| diff --git a/src/core/ao_pyro.c b/src/core/ao_pyro.c index aac8fda5..b655eaca 100644 --- a/src/core/ao_pyro.c +++ b/src/core/ao_pyro.c @@ -15,10 +15,12 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ +#ifndef AO_FLIGHT_TEST  #include <ao.h> -#include <ao_pyro.h>  #include <ao_sample.h>  #include <ao_flight.h> +#endif +#include <ao_pyro.h>  #if IS_COMPANION  #include <ao_companion.h> @@ -130,12 +132,13 @@ ao_pyro_ready(struct ao_pyro *pyro)  	return TRUE;  } +#ifndef AO_FLIGHT_TEST  #define ao_pyro_fire_port(port, bit, pin) do {	\  		ao_gpio_set(port, bit, pin, 1);	\  		ao_delay(AO_MS_TO_TICKS(50));	\  		ao_gpio_set(port, bit, pin, 0);	\  	} while (0) - +#endif  static void  ao_pyro_fire(uint8_t p) @@ -172,66 +175,58 @@ ao_pyro_fire(uint8_t p)  uint8_t	ao_pyro_wakeup; -static void -ao_pyro(void) +static uint8_t +ao_pyro_check(void)  { -	uint8_t		p, any_waiting;  	struct ao_pyro	*pyro; +	uint8_t		p, any_waiting; +	 +	any_waiting = 0; +	for (p = 0; p < AO_PYRO_NUM; p++) { +		pyro = &ao_config.pyro[p]; -	ao_config_get(); -	while (ao_flight_state < ao_flight_boost) -		ao_sleep(&ao_flight_state); - -	for (;;) { -		ao_alarm(AO_MS_TO_TICKS(100)); -		ao_sleep(&ao_pyro_wakeup); -		ao_clear_alarm(); -		any_waiting = 0; -		for (p = 0; p < AO_PYRO_NUM; p++) { -			pyro = &ao_config.pyro[p]; +		/* Ignore igniters which have already fired +		 */ +		if (pyro->fired) +			continue; -			/* Ignore igniters which have already fired -			 */ -			if (pyro->fired) -				continue; +		/* Ignore disabled igniters +		 */ +		if (!pyro->flags) +			continue; -			/* Ignore disabled igniters -			 */ -			if (!pyro->flags) +		any_waiting = 1; +		/* Check pyro state to see if it should fire +		 */ +		if (!pyro->delay_done) { +			if (!ao_pyro_ready(pyro))  				continue; -			any_waiting = 1; -			/* Check pyro state to see if it shoule fire +			/* If there's a delay set, then remember when +			 * it expires  			 */ -			if (!pyro->delay_done) { -				if (!ao_pyro_ready(pyro)) -					continue; - -				/* If there's a delay set, then remember when -				 * it expires -				 */ -				if (pyro->flags & ao_pyro_delay) -					pyro->delay_done = ao_time() + pyro->delay; -			} - -			/* Check to see if we're just waiting for -			 * the delay to expire -			 */ -			if (pyro->delay_done) { -				if ((int16_t) (ao_time() - pyro->delay_done) < 0) -					continue; +			if (pyro->flags & ao_pyro_delay) { +				pyro->delay_done = ao_time() + pyro->delay; +				if (!pyro->delay_done) +					pyro->delay_done = 1;  			} +		} -			ao_pyro_fire(p); +		/* Check to see if we're just waiting for +		 * the delay to expire +		 */ +		if (pyro->delay_done) { +			if ((int16_t) (ao_time() - pyro->delay_done) < 0) +				continue;  		} -		if (!any_waiting) -			break; + +		ao_pyro_fire(p); +		pyro->fired = 1; +		ao_pyro_fired |= (1 << p);  	} -	ao_exit(); +	return any_waiting;  } -__xdata struct ao_task ao_pyro_task; -  #define NO_VALUE	0xff  #define AO_PYRO_NAME_LEN	3 @@ -283,6 +278,34 @@ const struct {  	{ "", ao_pyro_none,		NO_VALUE, HELP(NULL) },  }; +#define NUM_PYRO_VALUES (sizeof ao_pyro_values / sizeof ao_pyro_values[0]) + +#ifndef AO_FLIGHT_TEST +static void +ao_pyro(void) +{ +	uint8_t		any_waiting; + +	ao_config_get(); +	while (ao_flight_state < ao_flight_boost) +		ao_sleep(&ao_flight_state); + +	for (;;) { +		ao_alarm(AO_MS_TO_TICKS(100)); +		ao_sleep(&ao_pyro_wakeup); +		ao_clear_alarm(); +		if (ao_flight_state >= ao_flight_landed) +			break; +		any_waiting = ao_pyro_check(); +		if (!any_waiting) +			break; +	} +	ao_exit(); +} + +__xdata struct ao_task ao_pyro_task; + +  static void  ao_pyro_print_name(uint8_t v)  { @@ -449,3 +472,4 @@ ao_pyro_init(void)  	ao_cmd_register(&ao_pyro_cmds[0]);  	ao_add_task(&ao_pyro_task, ao_pyro, "pyro");  } +#endif diff --git a/src/test/Makefile b/src/test/Makefile index 8032a163..3c9ac9c6 100644 --- a/src/test/Makefile +++ b/src/test/Makefile @@ -29,7 +29,7 @@ ao_flight_test_baro: ao_flight_test.c ao_host.h ao_flight.c  ao_sample.c ao_kalm  ao_flight_test_accel: ao_flight_test.c ao_host.h ao_flight.c  ao_sample.c ao_kalman.c $(INCS)  	cc $(CFLAGS) -o $@ -DFORCE_ACCEL=1 ao_flight_test.c -ao_flight_test_mm: ao_flight_test.c ao_host.h ao_flight.c ao_sample.c ao_kalman.c $(INCS) +ao_flight_test_mm: ao_flight_test.c ao_host.h ao_flight.c ao_sample.c ao_kalman.c ao_pyro.c ao_pyro.h $(INCS)  	cc -DTELEMEGA=1 $(CFLAGS) -o $@ $< -lm  ao_gps_test: ao_gps_test.c ao_gps_sirf.c ao_gps_print.c ao_host.h diff --git a/src/test/ao_flight_test.c b/src/test/ao_flight_test.c index 99bed7ee..6e53d8e1 100644 --- a/src/test/ao_flight_test.c +++ b/src/test/ao_flight_test.c @@ -20,6 +20,7 @@  #include <stdint.h>  #include <stdio.h>  #include <stdlib.h> +#include <stddef.h>  #include <string.h>  #include <getopt.h>  #include <math.h> @@ -137,6 +138,18 @@ int	tick_offset;  static int32_t	ao_k_height; +int16_t +ao_time(void) +{ +	return ao_data_static.tick; +} + +void +ao_delay(int16_t interval) +{ +	return; +} +  void  ao_ignite(enum ao_igniter igniter)  { @@ -200,6 +213,8 @@ struct ao_cmds {  #include <ao_ms5607.h>  struct ao_ms5607_prom	ms5607_prom;  #include "ao_ms5607_convert.c" +#define AO_PYRO_NUM	4 +#include <ao_pyro.h>  #else  #include "ao_convert.c"  #endif @@ -210,6 +225,9 @@ struct ao_config {  	int16_t		accel_minus_g;  	uint8_t		pad_orientation;  	uint16_t	apogee_lockout; +#if TELEMEGA +	struct ao_pyro	pyro[AO_PYRO_NUM];	/* minor version 12 */ +#endif  };  #define AO_PAD_ORIENTATION_ANTENNA_UP	0 @@ -246,6 +264,24 @@ uint16_t	prev_tick;  #include "ao_sqrt.c"  #include "ao_sample.c"  #include "ao_flight.c" +#if TELEMEGA +#define AO_PYRO_NUM	4 + +#define AO_PYRO_0	0 +#define AO_PYRO_1	1 +#define AO_PYRO_2	2 +#define AO_PYRO_3	3 + +static void +ao_pyro_tell(int pin) +{ +	printf ("fire pyro %d\n", pin); +} + +#define ao_pyro_fire_port(port,bit,pin) ao_pyro_tell(pin) + +#include "ao_pyro.c" +#endif  #define to_double(f)	((f) / 65536.0) @@ -771,6 +807,10 @@ ao_sleep(void *wchan)  		char		*words[64];  		int		nword; +#if TELEMEGA +		if (ao_flight_state >= ao_flight_boost && ao_flight_state < ao_flight_landed) +			ao_pyro_check(); +#endif  		for (;;) {  			if (ao_records_read > 2 && ao_flight_state == ao_flight_startup)  			{ @@ -883,6 +923,23 @@ ao_sleep(void *wchan)  				else if (strcmp(words[1], "crc:") == 0)  					ms5607_prom.crc = strtoul(words[2], NULL, 10);  				continue; +			} else if (nword >= 3 && strcmp(words[0], "Pyro") == 0) { +				int	p = strtoul(words[1], NULL, 10); +				int	i, j; +				struct ao_pyro	*pyro = &ao_config.pyro[p]; + +				for (i = 2; i < nword; i++) { +					for (j = 0; j < NUM_PYRO_VALUES; j++) +						if (!strcmp (words[2], ao_pyro_values[j].name)) +							break; +					if (j == NUM_PYRO_VALUES) +						continue; +					pyro->flags |= ao_pyro_values[j].flag; +					if (ao_pyro_values[j].offset != NO_VALUE && i + 1 < nword) { +						int16_t	val = strtoul(words[++i], NULL, 10); +						*((int16_t *) ((char *) pyro + ao_pyro_values[j].offset)) = val; +					} +				}  			}  #else  			if (nword == 4 && log_format != AO_LOG_FORMAT_TELEMEGA) { | 
