Skip to content

Commit 1b8bc4e

Browse files
committed
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 <[email protected]>
1 parent 6d3b9ca commit 1b8bc4e

File tree

7 files changed

+51
-76
lines changed

7 files changed

+51
-76
lines changed

src/drivers/ao_lco.c

-36
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@
3434
#define AO_LCO_DRAG_RACE_START_TIME AO_SEC_TO_TICKS(5)
3535
#define AO_LCO_DRAG_RACE_STOP_TIME AO_SEC_TO_TICKS(2)
3636

37-
#define AO_LCO_BOX_DRAG 0x1000
38-
3937
/* UI values */
4038
static AO_TICK_TYPE ao_lco_fire_tick;
4139
static uint8_t ao_lco_fire_down;
@@ -110,17 +108,6 @@ ao_lco_show(void)
110108
}
111109
}
112110

113-
uint8_t
114-
ao_lco_box_present(uint16_t box)
115-
{
116-
if (box == AO_LCO_BOX_DRAG)
117-
return 1;
118-
119-
if (box >= AO_PAD_MAX_BOXES)
120-
return 0;
121-
return (ao_lco_box_mask[AO_LCO_MASK_ID(box)] >> AO_LCO_MASK_SHIFT(box)) & 1;
122-
}
123-
124111
static struct ao_task ao_lco_drag_task;
125112
static uint8_t ao_lco_drag_active;
126113

@@ -187,29 +174,6 @@ ao_lco_drag_monitor(void)
187174
}
188175
}
189176

190-
static void
191-
ao_lco_step_box(int8_t dir)
192-
{
193-
int32_t new_box = (int32_t) ao_lco_box;
194-
do {
195-
if (new_box == AO_LCO_BOX_DRAG) {
196-
if (dir < 0)
197-
new_box = ao_lco_max_box;
198-
else
199-
new_box = ao_lco_min_box;
200-
} else {
201-
new_box += dir;
202-
if (new_box > ao_lco_max_box)
203-
new_box = AO_LCO_BOX_DRAG;
204-
else if (new_box < ao_lco_min_box)
205-
new_box = AO_LCO_BOX_DRAG;
206-
}
207-
if (new_box == (int32_t) ao_lco_box)
208-
break;
209-
} while (!ao_lco_box_present((uint16_t) new_box));
210-
ao_lco_set_box((uint16_t) new_box);
211-
}
212-
213177
static void
214178
ao_lco_input(void)
215179
{

src/drivers/ao_lco.h

+23
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,32 @@ extern uint8_t ao_lco_firing; /* fire button pressed */
4646

4747
extern struct ao_pad_query ao_pad_query; /* Last received QUERY from pad */
4848

49+
#ifdef AO_LCO_DRAG_RACE_BOX
50+
#define AO_LCO_BOX_DRAG 0 /* Box number to enable drag race mode (old LCO bits) */
51+
#define AO_LCO_BOX_FIRST AO_LCO_BOX_DRAG
52+
#else
4953
#define AO_LCO_LCO_VOLTAGE 0 /* Box number to show LCO voltage */
54+
#define AO_LCO_BOX_FIRST AO_LCO_LCO_VOLTAGE
55+
#endif
5056
#define AO_LCO_PAD_VOLTAGE 0 /* Pad number to show box voltage */
5157

58+
static inline bool
59+
ao_lco_box_pseudo(uint16_t box)
60+
{
61+
switch (box) {
62+
#ifdef AO_LCO_LCO_VOLTAGE
63+
case AO_LCO_LCO_VOLTAGE:
64+
return true;
65+
#endif
66+
#ifdef AO_LCO_DRAG_RACE_BOX
67+
case AO_LCO_BOX_DRAG:
68+
return true;
69+
#endif
70+
default:
71+
return false;
72+
}
73+
}
74+
5275
extern uint16_t ao_lco_min_box, ao_lco_max_box;
5376

5477
#define AO_LCO_MASK_SIZE(n) (((n) + 7) >> 3)

src/drivers/ao_lco_bits.c

+7-8
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ ao_lco_igniter_status(void)
8484
else
8585
#endif
8686
ao_sleep(&ao_pad_query);
87-
if (ao_lco_box == AO_LCO_LCO_VOLTAGE) {
87+
if (ao_lco_box_pseudo(ao_lco_box)) {
8888
ao_led_off(AO_LED_GREEN|AO_LED_AMBER|AO_LED_RED);
8989
continue;
9090
}
@@ -184,7 +184,7 @@ ao_lco_get_channels(uint16_t box, struct ao_pad_query *query)
184184
void
185185
ao_lco_update(void)
186186
{
187-
if (ao_lco_box == AO_LCO_LCO_VOLTAGE) {
187+
if (ao_lco_box_pseudo(ao_lco_box)) {
188188
ao_lco_show();
189189
return;
190190
}
@@ -235,8 +235,7 @@ void
235235
ao_lco_set_box(uint16_t new_box)
236236
{
237237
ao_lco_box = new_box;
238-
if (ao_lco_box != AO_LCO_LCO_VOLTAGE)
239-
{
238+
if (!ao_lco_box_pseudo(ao_lco_box)) {
240239
if (ao_lco_box < AO_PAD_MAX_BOXES) {
241240
if (ao_lco_pretending)
242241
ao_lco_channels[ao_lco_box] = 0xff;
@@ -269,7 +268,7 @@ ao_lco_step_pad(int8_t dir)
269268
uint8_t
270269
ao_lco_box_present(uint16_t box)
271270
{
272-
if (box == AO_LCO_LCO_VOLTAGE)
271+
if (ao_lco_box_pseudo(box))
273272
return 1;
274273
if (box >= AO_PAD_MAX_BOXES)
275274
return 0;
@@ -284,7 +283,7 @@ ao_lco_step_box(int8_t dir)
284283
do {
285284
new_box += dir;
286285
if (new_box > ao_lco_max_box)
287-
new_box = AO_LCO_LCO_VOLTAGE;
286+
new_box = AO_LCO_BOX_FIRST;
288287
else if (new_box < 0)
289288
new_box = ao_lco_max_box;
290289
if (new_box == ao_lco_box)
@@ -296,7 +295,7 @@ ao_lco_step_box(int8_t dir)
296295
void
297296
ao_lco_set_armed(uint8_t armed)
298297
{
299-
if (ao_lco_box == AO_LCO_LCO_VOLTAGE)
298+
if (ao_lco_box_pseudo(ao_lco_box))
300299
return;
301300

302301
ao_lco_armed = armed;
@@ -459,7 +458,7 @@ ao_lco_drag_add_beeps(uint8_t beeps)
459458
void
460459
ao_lco_toggle_drag(void)
461460
{
462-
if (ao_lco_drag_race && ao_lco_pad != AO_LCO_PAD_VOLTAGE && ao_lco_box != AO_LCO_LCO_VOLTAGE) {
461+
if (ao_lco_drag_race && ao_lco_pad != AO_LCO_PAD_VOLTAGE && !ao_lco_box_pseudo(ao_lco_box)) {
463462
ao_lco_selected[ao_lco_box] ^= (uint8_t) (1 << (ao_lco_pad - 1));
464463
PRINTD("Toggle box %d pad %d (pads now %x) to drag race\n",
465464
ao_lco_pad, ao_lco_box, ao_lco_selected[ao_lco_box]);

src/telelco-v0.2-cc1200/ao_pins.h

+2
Original file line numberDiff line numberDiff line change
@@ -324,4 +324,6 @@ struct ao_adc {
324324
*/
325325
#define AO_ADC_REFERENCE_DV 33
326326

327+
#define AO_LCO_DRAG_RACE_BOX 1
328+
327329
#endif /* _AO_PINS_H_ */

src/telelco-v0.2/ao_pins.h

+2
Original file line numberDiff line numberDiff line change
@@ -276,4 +276,6 @@
276276

277277
#define AO_BUTTON_FIRE 1
278278

279+
#define AO_LCO_DRAG_RACE_BOX 1
280+
279281
#endif /* _AO_PINS_H_ */

src/telelco-v0.3/ao_pins.h

+2
Original file line numberDiff line numberDiff line change
@@ -274,4 +274,6 @@
274274

275275
#define AO_BUTTON_FIRE 1
276276

277+
#define AO_LCO_DRAG_RACE_BOX 1
278+
277279
#endif /* _AO_PINS_H_ */

src/telelco-v2.0/ao_lco_v2.c

+15-32
Original file line numberDiff line numberDiff line change
@@ -91,25 +91,30 @@ ao_lco_show_voltage(uint16_t decivolts)
9191
ao_mutex_put(&ao_lco_display_mutex);
9292
}
9393

94+
static void
95+
ao_lco_show_lco_voltage(void)
96+
{
97+
struct ao_adc packet;
98+
int16_t decivolt;
99+
100+
ao_adc_single_get(&packet);
101+
decivolt = ao_battery_decivolt(packet.v_batt);
102+
ao_lco_show_voltage((uint16_t) decivolt);
103+
}
104+
94105
void
95106
ao_lco_show(void)
96107
{
97-
if (ao_lco_pad == AO_LCO_PAD_VOLTAGE) {
108+
if (ao_lco_box == AO_LCO_LCO_VOLTAGE) {
109+
ao_lco_show_lco_voltage();
110+
} else if (ao_lco_pad == AO_LCO_PAD_VOLTAGE) {
98111
ao_lco_show_voltage(ao_pad_query.battery);
99112
} else {
100113
ao_lco_show_pad(ao_lco_pad);
101114
ao_lco_show_box(ao_lco_box);
102115
}
103116
}
104117

105-
uint8_t
106-
ao_lco_box_present(uint16_t box)
107-
{
108-
if (box >= AO_PAD_MAX_BOXES)
109-
return 0;
110-
return (ao_lco_box_mask[AO_LCO_MASK_ID(box)] >> AO_LCO_MASK_SHIFT(box)) & 1;
111-
}
112-
113118
static void
114119
ao_lco_set_select(void)
115120
{
@@ -132,23 +137,6 @@ ao_lco_set_select(void)
132137
}
133138
}
134139

135-
static void
136-
ao_lco_step_box(int8_t dir)
137-
{
138-
int32_t new_box = (int32_t) ao_lco_box;
139-
140-
do {
141-
new_box += dir;
142-
if (new_box > ao_lco_max_box)
143-
new_box = ao_lco_min_box;
144-
else if (new_box < ao_lco_min_box)
145-
new_box = ao_lco_max_box;
146-
if (new_box == ao_lco_box)
147-
break;
148-
} while (!ao_lco_box_present((uint16_t) new_box));
149-
ao_lco_set_box((uint16_t) new_box);
150-
}
151-
152140
static struct ao_task ao_lco_drag_task;
153141

154142
static void
@@ -254,12 +242,7 @@ ao_lco_display_test(void)
254242
static void
255243
ao_lco_batt_voltage(void)
256244
{
257-
struct ao_adc packet;
258-
int16_t decivolt;
259-
260-
ao_adc_single_get(&packet);
261-
decivolt = ao_battery_decivolt(packet.v_batt);
262-
ao_lco_show_voltage((uint16_t) decivolt);
245+
ao_lco_show_lco_voltage();
263246
ao_delay(AO_MS_TO_TICKS(1000));
264247
}
265248

0 commit comments

Comments
 (0)