X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Ftelelco-v2.0%2Fao_lco_v2.c;h=45895908c7ac5dde6767962fcc9740415152d6ae;hb=dbeb9b91a48418c5bc9f6edccaef20c3ef77d45d;hp=6f2b618aec51c39e223fb17ca151f637e151ced0;hpb=96ee5257068a988db10097af8df72b0008bce978;p=fw%2Faltos diff --git a/src/telelco-v2.0/ao_lco_v2.c b/src/telelco-v2.0/ao_lco_v2.c index 6f2b618a..45895908 100644 --- a/src/telelco-v2.0/ao_lco_v2.c +++ b/src/telelco-v2.0/ao_lco_v2.c @@ -52,15 +52,12 @@ static uint16_t ao_lco_tick_offset[AO_PAD_MAX_BOXES]; /* UI values */ static uint8_t ao_lco_armed; static uint8_t ao_lco_firing; -static uint16_t ao_lco_fire_tick; -static uint8_t ao_lco_fire_down; static uint8_t ao_lco_drag_race; static uint8_t ao_lco_pad; static int16_t ao_lco_box; static uint8_t ao_lco_select_mode; #define AO_LCO_SELECT_PAD 0 #define AO_LCO_SELECT_BOX 1 -#define AO_LCO_SELECT_NONE 2 static struct ao_pad_query ao_pad_query; @@ -105,6 +102,7 @@ ao_lco_set_voltage(uint16_t decivolts) { uint8_t tens, ones, tenths; + PRINTD("voltage %d\n", decivolts); tenths = decivolts % 10; ones = (decivolts / 10) % 10; tens = (decivolts / 100) % 10; @@ -167,19 +165,22 @@ ao_lco_pad_first(uint8_t box) static void ao_lco_set_select(void) { - switch (ao_lco_select_mode) { - case AO_LCO_SELECT_PAD: - ao_led_off(AO_LED_BOX); - ao_led_on(AO_LED_PAD); - break; - case AO_LCO_SELECT_BOX: - ao_led_off(AO_LED_PAD); - ao_led_on(AO_LED_BOX); - break; - default: + if (ao_lco_armed) { ao_led_off(AO_LED_PAD); ao_led_off(AO_LED_BOX); - break; + } else { + switch (ao_lco_select_mode) { + case AO_LCO_SELECT_PAD: + ao_led_off(AO_LED_BOX); + ao_led_on(AO_LED_PAD); + break; + case AO_LCO_SELECT_BOX: + ao_led_off(AO_LED_PAD); + ao_led_on(AO_LED_BOX); + break; + default: + break; + } } } @@ -252,9 +253,9 @@ ao_lco_drag_enable(void) PRINTD("Drag enable\n"); ao_lco_drag_race = 1; memset(ao_lco_selected, 0, sizeof (ao_lco_selected)); + ao_led_on(AO_LED_DRAG); ao_lco_drag_beep(5); ao_lco_set_display(); - ao_lco_fire_down = 0; } static void @@ -262,37 +263,10 @@ ao_lco_drag_disable(void) { PRINTD("Drag disable\n"); ao_lco_drag_race = 0; + ao_led_off(AO_LED_DRAG); memset(ao_lco_selected, 0, sizeof (ao_lco_selected)); ao_lco_drag_beep(2); ao_lco_set_display(); - ao_lco_fire_down = 0; -} - -static uint16_t -ao_lco_drag_button_check(uint16_t now, uint16_t delay) -{ - uint16_t button_delay = ~0; - - /* - * Check to see if the button has been held down long enough - * to switch in/out of drag race mode - */ - if (ao_lco_fire_down) { - if (ao_lco_drag_race) { - if ((int16_t) (now - ao_lco_fire_tick) >= AO_LCO_DRAG_RACE_STOP_TIME) - ao_lco_drag_disable(); - else - button_delay = ao_lco_fire_tick + AO_LCO_DRAG_RACE_STOP_TIME - now; - } else { - if ((int16_t) (now - ao_lco_fire_tick) >= AO_LCO_DRAG_RACE_START_TIME) - ao_lco_drag_enable(); - else - button_delay = ao_lco_fire_tick + AO_LCO_DRAG_RACE_START_TIME - now; - } - if (delay > button_delay) - delay = button_delay; - } - return delay; } static uint16_t @@ -330,12 +304,11 @@ ao_lco_drag_monitor(void) continue; now = ao_time(); - delay = ao_lco_drag_button_check(now, delay); delay = ao_lco_drag_warn_check(now, delay); delay = ao_lco_drag_beep_check(now, delay); /* check to see if there's anything left to do here */ - if (!ao_lco_fire_down && !ao_lco_drag_race && !ao_lco_drag_beep_count) { + if (!ao_lco_drag_race && !ao_lco_drag_beep_count) { delay = ~0; ao_lco_drag_active = 0; } @@ -412,12 +385,11 @@ ao_lco_input(void) if (ao_lco_drag_race) { uint8_t box; - for (box = ao_lco_min_box; box <= ao_lco_max_box; box++) { - if (ao_lco_selected[box]) { - ao_wakeup(&ao_lco_armed); + for (box = ao_lco_min_box; box <= ao_lco_max_box; box++) + if (ao_lco_selected[box]) break; - } - } + if (box > ao_lco_max_box) + ao_lco_armed = 0; } else { memset(ao_lco_selected, 0, sizeof (ao_lco_selected)); if (ao_lco_pad != 0) @@ -426,18 +398,18 @@ ao_lco_input(void) ao_lco_armed = 0; } } + ao_lco_set_select(); ao_wakeup(&ao_lco_armed); break; case AO_BUTTON_FIRE: if (ao_lco_armed) { - ao_lco_fire_down = 0; ao_lco_firing = event.value; PRINTD("Firing %d\n", ao_lco_firing); ao_wakeup(&ao_lco_armed); } break; case AO_BUTTON_DRAG_SELECT: - if (ao_lco_drag_race) { + if (event.value && ao_lco_drag_race) { if (ao_lco_pad != 0) { ao_lco_selected[ao_lco_box] ^= (1 << (ao_lco_pad - 1)); PRINTD("Toggle box %d pad %d (pads now %x) to drag race\n", @@ -446,17 +418,19 @@ ao_lco_input(void) } } break; - case AO_BUTTON_MODE_SELECT: + case AO_BUTTON_DRAG_MODE: if (event.value) ao_lco_drag_enable(); else ao_lco_drag_disable(); break; - case AO_BUTTON_SELECT: - ao_lco_select_mode++; - if (ao_lco_select_mode > AO_LCO_SELECT_NONE) - ao_lco_select_mode = AO_LCO_SELECT_PAD; - ao_lco_set_select(); + case AO_BUTTON_ENCODER_SELECT: + if (event.value) { + if (!ao_lco_armed) { + ao_lco_select_mode = 1 - ao_lco_select_mode; + ao_lco_set_select(); + } + } break; } break; @@ -608,23 +582,32 @@ ao_lco_igniter_status(void) for (c = 0; c < AO_LED_CONTINUITY_NUM; c++) { uint8_t status; - if (ao_lco_drag_race) { - if (ao_lco_selected[ao_lco_box] & (1 << c) && t) + if (ao_pad_query.channels & (1 << c)) + status = ao_pad_query.igniter_status[c]; + else + status = AO_PAD_IGNITER_STATUS_NO_IGNITER_RELAY_OPEN; + + if (ao_lco_drag_race && (ao_lco_selected[ao_lco_box] & (1 << c))) { + uint8_t on = 0; + if (status == AO_PAD_IGNITER_STATUS_GOOD_IGNITER_RELAY_OPEN) { + if (t) + on = 1; + } else { + if (t == 1) + on = 1; + } + if (on) ao_led_on(continuity_led[c]); else ao_led_off(continuity_led[c]); } else { - if (ao_pad_query.channels & (1 << c)) - status = ao_pad_query.igniter_status[c]; - else - status = AO_PAD_IGNITER_STATUS_NO_IGNITER_RELAY_OPEN; if (status == AO_PAD_IGNITER_STATUS_GOOD_IGNITER_RELAY_OPEN) ao_led_on(continuity_led[c]); else ao_led_off(continuity_led[c]); } } - t = 1-t; + t = (t + 1) & 3; } }