From 1b8bc4e4aadd367c40d33afefb526f1c60c7d118 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 7 Jan 2024 20:13:04 -0800 Subject: [PATCH] altos/telelco*: Make LCO voltage display work on 2.0 and 3.0 Fix up the common code to handle LCO voltage display via box 0 Signed-off-by: Keith Packard --- src/drivers/ao_lco.c | 36 ----------------------- src/drivers/ao_lco.h | 23 +++++++++++++++ src/drivers/ao_lco_bits.c | 15 +++++----- src/telelco-v0.2-cc1200/ao_pins.h | 2 ++ src/telelco-v0.2/ao_pins.h | 2 ++ src/telelco-v0.3/ao_pins.h | 2 ++ src/telelco-v2.0/ao_lco_v2.c | 47 ++++++++++--------------------- 7 files changed, 51 insertions(+), 76 deletions(-) diff --git a/src/drivers/ao_lco.c b/src/drivers/ao_lco.c index bc8f7b48..d8cf7ba3 100644 --- a/src/drivers/ao_lco.c +++ b/src/drivers/ao_lco.c @@ -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) { diff --git a/src/drivers/ao_lco.h b/src/drivers/ao_lco.h index 75ff5684..8f77a8e8 100644 --- a/src/drivers/ao_lco.h +++ b/src/drivers/ao_lco.h @@ -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) diff --git a/src/drivers/ao_lco_bits.c b/src/drivers/ao_lco_bits.c index eca39d5b..a89254d7 100644 --- a/src/drivers/ao_lco_bits.c +++ b/src/drivers/ao_lco_bits.c @@ -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]); diff --git a/src/telelco-v0.2-cc1200/ao_pins.h b/src/telelco-v0.2-cc1200/ao_pins.h index b434e7cb..b5bb8703 100644 --- a/src/telelco-v0.2-cc1200/ao_pins.h +++ b/src/telelco-v0.2-cc1200/ao_pins.h @@ -324,4 +324,6 @@ struct ao_adc { */ #define AO_ADC_REFERENCE_DV 33 +#define AO_LCO_DRAG_RACE_BOX 1 + #endif /* _AO_PINS_H_ */ diff --git a/src/telelco-v0.2/ao_pins.h b/src/telelco-v0.2/ao_pins.h index 3d06a647..ed4b5859 100644 --- a/src/telelco-v0.2/ao_pins.h +++ b/src/telelco-v0.2/ao_pins.h @@ -276,4 +276,6 @@ #define AO_BUTTON_FIRE 1 +#define AO_LCO_DRAG_RACE_BOX 1 + #endif /* _AO_PINS_H_ */ diff --git a/src/telelco-v0.3/ao_pins.h b/src/telelco-v0.3/ao_pins.h index de89d746..71049dd7 100644 --- a/src/telelco-v0.3/ao_pins.h +++ b/src/telelco-v0.3/ao_pins.h @@ -274,4 +274,6 @@ #define AO_BUTTON_FIRE 1 +#define AO_LCO_DRAG_RACE_BOX 1 + #endif /* _AO_PINS_H_ */ diff --git a/src/telelco-v2.0/ao_lco_v2.c b/src/telelco-v2.0/ao_lco_v2.c index 78849bc9..59b62103 100644 --- a/src/telelco-v2.0/ao_lco_v2.c +++ b/src/telelco-v2.0/ao_lco_v2.c @@ -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)); } -- 2.30.2