From 0ae116dd8779fd0594d443a735e7b6834ea9b713 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 10 Oct 2015 14:10:59 -0700 Subject: [PATCH] telelco: Fix pad reset to one on radio signal loss The pad number was getting reset back to one when signal was lost, causing pad one to get fired in this case even when already set to arm mode. Signed-off-by: Keith Packard --- src/drivers/ao_lco.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/drivers/ao_lco.c b/src/drivers/ao_lco.c index e2039604..6c192537 100644 --- a/src/drivers/ao_lco.c +++ b/src/drivers/ao_lco.c @@ -39,6 +39,9 @@ static uint8_t ao_lco_debug; #define AO_LCO_DRAG_RACE_START_TIME AO_SEC_TO_TICKS(5) #define AO_LCO_DRAG_RACE_STOP_TIME AO_SEC_TO_TICKS(2) +#define AO_LCO_VALID_LAST 1 +#define AO_LCO_VALID_EVER 2 + static uint8_t ao_lco_min_box, ao_lco_max_box; static uint8_t ao_lco_selected[AO_PAD_MAX_BOXES]; static uint8_t ao_lco_valid[AO_PAD_MAX_BOXES]; @@ -488,10 +491,10 @@ ao_lco_get_channels(uint8_t box, struct ao_pad_query *query) r = ao_lco_query(box, query, &ao_lco_tick_offset[box]); if (r == AO_RADIO_CMAC_OK) { ao_lco_channels[box] = query->channels; - ao_lco_valid[box] = 1; + ao_lco_valid[box] = AO_LCO_VALID_LAST | AO_LCO_VALID_EVER; } else - ao_lco_valid[box] = 0; - PRINTD("ao_lco_get_channels(%d) rssi %d valid %d ret %d\n", box, ao_radio_cmac_rssi, ao_lco_valid[box], r); + ao_lco_valid[box] &= ~AO_LCO_VALID_LAST; + PRINTD("ao_lco_get_channels(%d) rssi %d valid %d ret %d offset %d\n", box, ao_radio_cmac_rssi, ao_lco_valid[box], r, ao_lco_tick_offset[box]); ao_wakeup(&ao_pad_query); return ao_lco_valid[box]; } @@ -502,8 +505,8 @@ ao_lco_update(void) if (ao_lco_box != AO_LCO_BOX_DRAG) { uint8_t previous_valid = ao_lco_valid[ao_lco_box]; - if (ao_lco_get_channels(ao_lco_box, &ao_pad_query)) { - if (!previous_valid) { + 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 != 0) ao_lco_pad = ao_lco_pad_first(ao_lco_box); ao_lco_set_display(); @@ -537,7 +540,6 @@ ao_lco_box_set_present(uint8_t box) static void ao_lco_search(void) { - uint16_t tick_offset; int8_t r; int8_t try; uint8_t box; @@ -549,9 +551,9 @@ ao_lco_search(void) if ((box % 10) == 0) ao_lco_set_box(box); for (try = 0; try < 3; try++) { - tick_offset = 0; - r = ao_lco_query(box, &ao_pad_query, &tick_offset); - PRINTD("box %d result %d\n", box, r); + ao_lco_tick_offset[box] = 0; + r = ao_lco_query(box, &ao_pad_query, &ao_lco_tick_offset[box]); + PRINTD("box %d result %d offset %d\n", box, r, ao_lco_tick_offset[box]); if (r == AO_RADIO_CMAC_OK) { ++boxes; ao_lco_box_set_present(box); @@ -585,7 +587,7 @@ ao_lco_igniter_status(void) for (c = 0; c < AO_LED_CONTINUITY_NUM; c++) ao_led_off(continuity_led[c]); } else { - if (!ao_lco_valid[ao_lco_box]) { + if (!(ao_lco_valid[ao_lco_box] & AO_LCO_VALID_LAST)) { ao_led_on(AO_LED_RED); ao_led_off(AO_LED_GREEN|AO_LED_AMBER); continue; @@ -666,8 +668,10 @@ ao_lco_monitor(void) if (ao_lco_selected[box]) { PRINTD("Arming box %d pads %x\n", box, ao_lco_selected[box]); - if (ao_lco_valid[box]) + if (ao_lco_valid[box] & AO_LCO_VALID_EVER) { ao_lco_arm(box, ao_lco_selected[box], ao_lco_tick_offset[box]); + ao_delay(AO_MS_TO_TICKS(10)); + } } } } -- 2.30.2