diff options
| author | Keith Packard <keithp@keithp.com> | 2011-05-23 11:32:29 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2011-07-17 08:14:09 -0700 | 
| commit | 51796e2f1ebce3ee8dc1ac90648381410c1379ee (patch) | |
| tree | bdf221ce19ac4d529c6852e1197d8edea901eff1 /src | |
| parent | 1332ed55192f22525f31574f60fae4c6579e6f7f (diff) | |
altos, altosui: Add igniter mode (dual, apogee, main)split-telemetry
This provides for redundant charges for either apogee or main.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/ao.h | 7 | ||||
| -rw-r--r-- | src/ao_config.c | 31 | ||||
| -rw-r--r-- | src/ao_ignite.c | 50 | 
3 files changed, 77 insertions, 11 deletions
@@ -1357,7 +1357,7 @@ ao_igniter_init(void);   */  #define AO_CONFIG_MAJOR	1 -#define AO_CONFIG_MINOR	4 +#define AO_CONFIG_MINOR	5  struct ao_config {  	uint8_t		major; @@ -1370,8 +1370,13 @@ struct ao_config {  	int16_t		accel_minus_g;		/* minor version 2 */  	uint32_t	radio_cal;		/* minor version 3 */  	uint32_t	flight_log_max;		/* minor version 4 */ +	uint8_t		ignite_mode;		/* minor version 5 */  }; +#define AO_IGNITE_MODE_DUAL		0 +#define AO_IGNITE_MODE_APOGEE		1 +#define AO_IGNITE_MODE_MAIN		2 +  extern __xdata struct ao_config ao_config;  #define AO_CONFIG_MAX_SIZE	128 diff --git a/src/ao_config.c b/src/ao_config.c index 813164ea..48349886 100644 --- a/src/ao_config.c +++ b/src/ao_config.c @@ -27,6 +27,7 @@ __xdata uint8_t ao_config_mutex;  #define AO_CONFIG_DEFAULT_CALLSIGN	"N0CALL"  #define AO_CONFIG_DEFAULT_ACCEL_ZERO_G	16000  #define AO_CONFIG_DEFAULT_APOGEE_DELAY	0 +#define AO_CONFIG_DEFAULT_IGNITE_MODE	AO_IGNITE_MODE_DUAL  #if USE_INTERNAL_EEPROM  #define AO_CONFIG_DEFAULT_FLIGHT_LOG_MAX	ao_storage_config  #else @@ -75,6 +76,7 @@ _ao_config_get(void)  		ao_config.apogee_delay = AO_CONFIG_DEFAULT_APOGEE_DELAY;  		ao_config.radio_cal = ao_radio_cal;  		ao_config.flight_log_max = AO_CONFIG_DEFAULT_FLIGHT_LOG_MAX; +		ao_config.ignite_mode = AO_CONFIG_DEFAULT_IGNITE_MODE;  		ao_config_dirty = 1;  	}  	if (ao_config.minor < AO_CONFIG_MINOR) { @@ -92,6 +94,9 @@ _ao_config_get(void)  		/* Fixups for minor version 4 */  		if (ao_config.minor < 4)  			ao_config.flight_log_max = AO_CONFIG_DEFAULT_FLIGHT_LOG_MAX; +		/* Fixupes for minor version 5 */ +		if (ao_config.minor < 5) +			ao_config.ignite_mode = AO_CONFIG_DEFAULT_IGNITE_MODE;  		ao_config.minor = AO_CONFIG_MINOR;  		ao_config_dirty = 1;  	} @@ -334,6 +339,28 @@ ao_config_log_set(void) __reentrant  }  #endif /* HAS_EEPROM */ +#if HAS_IGNITE +void +ao_config_ignite_mode_show(void) __reentrant +{ +	printf("Ignite mode: %d\n", ao_config.ignite_mode); +} + +void +ao_config_ignite_mode_set(void) __reentrant +{ +	ao_cmd_decimal(); +	if (ao_cmd_status != ao_cmd_success) +		return; +	ao_mutex_get(&ao_config_mutex); +	_ao_config_get(); +	ao_config.ignite_mode = ao_cmd_lex_i; +	ao_config_dirty = 1; +	ao_mutex_put(&ao_config_mutex); +	ao_config_log_show(); +} +#endif +  struct ao_config_var {  	__code char	*str;  	void		(*set)(void) __reentrant; @@ -370,6 +397,10 @@ __code struct ao_config_var ao_config_vars[] = {  	{ "l <size>\0Flight log size in kB",  	  ao_config_log_set,		ao_config_log_show },  #endif +#if HAS_IGNITE +	{ "i <0 dual, 1 apogee, 2 main>\0Set igniter mode", +	  ao_config_ignite_mode_set,	ao_config_ignite_mode_show }, +#endif  	{ "s\0Show",  	  ao_config_show,		ao_config_show },  #if HAS_EEPROM diff --git a/src/ao_ignite.c b/src/ao_ignite.c index e1b91bea..512ec622 100644 --- a/src/ao_ignite.c +++ b/src/ao_ignite.c @@ -51,7 +51,7 @@ void  ao_ignite(enum ao_igniter igniter) __critical  {  	ao_ignition[igniter].request = 1; -	ao_wakeup(&ao_ignition[0]); +	ao_wakeup(&ao_ignition);  }  enum ao_igniter_status @@ -91,16 +91,46 @@ void  ao_igniter_fire(enum ao_igniter igniter) __critical  {  	ao_ignition[igniter].firing = 1; -	switch (igniter) { -	case ao_igniter_drogue: -		AO_IGNITER_DROGUE = 1; -		ao_delay(AO_IGNITER_FIRE_TIME); -		AO_IGNITER_DROGUE = 0; +	switch(ao_config.ignite_mode) { +	case AO_IGNITE_MODE_DUAL: +		switch (igniter) { +		case ao_igniter_drogue: +			AO_IGNITER_DROGUE = 1; +			ao_delay(AO_IGNITER_FIRE_TIME); +			AO_IGNITER_DROGUE = 0; +			break; +		case ao_igniter_main: +			AO_IGNITER_MAIN = 1; +			ao_delay(AO_IGNITER_FIRE_TIME); +			AO_IGNITER_MAIN = 0; +			break; +		}  		break; -	case ao_igniter_main: -		AO_IGNITER_MAIN = 1; -		ao_delay(AO_IGNITER_FIRE_TIME); -		AO_IGNITER_MAIN = 0; +	case AO_IGNITE_MODE_APOGEE: +		switch (igniter) { +		case ao_igniter_drogue: +			AO_IGNITER_DROGUE = 1; +			ao_delay(AO_IGNITER_FIRE_TIME); +			AO_IGNITER_DROGUE = 0; +			ao_delay(AO_IGNITER_CHARGE_TIME); +			AO_IGNITER_MAIN = 1; +			ao_delay(AO_IGNITER_FIRE_TIME); +			AO_IGNITER_MAIN = 0; +			break; +		} +		break; +	case AO_IGNITE_MODE_MAIN: +		switch (igniter) { +		case ao_igniter_main: +			AO_IGNITER_DROGUE = 1; +			ao_delay(AO_IGNITER_FIRE_TIME); +			AO_IGNITER_DROGUE = 0; +			ao_delay(AO_IGNITER_CHARGE_TIME); +			AO_IGNITER_MAIN = 1; +			ao_delay(AO_IGNITER_FIRE_TIME); +			AO_IGNITER_MAIN = 0; +			break; +		}  		break;  	}  	ao_ignition[igniter].firing = 0;  | 
