diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/drivers/ao_lco.c | 28 | ||||
| -rw-r--r-- | src/drivers/ao_lco.h | 22 | ||||
| -rw-r--r-- | src/drivers/ao_lco_bits.c | 65 | ||||
| -rw-r--r-- | src/drivers/ao_lco_two.c | 226 | ||||
| -rw-r--r-- | src/telelco-v2.0/ao_lco_v2.c | 23 | ||||
| -rw-r--r-- | src/telelcotwo-v0.1/Makefile | 1 | ||||
| -rw-r--r-- | src/telelcotwo-v0.1/ao_pins.h | 2 | 
7 files changed, 96 insertions, 271 deletions
diff --git a/src/drivers/ao_lco.c b/src/drivers/ao_lco.c index f73fb43f..2c8c729f 100644 --- a/src/drivers/ao_lco.c +++ b/src/drivers/ao_lco.c @@ -41,12 +41,10 @@  static uint16_t	ao_lco_fire_tick;  static uint8_t	ao_lco_fire_down; -#define AO_LCO_BOX_DRAG		0x1000 -  static uint8_t	ao_lco_display_mutex;  void -ao_lco_set_pad(uint8_t pad) +ao_lco_show_pad(uint8_t pad)  {  	ao_mutex_get(&ao_lco_display_mutex);  	ao_seven_segment_set(AO_LCO_PAD_DIGIT, pad | (ao_lco_drag_race << 4)); @@ -71,7 +69,7 @@ ao_lco_set_pad(uint8_t pad)  				 (0 << 6))  void -ao_lco_set_box(uint16_t box) +ao_lco_show_box(uint16_t box)  {  	ao_mutex_get(&ao_lco_display_mutex);  	if (box == AO_LCO_BOX_DRAG) { @@ -85,7 +83,7 @@ ao_lco_set_box(uint16_t box)  }  void -ao_lco_set_voltage(uint16_t decivolts) +ao_lco_show_voltage(uint16_t decivolts)  {  	uint8_t	tens, ones, tenths; @@ -100,16 +98,16 @@ ao_lco_set_voltage(uint16_t decivolts)  }  void -ao_lco_set_display(void) +ao_lco_show_display(void)  {  	if (ao_lco_pad == AO_LCO_PAD_VOLTAGE && ao_lco_box != AO_LCO_BOX_DRAG) { -		ao_lco_set_voltage(ao_pad_query.battery); +		ao_lco_show_voltage(ao_pad_query.battery);  	} else {  		if (ao_lco_box == AO_LCO_BOX_DRAG) -			ao_lco_set_pad(ao_lco_drag_race); +			ao_lco_show_pad(ao_lco_drag_race);  		else -			ao_lco_set_pad(ao_lco_pad); -		ao_lco_set_box(ao_lco_box); +			ao_lco_show_pad(ao_lco_pad); +		ao_lco_show_box(ao_lco_box);  	}  } @@ -210,13 +208,7 @@ ao_lco_step_box(int8_t dir)  		if (new_box == ao_lco_box)  			break;  	} while (!ao_lco_box_present(new_box)); -	if (ao_lco_box != new_box) { -		ao_lco_box = new_box; -		ao_lco_pad = 1; -		if (ao_lco_box != AO_LCO_BOX_DRAG) -			ao_lco_channels[ao_lco_box] = 0; -		ao_lco_set_display(); -	} +	ao_lco_set_box(new_box);  }  static void @@ -299,7 +291,7 @@ ao_lco_batt_voltage(void)  	ao_adc_single_get(&packet);  	decivolt = ao_battery_decivolt(packet.v_batt); -	ao_lco_set_voltage(decivolt); +	ao_lco_show_voltage(decivolt);  	ao_delay(AO_MS_TO_TICKS(1000));  }  #endif diff --git a/src/drivers/ao_lco.h b/src/drivers/ao_lco.h index d5aace0d..c1b101d2 100644 --- a/src/drivers/ao_lco.h +++ b/src/drivers/ao_lco.h @@ -21,6 +21,14 @@  #include <ao_lco_func.h> +#ifndef AO_LCO_DRAG +#define AO_LCO_DRAG	1 +#endif + +#if AO_LCO_DRAG +#define AO_LCO_BOX_DRAG		0x1000 +#endif +  #define DEBUG	1  #if DEBUG @@ -73,9 +81,15 @@ uint8_t  ao_lco_pad_first(uint8_t box);  void +ao_lco_set_pad(uint8_t new_pad); + +void  ao_lco_step_pad(int8_t dir);  void +ao_lco_set_box(uint16_t new_box); + +void  ao_lco_set_armed(uint8_t armed);  void @@ -121,16 +135,16 @@ ao_lco_arm_warn(void);   */  void -ao_lco_set_pad(uint8_t pad); +ao_lco_show_pad(uint8_t pad);  void -ao_lco_set_box(uint16_t box); +ao_lco_show_box(uint16_t box);  void -ao_lco_set_voltage(uint16_t decivolts); +ao_lco_show_voltage(uint16_t decivolts);  void -ao_lco_set_display(void); +ao_lco_show_display(void);  void  ao_lco_init(void); diff --git a/src/drivers/ao_lco_bits.c b/src/drivers/ao_lco_bits.c index b2124d1b..9492cf59 100644 --- a/src/drivers/ao_lco_bits.c +++ b/src/drivers/ao_lco_bits.c @@ -170,11 +170,10 @@ ao_lco_update(void)  	if (ao_lco_get_channels(ao_lco_box, &ao_pad_query) & AO_LCO_VALID_LAST) {  		if (!(previous_valid & AO_LCO_VALID_EVER)) {  			if (ao_lco_pad != AO_LCO_PAD_VOLTAGE) -				ao_lco_pad = ao_lco_pad_first(ao_lco_box); -			ao_lco_set_display(); +				ao_lco_set_pad(ao_lco_pad_first(ao_lco_box));  		}  		if (ao_lco_pad == AO_LCO_PAD_VOLTAGE) -			ao_lco_set_display(); +			ao_lco_show_display();  	}  } @@ -201,6 +200,28 @@ ao_lco_box_set_present(uint8_t box)  }  void +ao_lco_set_pad(uint8_t new_pad) +{ +	if (new_pad != ao_lco_pad) { +		ao_lco_pad = new_pad; +		ao_lco_show_display(); +	} +} + +void +ao_lco_set_box(uint16_t new_box) +{ +	if (ao_lco_box != new_box) { +		ao_lco_box = new_box; +#if AO_LCO_DRAG +		if (ao_lco_box != AO_LCO_BOX_DRAG) +#endif +			ao_lco_channels[ao_lco_box] = 0; +		ao_lco_set_pad(1); +	} +} + +void  ao_lco_step_pad(int8_t dir)  {  	int8_t	new_pad; @@ -215,10 +236,7 @@ ao_lco_step_pad(int8_t dir)  		if (new_pad == ao_lco_pad)  			break;  	} while (!ao_lco_pad_present(ao_lco_box, new_pad)); -	if (new_pad != ao_lco_pad) { -		ao_lco_pad = new_pad; -		ao_lco_set_display(); -	} +	ao_lco_set_pad(new_pad);  }  void @@ -255,17 +273,6 @@ ao_lco_set_firing(uint8_t firing)  }  void -ao_lco_toggle_drag(void) -{ -	if (ao_lco_drag_race && ao_lco_pad != AO_LCO_PAD_VOLTAGE) { -		ao_lco_selected[ao_lco_box] ^= (1 << (ao_lco_pad - 1)); -		PRINTD("Toggle box %d pad %d (pads now %x) to drag race\n", -		       ao_lco_pad, ao_lco_box, ao_lco_selected[ao_lco_box]); -		ao_lco_drag_add_beeps(ao_lco_pad); -	} -} - -void  ao_lco_search(void)  {  	int8_t		r; @@ -297,8 +304,7 @@ ao_lco_search(void)  		ao_lco_min_box = ao_lco_max_box = ao_lco_box = 0;  	memset(ao_lco_valid, 0, sizeof (ao_lco_valid));  	memset(ao_lco_channels, 0, sizeof (ao_lco_channels)); -	ao_lco_pad = 1; -	ao_lco_set_display(); +	ao_lco_set_pad(1);  }  void @@ -336,6 +342,8 @@ ao_lco_monitor(void)  	}  } +#if AO_LCO_DRAG +  uint8_t			ao_lco_drag_beep_count;  static uint8_t		ao_lco_drag_beep_on;  static uint16_t		ao_lco_drag_beep_time; @@ -355,6 +363,18 @@ ao_lco_drag_add_beeps(uint8_t beeps)  	ao_wakeup(&ao_lco_drag_beep_count);  } +/* Toggle current pad in drag set */ +void +ao_lco_toggle_drag(void) +{ +	if (ao_lco_drag_race && ao_lco_pad != AO_LCO_PAD_VOLTAGE) { +		ao_lco_selected[ao_lco_box] ^= (1 << (ao_lco_pad - 1)); +		PRINTD("Toggle box %d pad %d (pads now %x) to drag race\n", +		       ao_lco_pad, ao_lco_box, ao_lco_selected[ao_lco_box]); +		ao_lco_drag_add_beeps(ao_lco_pad); +	} +} +  /* Check whether it's time to change the beeper status, then either   * turn it on or off as necessary and bump the remaining beep counts   */ @@ -408,7 +428,7 @@ ao_lco_drag_enable(void)  		ao_led_on(AO_LED_DRAG);  #endif  		ao_lco_drag_add_beeps(5); -		ao_lco_set_display(); +		ao_lco_show_display();  	}  } @@ -423,7 +443,7 @@ ao_lco_drag_disable(void)  #endif  		memset(ao_lco_selected, 0, sizeof (ao_lco_selected));  		ao_lco_drag_add_beeps(2); -		ao_lco_set_display(); +		ao_lco_show_display();  	}  } @@ -447,6 +467,7 @@ ao_lco_drag_warn_check(uint16_t now, uint16_t delay)  	}  	return delay;  } +#endif /* AO_LCO_DRAG */  /* task function for beeping while arm is active */  void diff --git a/src/drivers/ao_lco_two.c b/src/drivers/ao_lco_two.c index e2f86745..2fa0a21f 100644 --- a/src/drivers/ao_lco_two.c +++ b/src/drivers/ao_lco_two.c @@ -23,64 +23,13 @@  #include <ao_lco_func.h>  #include <ao_radio_cmac.h> -#define DEBUG	1 - -#if DEBUG -static uint8_t	ao_lco_debug; -#define DEBUG_EVENT	1 -#define DEBUG_STATUS	2 -#define PRINTD(l, ...) do { if (!(ao_lco_debug & l)) break; printf ("\r%5u %s: ", ao_tick_count, __func__); printf(__VA_ARGS__); flush(); } while(0) -#else -#define PRINTD(l,...) -#endif - -#define AO_LCO_VALID_LAST	1 -#define AO_LCO_VALID_EVER	2 -  static uint8_t	ao_lco_suspended; -static uint8_t	ao_lco_valid; -static uint8_t	ao_lco_channels; -static uint16_t	ao_lco_tick_offset; - -/* UI values */ -static uint8_t	ao_lco_armed; -static uint8_t	ao_lco_firing; -static uint8_t	ao_lco_box; - -static struct ao_pad_query	ao_pad_query; - -/* TeleFireTwo boxes have a single pad */ -#define ao_lco_pad	0 - -static void -ao_lco_set_box(int box) -{ -	ao_lco_box = ao_config.pad_box + box; -	ao_lco_valid = 0; -	ao_lco_armed = 0; -	ao_wakeup(&ao_lco_armed); -} - -static void -ao_lco_set_armed(int armed) -{ -	uint8_t	bit = (1 << ao_lco_pad); - -	if (armed) { -		ao_lco_armed = bit; -	} else { -		ao_lco_armed = 0; -	} -	PRINTD(DEBUG_EVENT, "pad %d bit 0x%x armed %d ao_lco_armed 0x%x\n", -	       ao_lco_pad, bit, armed, ao_lco_armed); -	ao_wakeup(&ao_lco_armed); -}  static void  ao_lco_suspend(void)  {  	if (!ao_lco_suspended) { -		PRINTD(DEBUG_EVENT, "suspend\n"); +		PRINTD("suspend\n");  		ao_lco_suspended = 1;  		ao_lco_armed = 0;  		ao_wakeup(&ao_pad_query); @@ -96,6 +45,11 @@ ao_lco_wakeup(void)  	}  } +void +ao_lco_show_display(void) +{ +} +  static void  ao_lco_input(void)  { @@ -113,23 +67,21 @@ ao_lco_input(void)  			ao_event_get(&event);  		}  		ao_lco_wakeup(); -		PRINTD(DEBUG_EVENT, "event type %d unit %d value %d\n", +		PRINTD("event type %d unit %d value %d\n",  		       event.type, event.unit, event.value);  		switch (event.type) {  		case AO_EVENT_BUTTON:  			switch (event.unit) {  			case AO_BUTTON_BOX:  				ao_lco_set_box(event.value); +				ao_lco_set_armed(0);  				break;  			case AO_BUTTON_ARM:  				ao_lco_set_armed(event.value);  				break;  			case AO_BUTTON_FIRE: -				if (ao_lco_armed) { -					ao_lco_firing = event.value; -					PRINTD(DEBUG_EVENT, "Firing %d\n", ao_lco_firing); -					ao_wakeup(&ao_lco_armed); -				} +				if (ao_lco_armed) +					ao_lco_set_firing(event.value);  				break;  			}  			break; @@ -137,140 +89,14 @@ ao_lco_input(void)  	}  } -static AO_LED_TYPE	continuity_led[AO_LED_CONTINUITY_NUM] = { -#ifdef AO_LED_CONTINUITY_0 -	AO_LED_CONTINUITY_0, -#endif -#ifdef AO_LED_CONTINUITY_1 -	AO_LED_CONTINUITY_1, -#endif -#ifdef AO_LED_CONTINUITY_2 -	AO_LED_CONTINUITY_2, -#endif -#ifdef AO_LED_CONTINUITY_3 -	AO_LED_CONTINUITY_3, -#endif -#ifdef AO_LED_CONTINUITY_4 -	AO_LED_CONTINUITY_4, -#endif -#ifdef AO_LED_CONTINUITY_5 -	AO_LED_CONTINUITY_5, -#endif -#ifdef AO_LED_CONTINUITY_6 -	AO_LED_CONTINUITY_6, -#endif -#ifdef AO_LED_CONTINUITY_7 -	AO_LED_CONTINUITY_7, -#endif -}; - -static uint8_t -ao_lco_get_channels(void) -{ -	int8_t			r; - -	r = ao_lco_query(ao_lco_box, &ao_pad_query, &ao_lco_tick_offset); -	if (r == AO_RADIO_CMAC_OK) { -		ao_lco_channels = ao_pad_query.channels; -		ao_lco_valid = AO_LCO_VALID_LAST | AO_LCO_VALID_EVER; -	} else -		ao_lco_valid &= ~AO_LCO_VALID_LAST; -	PRINTD(DEBUG_STATUS, "ao_lco_get_channels() rssi %d valid %d ret %d offset %d\n", ao_radio_cmac_rssi, ao_lco_valid, r, ao_lco_tick_offset); -	ao_wakeup(&ao_pad_query); -	return ao_lco_valid; -} - -static void -ao_lco_igniter_status(void) -{ -	uint8_t		c; -	uint8_t		t = 0; - -	for (;;) { -		uint8_t	all_status; -		ao_sleep(&ao_pad_query); -		while (ao_lco_suspended) { -			ao_led_off(AO_LED_GREEN|AO_LED_AMBER|AO_LED_RED|AO_LED_REMOTE_ARM); -			for (c = 0; c < AO_LED_CONTINUITY_NUM; c++) -				ao_led_off(continuity_led[c]); -			ao_sleep(&ao_lco_suspended); -		} -		PRINTD(DEBUG_STATUS, "RSSI %d VALID %d channels %d arm_status %d\n", -		       ao_radio_cmac_rssi, ao_lco_valid, -		       ao_lco_channels, ao_pad_query.arm_status); -		if (!(ao_lco_valid & AO_LCO_VALID_LAST)) { -			ao_led_on(AO_LED_RED); -			ao_led_off(AO_LED_GREEN|AO_LED_AMBER); -			memset(&ao_pad_query, '\0', sizeof (ao_pad_query)); -		} else if (ao_radio_cmac_rssi < -90) { -			ao_led_on(AO_LED_AMBER); -			ao_led_off(AO_LED_RED|AO_LED_GREEN); -		} else { -			ao_led_on(AO_LED_GREEN); -			ao_led_off(AO_LED_RED|AO_LED_AMBER); -		} -		if (ao_pad_query.arm_status) -			ao_led_on(AO_LED_REMOTE_ARM); -		else -			ao_led_off(AO_LED_REMOTE_ARM); - -		all_status = AO_PAD_IGNITER_STATUS_NO_IGNITER_RELAY_OPEN; -		for (c = 0; c < 8; c++) { -			if (ao_pad_query.channels & (1 << c)) { -				uint8_t status = ao_pad_query.igniter_status[c]; -				if (status > all_status) -					all_status = status; -				PRINTD(DEBUG_STATUS, "\tchannel %d status %d\n", c, status); -			} -		} -		for (c = 0; c < AO_LED_CONTINUITY_NUM; c++) { -			uint8_t	on = 0; -			if (c == (ao_lco_box - ao_config.pad_box) % AO_LED_CONTINUITY_NUM) { -				switch (all_status) { -				case AO_PAD_IGNITER_STATUS_GOOD_IGNITER_RELAY_OPEN: -					on = 1; -					break; -				case AO_PAD_IGNITER_STATUS_NO_IGNITER_RELAY_CLOSED: -				case AO_PAD_IGNITER_STATUS_UNKNOWN: -					on = t & 1; -				} -			} -			if (on) -				ao_led_on(continuity_led[c]); -			else -				ao_led_off(continuity_led[c]); -		} -		t = 1-t; -	} -} - -static void -ao_lco_arm_warn(void) -{ -	int	i; -	for (;;) { -		while (ao_lco_suspended) -			ao_sleep(&ao_lco_suspended); -		while (!ao_lco_armed) -			ao_sleep(&ao_lco_armed); -		for (i = 0; i < ao_lco_armed; i++) { -			ao_beep_for(AO_BEEP_MID, AO_MS_TO_TICKS(100)); -			ao_delay(AO_MS_TO_TICKS(100)); -		} -		ao_delay(AO_MS_TO_TICKS(300)); -	} -} -  static struct ao_task ao_lco_input_task;  static struct ao_task ao_lco_monitor_task;  static struct ao_task ao_lco_arm_warn_task;  static struct ao_task ao_lco_igniter_status_task;  static void -ao_lco_monitor(void) +ao_lco_main(void)  { -	uint16_t		delay; -  	ao_config_get();  	ao_lco_set_box(ao_button_get(AO_BUTTON_BOX));  	ao_add_task(&ao_lco_input_task, ao_lco_input, "lco input"); @@ -279,33 +105,7 @@ ao_lco_monitor(void)  	ao_led_on(~0);  	ao_beep_for(AO_BEEP_MID, AO_MS_TO_TICKS(200));  	ao_led_off(~0); -	for (;;) { -		while (ao_lco_suspended) -			ao_sleep(&ao_lco_suspended); - -		PRINTD(DEBUG_STATUS, "monitor armed %d firing %d\n", -		       ao_lco_armed, ao_lco_firing); - -		if (ao_lco_armed && ao_lco_firing) { -			ao_lco_ignite(AO_PAD_FIRE); -		} else { -			ao_lco_get_channels(); -			if (ao_lco_armed) { -				PRINTD(DEBUG_STATUS, "Arming pads %x\n", -				       ao_lco_armed); -				if (ao_lco_valid & AO_LCO_VALID_EVER) { -					ao_lco_arm(ao_lco_box, ao_lco_armed, ao_lco_tick_offset); -					ao_delay(AO_MS_TO_TICKS(10)); -				} -			} -		} -		if (ao_lco_armed && ao_lco_firing) -			delay = AO_MS_TO_TICKS(100); -		else { -			delay = AO_SEC_TO_TICKS(1); -		} -		ao_sleep_for(&ao_lco_armed, delay); -	} +	ao_lco_monitor();  }  #if DEBUG @@ -326,7 +126,7 @@ __code struct ao_cmds ao_lco_cmds[] = {  void  ao_lco_init(void)  { -	ao_add_task(&ao_lco_monitor_task, ao_lco_monitor, "lco monitor"); +	ao_add_task(&ao_lco_monitor_task, ao_lco_main, "lco monitor");  #if DEBUG  	ao_cmd_register(&ao_lco_cmds[0]);  #endif diff --git a/src/telelco-v2.0/ao_lco_v2.c b/src/telelco-v2.0/ao_lco_v2.c index d5d3d5e4..f64a7745 100644 --- a/src/telelco-v2.0/ao_lco_v2.c +++ b/src/telelco-v2.0/ao_lco_v2.c @@ -39,7 +39,7 @@ static uint8_t	ao_lco_select_mode;  static uint8_t	ao_lco_display_mutex;  void -ao_lco_set_pad(uint8_t pad) +ao_lco_show_pad(uint8_t pad)  {  	ao_mutex_get(&ao_lco_display_mutex);  	ao_seven_segment_set(AO_LCO_PAD_DIGIT, pad | (ao_lco_drag_race << 4)); @@ -64,7 +64,7 @@ ao_lco_set_pad(uint8_t pad)  				 (0 << 6))  void -ao_lco_set_box(uint16_t box) +ao_lco_show_box(uint16_t box)  {  	ao_mutex_get(&ao_lco_display_mutex);  	ao_seven_segment_set(AO_LCO_BOX_DIGIT_1, box % 10 | (ao_lco_drag_race << 4)); @@ -73,7 +73,7 @@ ao_lco_set_box(uint16_t box)  }  void -ao_lco_set_voltage(uint16_t decivolts) +ao_lco_show_voltage(uint16_t decivolts)  {  	uint8_t	tens, ones, tenths; @@ -89,13 +89,13 @@ ao_lco_set_voltage(uint16_t decivolts)  }  void -ao_lco_set_display(void) +ao_lco_show_display(void)  {  	if (ao_lco_pad == AO_LCO_PAD_VOLTAGE) { -		ao_lco_set_voltage(ao_pad_query.battery); +		ao_lco_show_voltage(ao_pad_query.battery);  	} else { -		ao_lco_set_pad(ao_lco_pad); -		ao_lco_set_box(ao_lco_box); +		ao_lco_show_pad(ao_lco_pad); +		ao_lco_show_box(ao_lco_box);  	}  } @@ -143,12 +143,7 @@ ao_lco_step_box(int8_t dir)  		if (new_box == ao_lco_box)  			break;  	} while (!ao_lco_box_present(new_box)); -	if (ao_lco_box != new_box) { -		ao_lco_box = new_box; -		ao_lco_pad = 1; -		ao_lco_channels[ao_lco_box] = 0; -		ao_lco_set_display(); -	} +	ao_lco_set_box(new_box);  }  static struct ao_task	ao_lco_drag_task; @@ -261,7 +256,7 @@ ao_lco_batt_voltage(void)  	ao_adc_single_get(&packet);  	decivolt = ao_battery_decivolt(packet.v_batt); -	ao_lco_set_voltage(decivolt); +	ao_lco_show_voltage(decivolt);  	ao_delay(AO_MS_TO_TICKS(1000));  } diff --git a/src/telelcotwo-v0.1/Makefile b/src/telelcotwo-v0.1/Makefile index 42188bb2..c68f3eb5 100644 --- a/src/telelcotwo-v0.1/Makefile +++ b/src/telelcotwo-v0.1/Makefile @@ -58,6 +58,7 @@ ALTOS_SRC = \  	ao_button.c \  	ao_event.c \  	ao_lco_two.c \ +	ao_lco_bits.c \  	ao_lco_func.c \  	ao_lco_cmd.c \  	ao_radio_cmac_cmd.c diff --git a/src/telelcotwo-v0.1/ao_pins.h b/src/telelcotwo-v0.1/ao_pins.h index 60e94c67..1941e03d 100644 --- a/src/telelcotwo-v0.1/ao_pins.h +++ b/src/telelcotwo-v0.1/ao_pins.h @@ -141,6 +141,8 @@  				 AO_LED_CONTINUITY_0 |	\  				 AO_LED_REMOTE_ARM) +#define AO_LCO_DRAG		0 +  /*   * Use event queue for input devices   */  | 
