projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
[fw/altos]
/
src
/
drivers
/
ao_lco_bits.c
diff --git
a/src/drivers/ao_lco_bits.c
b/src/drivers/ao_lco_bits.c
index 197bf8aa3c6c5b974092e232e827a0b5458b7429..c88170b8c91dec772d36747715b955978d502de0 100644
(file)
--- a/
src/drivers/ao_lco_bits.c
+++ b/
src/drivers/ao_lco_bits.c
@@
-19,21
+19,29
@@
uint8_t ao_lco_debug;
uint8_t ao_lco_pad;
uint8_t ao_lco_debug;
uint8_t ao_lco_pad;
-int16_t ao_lco_box;
+uint16_t ao_lco_box;
+
+uint8_t ao_lco_armed; /* arm active */
+uint8_t ao_lco_firing; /* fire active */
+
+uint16_t ao_lco_min_box, ao_lco_max_box;
+
+#if AO_LCO_DRAG
uint8_t ao_lco_drag_race;
uint8_t ao_lco_drag_race;
+#endif
+
+struct ao_pad_query ao_pad_query; /* latest query response */
-uint8_t ao_lco_armed; /* arm active */
-uint8_t ao_lco_firing; /* fire active */
+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]; /* 16 bit offset from local to remote tick count */
+static uint8_t ao_lco_selected[AO_PAD_MAX_BOXES]; /* pads selected to fire */
-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];
+#define AO_LCO_VALID_LAST 1
+#define AO_LCO_VALID_EVER 2
-st
ruct ao_pad_query ao_pad_query;
+st
atic uint8_t ao_lco_valid[AO_PAD_MAX_BOXES]; /* AO_LCO_VALID bits per box */
-static
AO_LED_TYPE
continuity_led[AO_LED_CONTINUITY_NUM] = {
+static
const AO_LED_TYPE
continuity_led[AO_LED_CONTINUITY_NUM] = {
#ifdef AO_LED_CONTINUITY_0
AO_LED_CONTINUITY_0,
#endif
#ifdef AO_LED_CONTINUITY_0
AO_LED_CONTINUITY_0,
#endif
@@
-68,9
+76,11
@@
ao_lco_igniter_status(void)
uint8_t t = 0;
for (;;) {
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
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)) {
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;
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) {
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]);
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
if (status == AO_PAD_IGNITER_STATUS_GOOD_IGNITER_RELAY_OPEN)
ao_led_on(continuity_led[c]);
else
@@
-123,7
+136,7
@@
ao_lco_igniter_status(void)
}
uint8_t
}
uint8_t
-ao_lco_pad_present(uint
8
_t box, uint8_t pad)
+ao_lco_pad_present(uint
16
_t box, uint8_t pad)
{
/* voltage measurement is always valid */
if (pad == AO_LCO_PAD_VOLTAGE)
{
/* voltage measurement is always valid */
if (pad == AO_LCO_PAD_VOLTAGE)
@@
-136,7
+149,7
@@
ao_lco_pad_present(uint8_t box, uint8_t pad)
}
uint8_t
}
uint8_t
-ao_lco_pad_first(uint
8
_t box)
+ao_lco_pad_first(uint
16
_t box)
{
uint8_t pad;
{
uint8_t pad;
@@
-147,7
+160,7
@@
ao_lco_pad_first(uint8_t box)
}
static uint8_t
}
static uint8_t
-ao_lco_get_channels(uint
8
_t box, struct ao_pad_query *query)
+ao_lco_get_channels(uint
16
_t box, struct ao_pad_query *query)
{
int8_t r;
{
int8_t r;
@@
-156,7
+169,7
@@
ao_lco_get_channels(uint8_t box, struct ao_pad_query *query)
ao_lco_channels[box] = query->channels;
ao_lco_valid[box] = AO_LCO_VALID_LAST | AO_LCO_VALID_EVER;
} else
ao_lco_channels[box] = query->channels;
ao_lco_valid[box] = AO_LCO_VALID_LAST | AO_LCO_VALID_EVER;
} else
- ao_lco_valid[box] &= ~AO_LCO_VALID_LAST;
+ ao_lco_valid[box] &=
(uint8_t)
~AO_LCO_VALID_LAST;
PRINTD("ao_lco_get_channels(%d) rssi %d valid %d ret %d offset %d\n", box, ao_radio_cmac_rssi, ao_lco_valid[box], r, ao_lco_tick_offset[box]);
ao_wakeup(&ao_pad_query);
return ao_lco_valid[box];
PRINTD("ao_lco_get_channels(%d) rssi %d valid %d ret %d offset %d\n", box, ao_radio_cmac_rssi, ao_lco_valid[box], r, ao_lco_tick_offset[box]);
ao_wakeup(&ao_pad_query);
return ao_lco_valid[box];
@@
-188,7
+201,7
@@
ao_lco_box_reset_present(void)
}
static void
}
static void
-ao_lco_box_set_present(uint
8
_t box)
+ao_lco_box_set_present(uint
16
_t box)
{
if (box < ao_lco_min_box)
ao_lco_min_box = box;
{
if (box < ao_lco_min_box)
ao_lco_min_box = box;
@@
-196,7
+209,7
@@
ao_lco_box_set_present(uint8_t box)
ao_lco_max_box = box;
if (box >= AO_PAD_MAX_BOXES)
return;
ao_lco_max_box = box;
if (box >= AO_PAD_MAX_BOXES)
return;
- ao_lco_box_mask[AO_LCO_MASK_ID(box)] |=
1 << AO_LCO_MASK_SHIFT(box
);
+ ao_lco_box_mask[AO_LCO_MASK_ID(box)] |=
(uint8_t) (1 << AO_LCO_MASK_SHIFT(box)
);
}
void
}
void
@@
-210,9
+223,7
@@
void
ao_lco_set_box(uint16_t new_box)
{
ao_lco_box = new_box;
ao_lco_set_box(uint16_t new_box)
{
ao_lco_box = new_box;
-#if AO_LCO_DRAG
- if (ao_lco_box != AO_LCO_BOX_DRAG)
-#endif
+ if (ao_lco_box < AO_PAD_MAX_BOXES)
ao_lco_channels[ao_lco_box] = 0;
ao_lco_pad = 1;
ao_lco_show();
ao_lco_channels[ao_lco_box] = 0;
ao_lco_pad = 1;
ao_lco_show();
@@
-221,9
+232,9
@@
ao_lco_set_box(uint16_t new_box)
void
ao_lco_step_pad(int8_t dir)
{
void
ao_lco_step_pad(int8_t dir)
{
- int
8_t
new_pad;
+ int
16_t
new_pad;
- new_pad = ao_lco_pad;
+ new_pad =
(int16_t)
ao_lco_pad;
do {
new_pad += dir;
if (new_pad > AO_PAD_MAX_CHANNELS)
do {
new_pad += dir;
if (new_pad > AO_PAD_MAX_CHANNELS)
@@
-232,8
+243,8
@@
ao_lco_step_pad(int8_t dir)
new_pad = AO_PAD_MAX_CHANNELS;
if (new_pad == ao_lco_pad)
break;
new_pad = AO_PAD_MAX_CHANNELS;
if (new_pad == ao_lco_pad)
break;
- } while (!ao_lco_pad_present(ao_lco_box, new_pad));
- ao_lco_set_pad(new_pad);
+ } while (!ao_lco_pad_present(ao_lco_box,
(uint8_t)
new_pad));
+ ao_lco_set_pad(
(uint8_t)
new_pad);
}
void
}
void
@@
-242,15
+253,18
@@
ao_lco_set_armed(uint8_t armed)
ao_lco_armed = armed;
PRINTD("Armed %d\n", ao_lco_armed);
if (ao_lco_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) {
if (ao_lco_drag_race) {
- uint
8_t
box;
+ uint
16_t
box;
for (box = ao_lco_min_box; box <= ao_lco_max_box; box++)
if (ao_lco_selected[box])
break;
if (box > ao_lco_max_box)
ao_lco_armed = 0;
for (box = ao_lco_min_box; box <= ao_lco_max_box; box++)
if (ao_lco_selected[box])
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));
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));
@@
-308,8
+322,8
@@
ao_lco_search(void)
void
ao_lco_monitor(void)
{
void
ao_lco_monitor(void)
{
-
uint16_t
delay;
- uint
8_t
box;
+
AO_TICK_TYPE
delay;
+ uint
16_t
box;
for (;;) {
PRINTD("monitor armed %d firing %d\n",
for (;;) {
PRINTD("monitor armed %d firing %d\n",
@@
-344,8
+358,8
@@
ao_lco_monitor(void)
uint8_t ao_lco_drag_beep_count;
static uint8_t ao_lco_drag_beep_on;
uint8_t ao_lco_drag_beep_count;
static uint8_t ao_lco_drag_beep_on;
-static
uint16_t
ao_lco_drag_beep_time;
-static
uint16_t
ao_lco_drag_warn_time;
+static
AO_TICK_TYPE
ao_lco_drag_beep_time;
+static
AO_TICK_TYPE
ao_lco_drag_warn_time;
#define AO_LCO_DRAG_BEEP_TIME AO_MS_TO_TICKS(50)
#define AO_LCO_DRAG_WARN_TIME AO_SEC_TO_TICKS(5)
#define AO_LCO_DRAG_BEEP_TIME AO_MS_TO_TICKS(50)
#define AO_LCO_DRAG_WARN_TIME AO_SEC_TO_TICKS(5)
@@
-366,7
+380,7
@@
void
ao_lco_toggle_drag(void)
{
if (ao_lco_drag_race && ao_lco_pad != AO_LCO_PAD_VOLTAGE) {
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));
+ 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]);
ao_lco_drag_add_beeps(ao_lco_pad);
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);
@@
-377,14
+391,14
@@
ao_lco_toggle_drag(void)
* turn it on or off as necessary and bump the remaining beep counts
*/
* turn it on or off as necessary and bump the remaining beep counts
*/
-uint16_t
-ao_lco_drag_beep_check(
uint16_t now, uint16_t
delay)
+AO_TICK_TYPE
+ao_lco_drag_beep_check(
AO_TICK_TYPE now, AO_TICK_TYPE
delay)
{
{
- PRINTD("beep check count %d delta %d\n",
+ PRINTD("beep check count %d delta %
l
d\n",
ao_lco_drag_beep_count,
ao_lco_drag_beep_count,
- (
int16_t
) (now - ao_lco_drag_beep_time));
+ (
long) (AO_TICK_SIGNED
) (now - ao_lco_drag_beep_time));
if (ao_lco_drag_beep_count) {
if (ao_lco_drag_beep_count) {
- if ((
int16_t
) (now - ao_lco_drag_beep_time) >= 0) {
+ if ((
AO_TICK_SIGNED
) (now - ao_lco_drag_beep_time) >= 0) {
if (ao_lco_drag_beep_on) {
ao_beep(0);
PRINTD("beep stop\n");
if (ao_lco_drag_beep_on) {
ao_beep(0);
PRINTD("beep stop\n");
@@
-404,7
+418,7
@@
ao_lco_drag_beep_check(uint16_t now, uint16_t delay)
}
if (ao_lco_drag_beep_count) {
}
if (ao_lco_drag_beep_count) {
-
uint16_t
beep_delay = 0;
+
AO_TICK_TYPE
beep_delay = 0;
if (ao_lco_drag_beep_time > now)
beep_delay = ao_lco_drag_beep_time - now;
if (ao_lco_drag_beep_time > now)
beep_delay = ao_lco_drag_beep_time - now;
@@
-449,13
+463,13
@@
ao_lco_drag_disable(void)
* active
*/
* active
*/
-uint16_t
-ao_lco_drag_warn_check(
uint16_t now, uint16_t
delay)
+AO_TICK_TYPE
+ao_lco_drag_warn_check(
AO_TICK_TYPE now, AO_TICK_TYPE
delay)
{
if (ao_lco_drag_race) {
{
if (ao_lco_drag_race) {
-
uint16_t
warn_delay;
+
AO_TICK_TYPE
warn_delay;
- if ((
int16_t
) (now - ao_lco_drag_warn_time) >= 0) {
+ if ((
AO_TICK_SIGNED
) (now - ao_lco_drag_warn_time) >= 0) {
ao_lco_drag_add_beeps(1);
ao_lco_drag_warn_time = now + AO_LCO_DRAG_WARN_TIME;
}
ao_lco_drag_add_beeps(1);
ao_lco_drag_warn_time = now + AO_LCO_DRAG_WARN_TIME;
}