diff options
| author | Bdale Garbee <bdale@gag.com> | 2014-09-09 23:28:39 -0600 | 
|---|---|---|
| committer | Bdale Garbee <bdale@gag.com> | 2014-09-09 23:28:39 -0600 | 
| commit | 16405fd3eb6f82ef3a709e3ed30fc48faef7b547 (patch) | |
| tree | c111819b3ba0c9357af41c81b798326b9df7adad /src/kernel/ao_pyro.c | |
| parent | 5a2f6ed6210844f7284fbf9f7ecba68c8a14fa52 (diff) | |
| parent | 28bd5057252e61bc5b1a35a00bc1f9fdfde097f7 (diff) | |
Merge branch 'branch-1.5' into debian
Conflicts:
	ChangeLog
	Releasing
	altosui/Instdrv/NSIS/Includes/java.nsh
	altosui/altos-windows.nsi.in
	configure.ac
	doc/Makefile
	doc/altusmetrum.xsl
	micropeak/micropeak-windows.nsi.in
	telegps/telegps-windows.nsi.in
Diffstat (limited to 'src/kernel/ao_pyro.c')
| -rw-r--r-- | src/kernel/ao_pyro.c | 59 | 
1 files changed, 52 insertions, 7 deletions
| diff --git a/src/kernel/ao_pyro.c b/src/kernel/ao_pyro.c index 85d88d98..3044d565 100644 --- a/src/kernel/ao_pyro.c +++ b/src/kernel/ao_pyro.c @@ -69,6 +69,16 @@ ao_pyro_print_status(void)  uint16_t	ao_pyro_fired; +#ifndef PYRO_DBG +#define PYRO_DBG	0 +#endif + +#if PYRO_DBG +#define DBG(...)	do { printf("\t%d: ", (int) (pyro - ao_config.pyro)); printf(__VA_ARGS__); } while (0) +#else +#define DBG(...) +#endif +  /*   * Given a pyro structure, figure out   * if the current flight state satisfies all @@ -88,63 +98,73 @@ ao_pyro_ready(struct ao_pyro *pyro)  		case ao_pyro_accel_less:  			if (ao_accel <= pyro->accel_less)  				continue; +			DBG("accel %d > %d\n", ao_accel, pyro->accel_less);  			break;  		case ao_pyro_accel_greater:  			if (ao_accel >= pyro->accel_greater)  				continue; +			DBG("accel %d < %d\n", ao_accel, pyro->accel_greater);  			break; - -  		case ao_pyro_speed_less:  			if (ao_speed <= pyro->speed_less)  				continue; +			DBG("speed %d > %d\n", ao_speed, pyro->speed_less);  			break;  		case ao_pyro_speed_greater:  			if (ao_speed >= pyro->speed_greater)  				continue; +			DBG("speed %d < %d\n", ao_speed, pyro->speed_greater);  			break; -  		case ao_pyro_height_less:  			if (ao_height <= pyro->height_less)  				continue; +			DBG("height %d > %d\n", ao_height, pyro->height_less);  			break;  		case ao_pyro_height_greater:  			if (ao_height >= pyro->height_greater)  				continue; +			DBG("height %d < %d\n", ao_height, pyro->height_greater);  			break;  #if HAS_GYRO  		case ao_pyro_orient_less:  			if (ao_sample_orient <= pyro->orient_less)  				continue; +			DBG("orient %d > %d\n", ao_sample_orient, pyro->orient_less);  			break;  		case ao_pyro_orient_greater:  			if (ao_sample_orient >= pyro->orient_greater)  				continue; +			DBG("orient %d < %d\n", ao_sample_orient, pyro->orient_greater);  			break;  #endif  		case ao_pyro_time_less:  			if ((int16_t) (ao_time() - ao_boost_tick) <= pyro->time_less)  				continue; +			DBG("time %d > %d\n", (int16_t)(ao_time() - ao_boost_tick), pyro->time_less);  			break;  		case ao_pyro_time_greater:  			if ((int16_t) (ao_time() - ao_boost_tick) >= pyro->time_greater)  				continue; +			DBG("time %d < %d\n", (int16_t)(ao_time() - ao_boost_tick), pyro->time_greater);  			break;  		case ao_pyro_ascending:  			if (ao_speed > 0)  				continue; +			DBG("not ascending speed %d\n", ao_speed);  			break;  		case ao_pyro_descending:  			if (ao_speed < 0)  				continue; +			DBG("not descending speed %d\n", ao_speed);  			break;  		case ao_pyro_after_motor:  			if (ao_motor_number == pyro->motor)  				continue; +			DBG("motor %d != %d\n", ao_motor_number, pyro->motor);  			break;  		case ao_pyro_delay: @@ -154,10 +174,12 @@ ao_pyro_ready(struct ao_pyro *pyro)  		case ao_pyro_state_less:  			if (ao_flight_state < pyro->state_less)  				continue; +			DBG("state %d >= %d\n", ao_flight_state, pyro->state_less);  			break;  		case ao_pyro_state_greater_or_equal:  			if (ao_flight_state >= pyro->state_greater_or_equal)  				continue; +			DBG("state %d >= %d\n", ao_flight_state, pyro->state_less);  			break;  		default: @@ -230,7 +252,7 @@ ao_pyro_check(void)  	struct ao_pyro	*pyro;  	uint8_t		p, any_waiting;  	uint16_t	fire = 0; -	 +  	any_waiting = 0;  	for (p = 0; p < AO_PYRO_NUM; p++) {  		pyro = &ao_config.pyro[p]; @@ -266,6 +288,16 @@ ao_pyro_check(void)  		 * the delay to expire  		 */  		if (pyro->delay_done) { + +			/* Check to make sure the required conditions +			 * remain valid. If not, inhibit the channel +			 * by setting the fired bit +			 */ +			if (!ao_pyro_ready(pyro)) { +				pyro->fired = 1; +				continue; +			} +  			if ((int16_t) (ao_time() - pyro->delay_done) < 0)  				continue;  		} @@ -443,7 +475,7 @@ ao_pyro_set(void)  		printf ("invalid pyro channel %d\n", p);  		return;  	} -	pyro_tmp.flags = 0; +	memset(&pyro_tmp, '\0', sizeof (pyro_tmp));  	for (;;) {  		ao_cmd_white();  		if (ao_cmd_lex_c == '\n') @@ -467,13 +499,26 @@ ao_pyro_set(void)  		}  		pyro_tmp.flags |= ao_pyro_values[v].flag;  		if (ao_pyro_values[v].offset != NO_VALUE) { +			uint8_t negative = 0; +			ao_cmd_white(); +			if (ao_cmd_lex_c == '-') { +				negative = 1; +				ao_cmd_lex(); +			}  			ao_cmd_decimal();  			if (ao_cmd_status != ao_cmd_success)  				return; -			if (ao_pyro_values[v].flag & AO_PYRO_8_BIT_VALUE) +			if (ao_pyro_values[v].flag & AO_PYRO_8_BIT_VALUE) { +				if (negative) { +					ao_cmd_status = ao_cmd_syntax_error; +					return; +				}  				*((uint8_t *) ((char *) &pyro_tmp + ao_pyro_values[v].offset)) = ao_cmd_lex_i; -			else +			} else { +				if (negative) +					ao_cmd_lex_i = -ao_cmd_lex_i;  				*((int16_t *) ((char *) &pyro_tmp + ao_pyro_values[v].offset)) = ao_cmd_lex_i; +			}  		}  	}  	_ao_config_edit_start(); | 
