static void
ao_lco_set_pad(uint8_t pad)
{
- ao_seven_segment_set(AO_LCO_PAD_DIGIT, pad + 1);
+ ao_seven_segment_set(AO_LCO_PAD_DIGIT, pad);
}
static void
ao_seven_segment_set(AO_LCO_BOX_DIGIT_10, box / 10);
}
+static void
+ao_lco_set_voltage(uint16_t decivolts)
+{
+ uint8_t tens, ones, tenths;
+
+ tenths = decivolts % 10;
+ ones = (decivolts / 10) % 10;
+ tens = (decivolts / 100) % 10;
+ ao_seven_segment_set(AO_LCO_PAD_DIGIT, tenths);
+ ao_seven_segment_set(AO_LCO_BOX_DIGIT_1, ones | 0x10);
+ ao_seven_segment_set(AO_LCO_BOX_DIGIT_10, tens);
+}
+
+static void
+ao_lco_set_display(void)
+{
+ if (ao_lco_pad == 0) {
+ ao_lco_set_voltage(ao_pad_query.battery);
+ } else {
+ ao_lco_set_pad(ao_lco_pad);
+ ao_lco_set_box(ao_lco_box);
+ }
+}
+
#define MASK_SIZE(n) (((n) + 7) >> 3)
#define MASK_ID(n) ((n) >> 3)
#define MASK_SHIFT(n) ((n) & 7)
{
if (!ao_lco_got_channels || !ao_pad_query.channels)
return pad == 0;
- if (pad >= AO_PAD_MAX_CHANNELS)
+ /* voltage measurement is always valid */
+ if (pad == 0)
+ return 1;
+ if (pad > AO_PAD_MAX_CHANNELS)
return 0;
- return (ao_pad_query.channels >> pad) & 1;
+ return (ao_pad_query.channels >> (pad - 1)) & 1;
}
static uint8_t
{
uint8_t pad;
- for (pad = 0; pad < AO_PAD_MAX_CHANNELS; pad++)
+ for (pad = 1; pad <= AO_PAD_MAX_CHANNELS; pad++)
if (ao_lco_pad_present(pad))
return pad;
return 0;
new_pad += dir;
if (new_pad > AO_PAD_MAX_CHANNELS)
new_pad = 0;
- else if (new_pad < 0)
- new_pad = AO_PAD_MAX_CHANNELS - 1;
+ if (new_pad < 0)
+ new_pad = AO_PAD_MAX_CHANNELS;
if (new_pad == ao_lco_pad)
break;
} while (!ao_lco_pad_present(new_pad));
if (new_pad != ao_lco_pad) {
ao_lco_pad = new_pad;
- ao_lco_set_pad(ao_lco_pad);
+ ao_lco_set_display();
}
}
break;
} while (!ao_lco_box_present(new_box));
if (ao_lco_box != new_box) {
ao_lco_box = new_box;
+ ao_lco_pad = 1;
ao_lco_got_channels = 0;
- ao_lco_set_box(ao_lco_box);
+ ao_lco_set_display();
}
}
break;
ao_lco_got_channels = 1;
ao_lco_valid = 1;
if (!c) {
- ao_lco_pad = ao_lco_pad_first();
- ao_lco_set_pad(ao_lco_pad);
+ if (ao_lco_pad != 0)
+ ao_lco_pad = ao_lco_pad_first();
+ ao_lco_set_display();
}
+ if (ao_lco_pad == 0)
+ ao_lco_set_display();
} else
ao_lco_valid = 0;
query.igniter_status[2],
query.igniter_status[3]);
#endif
+ PRINTD("ao_lco_update valid %d\n", ao_lco_valid);
ao_wakeup(&ao_pad_query);
}
int8_t r;
int8_t try;
uint8_t box;
+ uint8_t boxes = 0;
ao_lco_box_reset_present();
+ ao_lco_set_pad(0);
for (box = 0; box < AO_PAD_MAX_BOXES; box++) {
if ((box % 10) == 0)
ao_lco_set_box(box);
r = ao_lco_query(box, &ao_pad_query, &tick_offset);
PRINTD("box %d result %d\n", box, r);
if (r == AO_RADIO_CMAC_OK) {
+ ++boxes;
ao_lco_box_set_present(box);
+ ao_lco_set_pad(boxes % 10);
ao_delay(AO_MS_TO_TICKS(30));
break;
}
ao_lco_min_box = ao_lco_max_box = ao_lco_box = 0;
ao_lco_valid = 0;
ao_lco_got_channels = 0;
- ao_lco_pad = 0;
- ao_lco_set_pad(ao_lco_pad);
- ao_lco_set_box(ao_lco_box);
+ ao_lco_pad = 1;
+ ao_lco_set_display();
}
static void
for (;;) {
ao_sleep(&ao_pad_query);
+ PRINTD("RSSI %d VALID %d\n", ao_radio_cmac_rssi, ao_lco_valid);
if (!ao_lco_valid) {
ao_led_on(AO_LED_RED);
ao_led_off(AO_LED_GREEN|AO_LED_AMBER);
continue;
}
- PRINTD("RSSI %d\n", ao_radio_cmac_rssi);
if (ao_radio_cmac_rssi < -90) {
ao_led_on(AO_LED_AMBER);
ao_led_off(AO_LED_RED|AO_LED_GREEN);
ao_lco_box, ao_lco_pad, ao_lco_valid);
if (!ao_lco_valid)
ao_lco_update();
- if (ao_lco_valid)
- ao_lco_ignite(ao_lco_box, 1 << ao_lco_pad, ao_lco_tick_offset);
+ if (ao_lco_valid && ao_lco_pad)
+ ao_lco_ignite(ao_lco_box, 1 << (ao_lco_pad - 1), ao_lco_tick_offset);
} else if (ao_lco_armed) {
PRINTD("Arming box %d pad %d\n",
ao_lco_box, ao_lco_pad);
if (!ao_lco_valid)
ao_lco_update();
- ao_lco_arm(ao_lco_box, 1 << ao_lco_pad, ao_lco_tick_offset);
- ao_lco_update();
+ if (ao_lco_pad) {
+ ao_lco_arm(ao_lco_box, 1 << (ao_lco_pad - 1), ao_lco_tick_offset);
+ ao_delay(AO_MS_TO_TICKS(30));
+ ao_lco_update();
+ }
} else {
ao_lco_update();
}