diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/ao_log.h | 6 | ||||
| -rw-r--r-- | src/core/ao_pyro.c | 19 | ||||
| -rw-r--r-- | src/core/ao_pyro.h | 4 | 
3 files changed, 28 insertions, 1 deletions
| diff --git a/src/core/ao_log.h b/src/core/ao_log.h index eaaca444..4eaed420 100644 --- a/src/core/ao_log.h +++ b/src/core/ao_log.h @@ -197,15 +197,18 @@ struct ao_log_mega {  	uint8_t			csum;			/* 1 */  	uint16_t		tick;			/* 2 */  	union {						/* 4 */ +		/* AO_LOG_FLIGHT */  		struct {  			uint16_t	flight;		/* 4 */  			int16_t		ground_accel;	/* 6 */  			uint32_t	ground_pres;	/* 8 */  		} flight;				/* 12 */ +		/* AO_LOG_STATE */  		struct {  			uint16_t	state;  			uint16_t	reason;  		} state; +		/* AO_LOG_SENSOR */  		struct {  			uint32_t	pres;		/* 4 */  			uint32_t	temp;		/* 8 */ @@ -220,12 +223,14 @@ struct ao_log_mega {  			int16_t		mag_z;		/* 28 */  			int16_t		accel;		/* 30 */  		} sensor;	/* 32 */ +		/* AO_LOG_TEMP_VOLT */  		struct {  			int16_t		v_batt;		/* 4 */  			int16_t		v_pbatt;	/* 6 */  			int16_t		n_sense;	/* 8 */  			int16_t		sense[10];	/* 10 */  		} volt;					/* 30 */ +		/* AO_LOG_GPS_TIME */  		struct {  			int32_t		latitude;	/* 4 */  			int32_t		longitude;	/* 8 */ @@ -239,6 +244,7 @@ struct ao_log_mega {  			uint8_t		day;		/* 20 */  			uint8_t		pad;		/* 21 */  		} gps;	/* 22 */ +		/* AO_LOG_GPS_SAT */  		struct {  			uint16_t	channels;	/* 4 */  			struct { diff --git a/src/core/ao_pyro.c b/src/core/ao_pyro.c index 4f37e979..aac8fda5 100644 --- a/src/core/ao_pyro.c +++ b/src/core/ao_pyro.c @@ -113,6 +113,15 @@ ao_pyro_ready(struct ao_pyro *pyro)  			/* handled separately */  			continue; +		case ao_pyro_state_less: +			if (ao_flight_state < pyro->state_less) +				continue; +			break; +		case ao_pyro_state_greater_or_equal: +			if (ao_flight_state >= pyro->state_greater_or_equal) +				continue; +			break; +  		default:  			continue;  		} @@ -166,7 +175,7 @@ uint8_t	ao_pyro_wakeup;  static void  ao_pyro(void)  { -	uint8_t		p; +	uint8_t		p, any_waiting;  	struct ao_pyro	*pyro;  	ao_config_get(); @@ -177,6 +186,7 @@ ao_pyro(void)  		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]; @@ -190,6 +200,7 @@ ao_pyro(void)  			if (!pyro->flags)  				continue; +			any_waiting = 1;  			/* Check pyro state to see if it shoule fire  			 */  			if (!pyro->delay_done) { @@ -213,7 +224,10 @@ ao_pyro(void)  			ao_pyro_fire(p);  		} +		if (!any_waiting) +			break;  	} +	ao_exit();  }  __xdata struct ao_task ao_pyro_task; @@ -257,6 +271,9 @@ const struct {  	{ "t<",	ao_pyro_time_less,	offsetof(struct ao_pyro, time_less), HELP("time less (s * 100)") },  	{ "t>",	ao_pyro_time_greater,	offsetof(struct ao_pyro, time_greater), HELP("time greater (s * 100)")  }, +	{ "f<",	ao_pyro_state_less,	offsetof(struct ao_pyro, state_less), HELP("state less") }, +	{ "f>=",ao_pyro_state_greater_or_equal,	offsetof(struct ao_pyro, state_greater_or_equal), HELP("state greater or equal")  }, +  	{ "A", ao_pyro_ascending,	NO_VALUE, HELP("ascending") },  	{ "D", ao_pyro_descending,	NO_VALUE, HELP("descending") }, diff --git a/src/core/ao_pyro.h b/src/core/ao_pyro.h index 5deb69d0..cde850ad 100644 --- a/src/core/ao_pyro.h +++ b/src/core/ao_pyro.h @@ -42,6 +42,9 @@ enum ao_pyro_flag {  	ao_pyro_after_motor		= 0x00001000,  	ao_pyro_delay			= 0x00002000, + +	ao_pyro_state_less		= 0x00004000, +	ao_pyro_state_greater_or_equal  = 0x00008000,  };  struct ao_pyro { @@ -52,6 +55,7 @@ struct ao_pyro {  	int16_t			orient_less, orient_greater;  	int16_t			time_less, time_greater;  	int16_t			delay; +	uint8_t			state_less, state_greater_or_equal;  	int16_t			motor;  	uint16_t		delay_done;  	uint8_t			fired; | 
