diff options
| author | Keith Packard <keithp@keithp.com> | 2011-05-23 11:32:29 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2011-05-23 16:13:46 -0600 | 
| commit | 252b7e63715f48e99d0eb26faf1690c909dd2bb2 (patch) | |
| tree | 78120f2d500029d98bf1a583d8ab911b3f667590 /src | |
| parent | 6c87e4f77e6072ae7e8587d327b2ff80af2c3e6a (diff) | |
altos, altosui: Add igniter mode (dual, apogee, main)
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
| @@ -1229,7 +1229,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; @@ -1242,8 +1242,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 319febb9..4551574f 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;  	} @@ -335,6 +340,28 @@ ao_config_log_set(void) __reentrant  }  #endif /* HAS_EEPROM */ +#if HAS_ADC +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 {  	char		cmd;  	void		(*set)(void) __reentrant; @@ -372,6 +399,10 @@ __code struct ao_config_var ao_config_vars[] = {  	{ 'l',  ao_config_log_set,		ao_config_log_show,  		"l <size>    Set flight log size in kB" },  #endif +#if HAS_ADC +	{ 'i',	ao_config_ignite_mode_set,	ao_config_ignite_mode_show, +	  "i <0 dual, 1 apogee, 2 main> Set igniter mode" }, +#endif  	{ 's',	ao_config_show,			ao_config_show,  		"s           Show current config values" },  #if HAS_EEPROM diff --git a/src/ao_ignite.c b/src/ao_ignite.c index 7874ee01..598877a8 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; | 
