summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-05-26 19:39:13 -0600
committerKeith Packard <keithp@keithp.com>2013-05-26 19:39:13 -0600
commit956f4dff1cc521059434743624b1271fb92b96ae (patch)
tree77cde1601979643bc77f8103b2eec281f5d751c3
parent62547a042d042fadec652c5081f96816a8e66970 (diff)
altos: Light pyro charges simultaneously if so configured
Don't try to be nice to the battery, just let the pyro circuit deal with it and try to get all of the specified circuits going at the same time if they're configured to do so. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--src/core/ao_pyro.c49
-rw-r--r--src/test/ao_flight_test.c6
2 files changed, 31 insertions, 24 deletions
diff --git a/src/core/ao_pyro.c b/src/core/ao_pyro.c
index b3cda656..84f949dc 100644
--- a/src/core/ao_pyro.c
+++ b/src/core/ao_pyro.c
@@ -135,45 +135,38 @@ ao_pyro_ready(struct ao_pyro *pyro)
}
#ifndef AO_FLIGHT_TEST
-#define ao_pyro_fire_port(port, bit, pin) do { \
- ao_gpio_set(port, bit, pin, 1); \
- ao_delay(AO_MS_TO_TICKS(50)); \
- ao_gpio_set(port, bit, pin, 0); \
- } while (0)
-#endif
-
static void
-ao_pyro_fire(uint8_t p)
+ao_pyro_pin_set(uint8_t p, uint8_t v)
{
switch (p) {
#if AO_PYRO_NUM > 0
- case 0: ao_pyro_fire_port(AO_PYRO_PORT_0, AO_PYRO_PIN_0, AO_PYRO_0); break;
+ case 0: ao_gpio_set(AO_PYRO_PORT_0, AO_PYRO_PIN_0, AO_PYRO_0, v); break;
#endif
#if AO_PYRO_NUM > 1
- case 1: ao_pyro_fire_port(AO_PYRO_PORT_1, AO_PYRO_PIN_1, AO_PYRO_1); break;
+ case 1: ao_gpio_set(AO_PYRO_PORT_1, AO_PYRO_PIN_1, AO_PYRO_1, v); break;
#endif
#if AO_PYRO_NUM > 2
- case 2: ao_pyro_fire_port(AO_PYRO_PORT_2, AO_PYRO_PIN_2, AO_PYRO_2); break;
+ case 2: ao_gpio_set(AO_PYRO_PORT_2, AO_PYRO_PIN_2, AO_PYRO_2, v); break;
#endif
#if AO_PYRO_NUM > 3
- case 3: ao_pyro_fire_port(AO_PYRO_PORT_3, AO_PYRO_PIN_3, AO_PYRO_3); break;
+ case 3: ao_gpio_set(AO_PYRO_PORT_3, AO_PYRO_PIN_3, AO_PYRO_3, v); break;
#endif
#if AO_PYRO_NUM > 4
- case 4: ao_pyro_fire_port(AO_PYRO_PORT_4, AO_PYRO_PIN_4, AO_PYRO_4); break;
+ case 4: ao_gpio_set(AO_PYRO_PORT_4, AO_PYRO_PIN_4, AO_PYRO_4, v); break;
#endif
#if AO_PYRO_NUM > 5
- case 5: ao_pyro_fire_port(AO_PYRO_PORT_5, AO_PYRO_PIN_5, AO_PYRO_5); break;
+ case 5: ao_gpio_set(AO_PYRO_PORT_5, AO_PYRO_PIN_5, AO_PYRO_5, v); break;
#endif
#if AO_PYRO_NUM > 6
- case 6: ao_pyro_fire_port(AO_PYRO_PORT_6, AO_PYRO_PIN_6, AO_PYRO_6); break;
+ case 6: ao_gpio_set(AO_PYRO_PORT_6, AO_PYRO_PIN_6, AO_PYRO_6, v); break;
#endif
#if AO_PYRO_NUM > 7
- case 7: ao_pyro_fire_port(AO_PYRO_PORT_7, AO_PYRO_PIN_7, AO_PYRO_7); break;
+ case 7: ao_gpio_set(AO_PYRO_PORT_7, AO_PYRO_PIN_7, AO_PYRO_7, v); break;
#endif
default: break;
}
- ao_delay(AO_MS_TO_TICKS(50));
}
+#endif
uint8_t ao_pyro_wakeup;
@@ -182,6 +175,7 @@ ao_pyro_check(void)
{
struct ao_pyro *pyro;
uint8_t p, any_waiting;
+ uint16_t fire = 0;
any_waiting = 0;
for (p = 0; p < AO_PYRO_NUM; p++) {
@@ -222,10 +216,25 @@ ao_pyro_check(void)
continue;
}
- ao_pyro_fire(p);
- pyro->fired = 1;
- ao_pyro_fired |= (1 << p);
+ fire |= (1 << p);
}
+
+ if (fire) {
+ for (p = 0; p < AO_PYRO_NUM; p++) {
+ if (fire & (1 << p))
+ ao_pyro_pin_set(p, 1);
+ }
+ ao_delay(AO_MS_TO_TICKS(50));
+ for (p = 0; p < AO_PYRO_NUM; p++) {
+ if (fire & (1 << p)) {
+ ao_pyro_pin_set(p, 0);
+ ao_config.pyro[p].fired = 1;
+ ao_pyro_fired |= (1 << p);
+ }
+ }
+ ao_delay(AO_MS_TO_TICKS(50));
+ }
+
return any_waiting;
}
diff --git a/src/test/ao_flight_test.c b/src/test/ao_flight_test.c
index 6e53d8e1..faf31aa7 100644
--- a/src/test/ao_flight_test.c
+++ b/src/test/ao_flight_test.c
@@ -273,13 +273,11 @@ uint16_t prev_tick;
#define AO_PYRO_3 3
static void
-ao_pyro_tell(int pin)
+ao_pyro_pin_set(uint8_t pin, uint8_t value)
{
- printf ("fire pyro %d\n", pin);
+ printf ("set pyro %d %d\n", pin, value);
}
-#define ao_pyro_fire_port(port,bit,pin) ao_pyro_tell(pin)
-
#include "ao_pyro.c"
#endif