altos/telefireone-v1.0: Track ao_led_init API change
[fw/altos] / src / drivers / ao_lco_bits.c
index b2124d1b533e786140b925b5b27bc7f97874bcc5..6e50e44db4f8bec93edf71a42ab72a8f940f64c2 100644 (file)
@@ -20,20 +20,28 @@ uint8_t             ao_lco_debug;
 
 uint8_t                ao_lco_pad;
 int16_t                ao_lco_box;
-uint8_t                ao_lco_drag_race;
 
-uint8_t                ao_lco_armed;   /* arm active */
-uint8_t                ao_lco_firing;  /* fire active */
+uint8_t                ao_lco_armed;                                   /* arm active */
+uint8_t                ao_lco_firing;                                  /* fire active */
 
 uint8_t                ao_lco_min_box, ao_lco_max_box;
-uint8_t                ao_lco_selected[AO_PAD_MAX_BOXES];
-uint8_t                ao_lco_valid[AO_PAD_MAX_BOXES];
-uint8_t                ao_lco_channels[AO_PAD_MAX_BOXES];
-uint16_t       ao_lco_tick_offset[AO_PAD_MAX_BOXES];
 
-struct ao_pad_query    ao_pad_query;
+#if AO_LCO_DRAG
+uint8_t                ao_lco_drag_race;
+#endif
+
+struct ao_pad_query    ao_pad_query;                           /* latest query response */
+
+static uint8_t         ao_lco_channels[AO_PAD_MAX_BOXES];      /* pad channels available on each box */
+static uint16_t                ao_lco_tick_offset[AO_PAD_MAX_BOXES];   /* offset from local to remote tick count */
+static uint8_t         ao_lco_selected[AO_PAD_MAX_BOXES];      /* pads selected to fire */
+
+#define AO_LCO_VALID_LAST      1
+#define AO_LCO_VALID_EVER      2
 
-static AO_LED_TYPE     continuity_led[AO_LED_CONTINUITY_NUM] = {
+static 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] = {
 #ifdef AO_LED_CONTINUITY_0
        AO_LED_CONTINUITY_0,
 #endif
@@ -68,9 +76,11 @@ ao_lco_igniter_status(void)
        uint8_t         t = 0;
 
        for (;;) {
+#if AO_LCO_DRAG
                if (ao_lco_drag_race)
                        ao_sleep_for(&ao_pad_query, AO_MS_TO_TICKS(50));
                else
+#endif
                        ao_sleep(&ao_pad_query);
                PRINTD("RSSI %d VALID %d\n", ao_radio_cmac_rssi, ao_lco_valid[ao_lco_box]);
                if (!(ao_lco_valid[ao_lco_box] & AO_LCO_VALID_LAST)) {
@@ -98,6 +108,7 @@ ao_lco_igniter_status(void)
                        else
                                status = AO_PAD_IGNITER_STATUS_NO_IGNITER_RELAY_OPEN;
 
+#if AO_LCO_DRAG
                        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) {
@@ -111,7 +122,9 @@ ao_lco_igniter_status(void)
                                        ao_led_on(continuity_led[c]);
                                else
                                        ao_led_off(continuity_led[c]);
-                       } else {
+                       } else
+#endif
+                       {
                                if (status == AO_PAD_IGNITER_STATUS_GOOD_IGNITER_RELAY_OPEN)
                                        ao_led_on(continuity_led[c]);
                                else
@@ -170,11 +183,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();
        }
 }
 
@@ -200,6 +212,23 @@ ao_lco_box_set_present(uint8_t box)
        ao_lco_box_mask[AO_LCO_MASK_ID(box)] |= 1 << AO_LCO_MASK_SHIFT(box);
 }
 
+void
+ao_lco_set_pad(uint8_t new_pad)
+{
+       ao_lco_pad = new_pad;
+       ao_lco_show();
+}
+
+void
+ao_lco_set_box(uint16_t new_box)
+{
+       ao_lco_box = new_box;
+       if (ao_lco_box < AO_PAD_MAX_BOXES)
+               ao_lco_channels[ao_lco_box] = 0;
+       ao_lco_pad = 1;
+       ao_lco_show();
+}
+
 void
 ao_lco_step_pad(int8_t dir)
 {
@@ -215,10 +244,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
@@ -227,6 +253,7 @@ ao_lco_set_armed(uint8_t armed)
        ao_lco_armed = armed;
        PRINTD("Armed %d\n", ao_lco_armed);
        if (ao_lco_armed) {
+#if AO_LCO_DRAG
                if (ao_lco_drag_race) {
                        uint8_t box;
 
@@ -235,7 +262,9 @@ ao_lco_set_armed(uint8_t armed)
                                        break;
                        if (box > ao_lco_max_box)
                                ao_lco_armed = 0;
-               } else {
+               } else
+#endif
+               {
                        memset(ao_lco_selected, 0, sizeof (ao_lco_selected));
                        if (ao_lco_pad != 0)
                                ao_lco_selected[ao_lco_box] = (1 << (ao_lco_pad - 1));
@@ -254,17 +283,6 @@ ao_lco_set_firing(uint8_t firing)
        ao_wakeup(&ao_lco_armed);
 }
 
-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)
 {
@@ -274,10 +292,11 @@ ao_lco_search(void)
        uint8_t         boxes = 0;
 
        ao_lco_box_reset_present();
-       ao_lco_set_pad(0);
+       ao_lco_show_box(0);
+       ao_lco_show_pad(0);
        for (box = 0; box < AO_PAD_MAX_BOXES; box++) {
                if ((box % 10) == 0)
-                       ao_lco_set_box(box);
+                       ao_lco_show_box(box);
                for (try = 0; try < 3; try++) {
                        ao_lco_tick_offset[box] = 0;
                        r = ao_lco_query(box, &ao_pad_query, &ao_lco_tick_offset[box]);
@@ -285,7 +304,7 @@ ao_lco_search(void)
                        if (r == AO_RADIO_CMAC_OK) {
                                ++boxes;
                                ao_lco_box_set_present(box);
-                               ao_lco_set_pad(boxes % 10);
+                               ao_lco_show_pad(boxes % 10);
                                ao_delay(AO_MS_TO_TICKS(30));
                                break;
                        }
@@ -297,8 +316,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_box(ao_lco_min_box);
 }
 
 void
@@ -336,6 +354,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 +375,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 +440,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();
        }
 }
 
@@ -423,7 +455,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();
        }
 }
 
@@ -447,6 +479,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