summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/ao_log.h6
-rw-r--r--src/core/ao_pyro.c19
-rw-r--r--src/core/ao_pyro.h4
3 files changed, 28 insertions, 1 deletions
diff --git a/src/core/ao_log.h b/src/core/ao_log.h
index eaaca444..4eaed420 100644
--- a/src/core/ao_log.h
+++ b/src/core/ao_log.h
@@ -197,15 +197,18 @@ struct ao_log_mega {
uint8_t csum; /* 1 */
uint16_t tick; /* 2 */
union { /* 4 */
+ /* AO_LOG_FLIGHT */
struct {
uint16_t flight; /* 4 */
int16_t ground_accel; /* 6 */
uint32_t ground_pres; /* 8 */
} flight; /* 12 */
+ /* AO_LOG_STATE */
struct {
uint16_t state;
uint16_t reason;
} state;
+ /* AO_LOG_SENSOR */
struct {
uint32_t pres; /* 4 */
uint32_t temp; /* 8 */
@@ -220,12 +223,14 @@ struct ao_log_mega {
int16_t mag_z; /* 28 */
int16_t accel; /* 30 */
} sensor; /* 32 */
+ /* AO_LOG_TEMP_VOLT */
struct {
int16_t v_batt; /* 4 */
int16_t v_pbatt; /* 6 */
int16_t n_sense; /* 8 */
int16_t sense[10]; /* 10 */
} volt; /* 30 */
+ /* AO_LOG_GPS_TIME */
struct {
int32_t latitude; /* 4 */
int32_t longitude; /* 8 */
@@ -239,6 +244,7 @@ struct ao_log_mega {
uint8_t day; /* 20 */
uint8_t pad; /* 21 */
} gps; /* 22 */
+ /* AO_LOG_GPS_SAT */
struct {
uint16_t channels; /* 4 */
struct {
diff --git a/src/core/ao_pyro.c b/src/core/ao_pyro.c
index 4f37e979..aac8fda5 100644
--- a/src/core/ao_pyro.c
+++ b/src/core/ao_pyro.c
@@ -113,6 +113,15 @@ ao_pyro_ready(struct ao_pyro *pyro)
/* handled separately */
continue;
+ case ao_pyro_state_less:
+ if (ao_flight_state < pyro->state_less)
+ continue;
+ break;
+ case ao_pyro_state_greater_or_equal:
+ if (ao_flight_state >= pyro->state_greater_or_equal)
+ continue;
+ break;
+
default:
continue;
}
@@ -166,7 +175,7 @@ uint8_t ao_pyro_wakeup;
static void
ao_pyro(void)
{
- uint8_t p;
+ uint8_t p, any_waiting;
struct ao_pyro *pyro;
ao_config_get();
@@ -177,6 +186,7 @@ ao_pyro(void)
ao_alarm(AO_MS_TO_TICKS(100));
ao_sleep(&ao_pyro_wakeup);
ao_clear_alarm();
+ any_waiting = 0;
for (p = 0; p < AO_PYRO_NUM; p++) {
pyro = &ao_config.pyro[p];
@@ -190,6 +200,7 @@ ao_pyro(void)
if (!pyro->flags)
continue;
+ any_waiting = 1;
/* Check pyro state to see if it shoule fire
*/
if (!pyro->delay_done) {
@@ -213,7 +224,10 @@ ao_pyro(void)
ao_pyro_fire(p);
}
+ if (!any_waiting)
+ break;
}
+ ao_exit();
}
__xdata struct ao_task ao_pyro_task;
@@ -257,6 +271,9 @@ const struct {
{ "t<", ao_pyro_time_less, offsetof(struct ao_pyro, time_less), HELP("time less (s * 100)") },
{ "t>", ao_pyro_time_greater, offsetof(struct ao_pyro, time_greater), HELP("time greater (s * 100)") },
+ { "f<", ao_pyro_state_less, offsetof(struct ao_pyro, state_less), HELP("state less") },
+ { "f>=",ao_pyro_state_greater_or_equal, offsetof(struct ao_pyro, state_greater_or_equal), HELP("state greater or equal") },
+
{ "A", ao_pyro_ascending, NO_VALUE, HELP("ascending") },
{ "D", ao_pyro_descending, NO_VALUE, HELP("descending") },
diff --git a/src/core/ao_pyro.h b/src/core/ao_pyro.h
index 5deb69d0..cde850ad 100644
--- a/src/core/ao_pyro.h
+++ b/src/core/ao_pyro.h
@@ -42,6 +42,9 @@ enum ao_pyro_flag {
ao_pyro_after_motor = 0x00001000,
ao_pyro_delay = 0x00002000,
+
+ ao_pyro_state_less = 0x00004000,
+ ao_pyro_state_greater_or_equal = 0x00008000,
};
struct ao_pyro {
@@ -52,6 +55,7 @@ struct ao_pyro {
int16_t orient_less, orient_greater;
int16_t time_less, time_greater;
int16_t delay;
+ uint8_t state_less, state_greater_or_equal;
int16_t motor;
uint16_t delay_done;
uint8_t fired;