altos/telelco*: Make LCO voltage display work on 2.0 and 3.0
authorKeith Packard <keithp@keithp.com>
Mon, 8 Jan 2024 04:13:04 +0000 (20:13 -0800)
committerKeith Packard <keithp@keithp.com>
Thu, 1 Feb 2024 01:50:19 +0000 (17:50 -0800)
Fix up the common code to handle LCO voltage display via box 0

Signed-off-by: Keith Packard <keithp@keithp.com>
src/drivers/ao_lco.c
src/drivers/ao_lco.h
src/drivers/ao_lco_bits.c
src/telelco-v0.2-cc1200/ao_pins.h
src/telelco-v0.2/ao_pins.h
src/telelco-v0.3/ao_pins.h
src/telelco-v2.0/ao_lco_v2.c

index bc8f7b48f7788949ba6ea1cdcb4314b19dddb668..d8cf7ba3df9e2ad53d984a4d423d2b393eafc496 100644 (file)
@@ -34,8 +34,6 @@
 #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_BOX_DRAG                0x1000
-
 /* UI values */
 static AO_TICK_TYPE    ao_lco_fire_tick;
 static uint8_t ao_lco_fire_down;
@@ -110,17 +108,6 @@ ao_lco_show(void)
        }
 }
 
-uint8_t
-ao_lco_box_present(uint16_t box)
-{
-       if (box == AO_LCO_BOX_DRAG)
-               return 1;
-
-       if (box >= AO_PAD_MAX_BOXES)
-               return 0;
-       return (ao_lco_box_mask[AO_LCO_MASK_ID(box)] >> AO_LCO_MASK_SHIFT(box)) & 1;
-}
-
 static struct ao_task  ao_lco_drag_task;
 static uint8_t         ao_lco_drag_active;
 
@@ -187,29 +174,6 @@ ao_lco_drag_monitor(void)
        }
 }
 
-static void
-ao_lco_step_box(int8_t dir)
-{
-       int32_t new_box = (int32_t) ao_lco_box;
-       do {
-               if (new_box == AO_LCO_BOX_DRAG) {
-                       if (dir < 0)
-                               new_box = ao_lco_max_box;
-                       else
-                               new_box = ao_lco_min_box;
-               } else {
-                       new_box += dir;
-                       if (new_box > ao_lco_max_box)
-                               new_box = AO_LCO_BOX_DRAG;
-                       else if (new_box < ao_lco_min_box)
-                               new_box = AO_LCO_BOX_DRAG;
-               }
-               if (new_box == (int32_t) ao_lco_box)
-                       break;
-       } while (!ao_lco_box_present((uint16_t) new_box));
-       ao_lco_set_box((uint16_t) new_box);
-}
-
 static void
 ao_lco_input(void)
 {
index 75ff5684ba863bc32b872d622b232fc3b7ea0a91..8f77a8e8e7732fd4d8e1012e1f4ddb3054742a70 100644 (file)
@@ -46,9 +46,32 @@ extern uint8_t       ao_lco_firing;          /* fire button pressed */
 
 extern struct ao_pad_query     ao_pad_query;   /* Last received QUERY from pad */
 
+#ifdef AO_LCO_DRAG_RACE_BOX
+#define AO_LCO_BOX_DRAG                0               /* Box number to enable drag race mode (old LCO bits) */
+#define AO_LCO_BOX_FIRST       AO_LCO_BOX_DRAG
+#else
 #define AO_LCO_LCO_VOLTAGE     0               /* Box number to show LCO voltage */
+#define AO_LCO_BOX_FIRST       AO_LCO_LCO_VOLTAGE
+#endif
 #define AO_LCO_PAD_VOLTAGE     0               /* Pad number to show box voltage */
 
+static inline bool
+ao_lco_box_pseudo(uint16_t box)
+{
+       switch (box) {
+#ifdef AO_LCO_LCO_VOLTAGE
+       case AO_LCO_LCO_VOLTAGE:
+               return true;
+#endif
+#ifdef AO_LCO_DRAG_RACE_BOX
+       case AO_LCO_BOX_DRAG:
+               return true;
+#endif
+       default:
+               return false;
+       }
+}
+
 extern uint16_t        ao_lco_min_box, ao_lco_max_box;
 
 #define AO_LCO_MASK_SIZE(n)    (((n) + 7) >> 3)
index eca39d5bfe2e7aed9699293f3c15d02b6bc3135d..a89254d7005db37a31158b72703aecd0988f6f1c 100644 (file)
@@ -84,7 +84,7 @@ ao_lco_igniter_status(void)
                else
 #endif
                        ao_sleep(&ao_pad_query);
-               if (ao_lco_box == AO_LCO_LCO_VOLTAGE) {
+               if (ao_lco_box_pseudo(ao_lco_box)) {
                        ao_led_off(AO_LED_GREEN|AO_LED_AMBER|AO_LED_RED);
                        continue;
                }
@@ -184,7 +184,7 @@ ao_lco_get_channels(uint16_t box, struct ao_pad_query *query)
 void
 ao_lco_update(void)
 {
-       if (ao_lco_box == AO_LCO_LCO_VOLTAGE) {
+       if (ao_lco_box_pseudo(ao_lco_box)) {
                ao_lco_show();
                return;
        }
@@ -235,8 +235,7 @@ void
 ao_lco_set_box(uint16_t new_box)
 {
        ao_lco_box = new_box;
-       if (ao_lco_box != AO_LCO_LCO_VOLTAGE)
-       {
+       if (!ao_lco_box_pseudo(ao_lco_box)) {
                if (ao_lco_box < AO_PAD_MAX_BOXES) {
                        if (ao_lco_pretending)
                                ao_lco_channels[ao_lco_box] = 0xff;
@@ -269,7 +268,7 @@ ao_lco_step_pad(int8_t dir)
 uint8_t
 ao_lco_box_present(uint16_t box)
 {
-       if (box == AO_LCO_LCO_VOLTAGE)
+       if (ao_lco_box_pseudo(box))
                return 1;
        if (box >= AO_PAD_MAX_BOXES)
                return 0;
@@ -284,7 +283,7 @@ ao_lco_step_box(int8_t dir)
        do {
                new_box += dir;
                if (new_box > ao_lco_max_box)
-                       new_box = AO_LCO_LCO_VOLTAGE;
+                       new_box = AO_LCO_BOX_FIRST;
                else if (new_box < 0)
                        new_box = ao_lco_max_box;
                if (new_box == ao_lco_box)
@@ -296,7 +295,7 @@ ao_lco_step_box(int8_t dir)
 void
 ao_lco_set_armed(uint8_t armed)
 {
-       if (ao_lco_box == AO_LCO_LCO_VOLTAGE)
+       if (ao_lco_box_pseudo(ao_lco_box))
                return;
 
        ao_lco_armed = armed;
@@ -459,7 +458,7 @@ ao_lco_drag_add_beeps(uint8_t beeps)
 void
 ao_lco_toggle_drag(void)
 {
-       if (ao_lco_drag_race && ao_lco_pad != AO_LCO_PAD_VOLTAGE && ao_lco_box != AO_LCO_LCO_VOLTAGE) {
+       if (ao_lco_drag_race && ao_lco_pad != AO_LCO_PAD_VOLTAGE && !ao_lco_box_pseudo(ao_lco_box)) {
                ao_lco_selected[ao_lco_box] ^= (uint8_t) (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]);
index b434e7cb4b374aac2fb79ff90f13cc63ee31673e..b5bb8703c2cf10ca36c87b538a1a9072e4aa2326 100644 (file)
@@ -324,4 +324,6 @@ struct ao_adc {
  */
 #define AO_ADC_REFERENCE_DV    33
 
+#define AO_LCO_DRAG_RACE_BOX   1
+
 #endif /* _AO_PINS_H_ */
index 3d06a647246d4f6523195d94c447fadeede5687a..ed4b585910968a86bb5fc209db6a9eb8a3be0e12 100644 (file)
 
 #define AO_BUTTON_FIRE         1
 
+#define AO_LCO_DRAG_RACE_BOX   1
+
 #endif /* _AO_PINS_H_ */
index de89d746a41bb55e35c036e3cba74d91c9e9cf07..71049dd7dfea1af4e172ef1b8b43dd8fb409d175 100644 (file)
 
 #define AO_BUTTON_FIRE         1
 
+#define AO_LCO_DRAG_RACE_BOX   1
+
 #endif /* _AO_PINS_H_ */
index 78849bc9b43bc00f551a70133aef6fbdcd66327a..59b621039f87ce983d67afebbac753c5ebd1af02 100644 (file)
@@ -91,10 +91,23 @@ ao_lco_show_voltage(uint16_t decivolts)
        ao_mutex_put(&ao_lco_display_mutex);
 }
 
+static void
+ao_lco_show_lco_voltage(void)
+{
+       struct ao_adc   packet;
+       int16_t         decivolt;
+
+       ao_adc_single_get(&packet);
+       decivolt = ao_battery_decivolt(packet.v_batt);
+       ao_lco_show_voltage((uint16_t) decivolt);
+}
+
 void
 ao_lco_show(void)
 {
-       if (ao_lco_pad == AO_LCO_PAD_VOLTAGE) {
+       if (ao_lco_box == AO_LCO_LCO_VOLTAGE) {
+               ao_lco_show_lco_voltage();
+       } else if (ao_lco_pad == AO_LCO_PAD_VOLTAGE) {
                ao_lco_show_voltage(ao_pad_query.battery);
        } else {
                ao_lco_show_pad(ao_lco_pad);
@@ -102,14 +115,6 @@ ao_lco_show(void)
        }
 }
 
-uint8_t
-ao_lco_box_present(uint16_t box)
-{
-       if (box >= AO_PAD_MAX_BOXES)
-               return 0;
-       return (ao_lco_box_mask[AO_LCO_MASK_ID(box)] >> AO_LCO_MASK_SHIFT(box)) & 1;
-}
-
 static void
 ao_lco_set_select(void)
 {
@@ -132,23 +137,6 @@ ao_lco_set_select(void)
        }
 }
 
-static void
-ao_lco_step_box(int8_t dir)
-{
-       int32_t new_box = (int32_t) ao_lco_box;
-
-       do {
-               new_box += dir;
-               if (new_box > ao_lco_max_box)
-                       new_box = ao_lco_min_box;
-               else if (new_box < ao_lco_min_box)
-                       new_box = ao_lco_max_box;
-               if (new_box == ao_lco_box)
-                       break;
-       } while (!ao_lco_box_present((uint16_t) new_box));
-       ao_lco_set_box((uint16_t) new_box);
-}
-
 static struct ao_task  ao_lco_drag_task;
 
 static void
@@ -254,12 +242,7 @@ ao_lco_display_test(void)
 static void
 ao_lco_batt_voltage(void)
 {
-       struct ao_adc   packet;
-       int16_t         decivolt;
-
-       ao_adc_single_get(&packet);
-       decivolt = ao_battery_decivolt(packet.v_batt);
-       ao_lco_show_voltage((uint16_t) decivolt);
+       ao_lco_show_lco_voltage();
        ao_delay(AO_MS_TO_TICKS(1000));
 }