altos/telelco-v3.0: Merge info into one screen
[fw/altos] / src / drivers / ao_lco_bits.c
index 80140ec9f7440de0c8f58e9465b674cad60e0696..202e35c2be99bef4f12e497598223844aa8ec5e1 100644 (file)
@@ -38,6 +38,8 @@ static uint8_t                ao_lco_channels[AO_PAD_MAX_BOXES];      /* pad channels available on
 static uint16_t                ao_lco_tick_offset[AO_PAD_MAX_BOXES];   /* 16 bit offset from local to remote tick count */
 static uint8_t         ao_lco_selected[AO_PAD_MAX_BOXES];      /* pads selected to fire */
 
+static uint32_t                ao_lco_query_good, ao_lco_query_bad;
+
 uint8_t                ao_lco_valid[AO_PAD_MAX_BOXES];         /* AO_LCO_VALID bits per box */
 
 static const AO_LED_TYPE       continuity_led[AO_LED_CONTINUITY_NUM] = {
@@ -171,9 +173,14 @@ ao_lco_get_channels(int16_t box, struct ao_pad_query *query)
        if (r == AO_RADIO_CMAC_OK) {
                ao_lco_channels[box] = query->channels;
                ao_lco_valid[box] = AO_LCO_VALID_LAST | AO_LCO_VALID_EVER;
-       } else
+               ++ao_lco_query_good;
+       } else {
                ao_lco_valid[box] &= (uint8_t) ~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_lco_query_bad;
+       }
+       PRINTD("ao_lco_get_channels(%d) rssi %d valid %d ret %d offset %d good %"PRIu32" bad %"PRIu32"\n",
+              box, ao_radio_cmac_rssi, ao_lco_valid[box], r, ao_lco_tick_offset[box],
+              ao_lco_query_good, ao_lco_query_bad);
        ao_wakeup(&ao_pad_query);
        return ao_lco_valid[box];
 }
@@ -193,9 +200,9 @@ ao_lco_update(void)
                        if (!ao_lco_pad_pseudo(ao_lco_pad))
                                ao_lco_set_pad(ao_lco_pad_first(ao_lco_box));
                }
-               if (ao_lco_pad_pseudo(ao_lco_pad))
-                       ao_lco_show();
        }
+       if (ao_lco_pad_pseudo(ao_lco_pad))
+               ao_lco_show();
 }
 
 uint8_t        ao_lco_box_mask[AO_LCO_MASK_SIZE(AO_PAD_MAX_BOXES)];
@@ -282,8 +289,8 @@ ao_lco_step_pad(int8_t dir)
                break;
        }
 #endif
-#ifdef AO_LCO_HAS_INFO
-       case AO_LCO_INFO: {
+#if AO_LCO_HAS_LCO_INFO
+       case AO_LCO_LCO_INFO: {
 #if AO_LCO_MIN_INFO_PAGE < AO_LCO_MAX_INFO_PAGE
                int32_t info_page = ao_lco_get_info_page();
 
@@ -381,6 +388,26 @@ ao_lco_set_firing(uint8_t firing)
        ao_wakeup(&ao_lco_armed);
 }
 
+#if 0
+static int16_t fake_boxes[] = {
+       1, 2, 3, 5, 8, 11, 13, 17, 19, 23, 29, 31, 37, 62, 97
+};
+#define ARRAYSIZE(a)   (sizeof(a) / sizeof((a)[0]))
+#define NFAKE ARRAYSIZE(fake_boxes)
+
+static bool
+is_fake(int16_t box)
+{
+       unsigned i;
+       for (i = 0; i < NFAKE; i++)
+               if (fake_boxes[i] == box)
+                       return true;
+       return false;
+}
+#else
+#define is_fake(b)     false
+#endif
+
 void
 ao_lco_search(void)
 {
@@ -407,7 +434,7 @@ ao_lco_search(void)
                        ao_lco_tick_offset[box] = 0;
                        r = ao_lco_query((uint16_t) 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) {
+                       if (r == AO_RADIO_CMAC_OK || is_fake(box)) {
                                ++boxes;
                                ao_lco_box_set_present(box);
 #ifdef AO_LCO_SEARCH_API