diff options
| author | Keith Packard <keithp@keithp.com> | 2012-10-10 14:28:07 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2012-10-10 14:28:07 -0700 | 
| commit | 3f059f8878a79b3154a19b6803fbc367eda80dc9 (patch) | |
| tree | 9227660e42805f639167cd7ccef5b4ffa53c8c46 /src/drivers | |
| parent | 422799d9be36ef71b63c1c0fd80d5e76da802949 (diff) | |
altos/telefire: Add siren/strobe support
This also involved hacking up the code to allow for non-zero offsets
for the pad firing and continuity pins.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/drivers')
| -rw-r--r-- | src/drivers/ao_pad.c | 63 | 
1 files changed, 54 insertions, 9 deletions
diff --git a/src/drivers/ao_pad.c b/src/drivers/ao_pad.c index 120ce539..36905136 100644 --- a/src/drivers/ao_pad.c +++ b/src/drivers/ao_pad.c @@ -40,24 +40,62 @@ static __pdata uint8_t	ao_pad_debug;  #endif  static void +ao_siren(uint8_t v) +{ +#ifdef AO_SIREN +	ao_gpio_set(AO_SIREN_PORT, AO_SIREN_PIN, AO_SIREN, v); +#else +	ao_beep(v ? AO_BEEP_MID : 0); +#endif +} + +static void +ao_strobe(uint8_t v) +{ +#ifdef AO_STROBE +	ao_gpio_set(AO_STROBE_PORT, AO_STROBE_PIN, AO_STROBE, v); +#endif +} + +static void  ao_pad_run(void)  { +	uint8_t	pins; +  	for (;;) {  		while (!ao_pad_ignite)  			ao_sleep(&ao_pad_ignite);  		/*  		 * Actually set the pad bits  		 */ -		AO_PAD_PORT = (AO_PAD_PORT & (~AO_PAD_ALL_PINS)) | ao_pad_ignite; +		pins = 0; +#if AO_PAD_NUM > 0 +		if (ao_pad_ignite & (1 << 0)) +			pins |= (1 << AO_PAD_PIN_0); +#endif +#if AO_PAD_NUM > 1 +		if (ao_pad_ignite & (1 << 1)) +			pins |= (1 << AO_PAD_PIN_1); +#endif +#if AO_PAD_NUM > 2 +		if (ao_pad_ignite & (1 << 2)) +			pins |= (1 << AO_PAD_PIN_2); +#endif +#if AO_PAD_NUM > 3 +		if (ao_pad_ignite & (1 << 3)) +			pins |= (1 << AO_PAD_PIN_3); +#endif +		AO_PAD_PORT = (AO_PAD_PORT & (~AO_PAD_ALL_PINS)) | pins;  		while (ao_pad_ignite) {  			ao_pad_ignite = 0; +  			ao_delay(AO_PAD_FIRE_TIME);  		}  		AO_PAD_PORT &= ~(AO_PAD_ALL_PINS);  	}  } -#define AO_PAD_ARM_BEEP_INTERVAL	200 +#define AO_PAD_ARM_SIREN_INTERVAL	200  static void  ao_pad_monitor(void) @@ -143,21 +181,23 @@ ao_pad_monitor(void)  			ao_pad_armed = 0;  		if (ao_pad_armed) { +			ao_strobe(1);  			if (sample & 2) -				ao_beep(AO_BEEP_HIGH); +				ao_siren(1);  			else -				ao_beep(AO_BEEP_LOW); +				ao_siren(0);  			beeping = 1;  		} else if (query.arm_status == AO_PAD_ARM_STATUS_ARMED && !beeping) {  			if (arm_beep_time == 0) { -				arm_beep_time = AO_PAD_ARM_BEEP_INTERVAL; +				arm_beep_time = AO_PAD_ARM_SIREN_INTERVAL;  				beeping = 1; -				ao_beep(AO_BEEP_HIGH); +				ao_siren(1);  			}  			--arm_beep_time;  		} else if (beeping) {  			beeping = 0; -			ao_beep(0); +			ao_siren(0); +			ao_strobe(0);  		}  	}  } @@ -184,7 +224,6 @@ ao_pad(void)  	int16_t	time_difference;  	int8_t	ret; -	ao_beep_for(AO_BEEP_MID, AO_MS_TO_TICKS(200));  	ao_pad_box = 0;  	ao_led_set(0);  	ao_led_on(AO_LED_POWER); @@ -207,7 +246,7 @@ ao_pad(void)  				break;  			} -			if (command.channels & ~(AO_PAD_ALL_PINS)) +			if (command.channels & ~(AO_PAD_ALL_CHANNELS))  				break;  			time_difference = command.tick - ao_time(); @@ -349,6 +388,12 @@ ao_pad_init(void)  #if AO_PAD_NUM > 3  	ao_enable_output(AO_PAD_PORT, AO_PAD_PIN_3, AO_PAD_3, 0);  #endif +#ifdef AO_STROBE +	ao_enable_output(AO_STROBE_PORT, AO_STROBE_PIN, AO_STROBE, 0); +#endif +#ifdef AO_SIREN +	ao_enable_output(AO_SIREN_PORT, AO_SIREN_PIN, AO_SIREN, 0); +#endif  	ao_cmd_register(&ao_pad_cmds[0]);  	ao_add_task(&ao_pad_task, ao_pad, "pad listener");  	ao_add_task(&ao_pad_ignite_task, ao_pad_run, "pad igniter");  | 
