summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/drivers/ao_pad.c16
-rw-r--r--src/kernel/ao_log.c13
-rw-r--r--src/kernel/ao_log.h2
-rw-r--r--src/kernel/ao_pyro.c31
-rw-r--r--src/kernel/ao_tracker.c5
5 files changed, 54 insertions, 13 deletions
diff --git a/src/drivers/ao_pad.c b/src/drivers/ao_pad.c
index 144cbd70..dc2c83fe 100644
--- a/src/drivers/ao_pad.c
+++ b/src/drivers/ao_pad.c
@@ -362,14 +362,26 @@ ao_pad_test(void)
void
ao_pad_manual(void)
{
+ uint8_t ignite;
+ int repeat;
ao_cmd_white();
if (!ao_match_word("DoIt"))
return;
ao_cmd_decimal();
if (ao_cmd_status != ao_cmd_success)
return;
- ao_pad_ignite = 1 << ao_cmd_lex_i;
- ao_wakeup(&ao_pad_ignite);
+ ignite = 1 << ao_cmd_lex_i;
+ ao_cmd_decimal();
+ if (ao_cmd_status != ao_cmd_success) {
+ repeat = 1;
+ ao_cmd_status = ao_cmd_success;
+ } else
+ repeat = ao_cmd_lex_i;
+ while (repeat-- > 0) {
+ ao_pad_ignite = ignite;
+ ao_wakeup(&ao_pad_ignite);
+ ao_delay(AO_PAD_FIRE_TIME>>1);
+ }
}
static __xdata struct ao_task ao_pad_task;
diff --git a/src/kernel/ao_log.c b/src/kernel/ao_log.c
index dc3b6486..40a96ef7 100644
--- a/src/kernel/ao_log.c
+++ b/src/kernel/ao_log.c
@@ -192,12 +192,14 @@ ao_log_find_max_erase_flight(void) __reentrant
ao_flight_number = 1;
}
-void
+uint8_t
ao_log_scan(void) __reentrant
{
uint8_t log_slot;
uint8_t log_slots;
-#if !FLIGHT_LOG_APPEND
+#if FLIGHT_LOG_APPEND
+ uint8_t ret;
+#else
uint8_t log_want;
#endif
@@ -248,9 +250,13 @@ ao_log_scan(void) __reentrant
empty = ao_log_current_pos;
}
}
+ ret = 1;
} else {
ao_log_find_max_erase_flight();
+ ret = 0;
}
+ ao_wakeup(&ao_flight_number);
+ return ret;
#else
if (ao_flight_number)
@@ -278,8 +284,9 @@ ao_log_scan(void) __reentrant
if (++log_slot >= log_slots)
log_slot = 0;
} while (log_slot != log_want);
-#endif
ao_wakeup(&ao_flight_number);
+ return 0;
+#endif
}
void
diff --git a/src/kernel/ao_log.h b/src/kernel/ao_log.h
index c5fa7fab..c13a2580 100644
--- a/src/kernel/ao_log.h
+++ b/src/kernel/ao_log.h
@@ -72,7 +72,7 @@ ao_log(void);
/* functions provided in ao_log.c */
/* Figure out the current flight number */
-void
+uint8_t
ao_log_scan(void) __reentrant;
/* Return the position of the start of the given log slot */
diff --git a/src/kernel/ao_pyro.c b/src/kernel/ao_pyro.c
index 0b286466..3044d565 100644
--- a/src/kernel/ao_pyro.c
+++ b/src/kernel/ao_pyro.c
@@ -252,7 +252,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++) {
pyro = &ao_config.pyro[p];
@@ -288,6 +288,16 @@ ao_pyro_check(void)
* the delay to expire
*/
if (pyro->delay_done) {
+
+ /* Check to make sure the required conditions
+ * remain valid. If not, inhibit the channel
+ * by setting the fired bit
+ */
+ if (!ao_pyro_ready(pyro)) {
+ pyro->fired = 1;
+ continue;
+ }
+
if ((int16_t) (ao_time() - pyro->delay_done) < 0)
continue;
}
@@ -465,7 +475,7 @@ ao_pyro_set(void)
printf ("invalid pyro channel %d\n", p);
return;
}
- pyro_tmp.flags = 0;
+ memset(&pyro_tmp, '\0', sizeof (pyro_tmp));
for (;;) {
ao_cmd_white();
if (ao_cmd_lex_c == '\n')
@@ -489,13 +499,26 @@ ao_pyro_set(void)
}
pyro_tmp.flags |= ao_pyro_values[v].flag;
if (ao_pyro_values[v].offset != NO_VALUE) {
+ uint8_t negative = 0;
+ ao_cmd_white();
+ if (ao_cmd_lex_c == '-') {
+ negative = 1;
+ ao_cmd_lex();
+ }
ao_cmd_decimal();
if (ao_cmd_status != ao_cmd_success)
return;
- if (ao_pyro_values[v].flag & AO_PYRO_8_BIT_VALUE)
+ if (ao_pyro_values[v].flag & AO_PYRO_8_BIT_VALUE) {
+ if (negative) {
+ ao_cmd_status = ao_cmd_syntax_error;
+ return;
+ }
*((uint8_t *) ((char *) &pyro_tmp + ao_pyro_values[v].offset)) = ao_cmd_lex_i;
- else
+ } else {
+ if (negative)
+ ao_cmd_lex_i = -ao_cmd_lex_i;
*((int16_t *) ((char *) &pyro_tmp + ao_pyro_values[v].offset)) = ao_cmd_lex_i;
+ }
}
}
_ao_config_edit_start();
diff --git a/src/kernel/ao_tracker.c b/src/kernel/ao_tracker.c
index d9434048..9b007af8 100644
--- a/src/kernel/ao_tracker.c
+++ b/src/kernel/ao_tracker.c
@@ -72,7 +72,7 @@ ao_tracker(void)
#if !HAS_USB_CONNECT
ao_tracker_force_telem = 1;
#endif
- ao_log_scan();
+ log_started = ao_log_scan();
ao_rdf_set(1);
@@ -181,8 +181,7 @@ void
ao_tracker_erase_end(void)
{
if (erasing_current) {
- ao_log_scan();
- log_started = 0;
+ log_started = ao_log_scan();
ao_mutex_put(&tracker_mutex);
}
}