summaryrefslogtreecommitdiff
path: root/src/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/ao_log.c22
-rw-r--r--src/kernel/ao_tracker.c43
-rw-r--r--src/kernel/ao_tracker.h6
3 files changed, 58 insertions, 13 deletions
diff --git a/src/kernel/ao_log.c b/src/kernel/ao_log.c
index d9c3e00f..91617d93 100644
--- a/src/kernel/ao_log.c
+++ b/src/kernel/ao_log.c
@@ -18,6 +18,9 @@
#include "ao.h"
#include <ao_log.h>
#include <ao_config.h>
+#if HAS_TRACKER
+#include <ao_tracker.h>
+#endif
__xdata uint8_t ao_log_mutex;
__pdata uint32_t ao_log_current_pos;
@@ -251,6 +254,7 @@ ao_log_delete(void) __reentrant
{
uint8_t slot;
uint8_t slots;
+ uint32_t log_current_pos, log_end_pos;
ao_cmd_decimal();
if (ao_cmd_status != ao_cmd_success)
@@ -261,10 +265,13 @@ ao_log_delete(void) __reentrant
if (ao_cmd_lex_i) {
for (slot = 0; slot < slots; slot++) {
if (ao_log_flight(slot) == ao_cmd_lex_i) {
+#if HAS_TRACKER
+ ao_tracker_erase_start(ao_cmd_lex_i);
+#endif
ao_log_erase_mark();
- ao_log_current_pos = ao_log_pos(slot);
- ao_log_end_pos = ao_log_current_pos + ao_config.flight_log_max;
- while (ao_log_current_pos < ao_log_end_pos) {
+ log_current_pos = ao_log_pos(slot);
+ log_end_pos = log_current_pos + ao_config.flight_log_max;
+ while (log_current_pos < log_end_pos) {
uint8_t i;
static __xdata uint8_t b;
@@ -274,15 +281,18 @@ ao_log_delete(void) __reentrant
* memory over and over again
*/
for (i = 0; i < 16; i++) {
- if (ao_storage_read(ao_log_current_pos + i, &b, 1))
+ if (ao_storage_read(log_current_pos + i, &b, 1))
if (b != 0xff)
break;
}
if (i == 16)
break;
- ao_storage_erase(ao_log_current_pos);
- ao_log_current_pos += ao_storage_block;
+ ao_storage_erase(log_current_pos);
+ log_current_pos += ao_storage_block;
}
+#if HAS_TRACKER
+ ao_tracker_erase_end();
+#endif
puts("Erased");
return;
}
diff --git a/src/kernel/ao_tracker.c b/src/kernel/ao_tracker.c
index a6ad87a3..9febc7f0 100644
--- a/src/kernel/ao_tracker.c
+++ b/src/kernel/ao_tracker.c
@@ -50,6 +50,7 @@ struct gps_position gps_position[GPS_RING];
static uint8_t gps_head;
+static uint8_t tracker_mutex;
static uint8_t log_started;
static struct ao_telemetry_location gps_data;
static uint8_t tracker_running;
@@ -100,17 +101,19 @@ ao_tracker(void)
tracker_running = 0;
}
- if (new_tracker_running && !tracker_running) {
+ if (new_tracker_running && !tracker_running)
ao_telemetry_set_interval(AO_SEC_TO_TICKS(tracker_interval));
- ao_log_start();
- } else if (!new_tracker_running && tracker_running) {
+ else if (!new_tracker_running && tracker_running)
ao_telemetry_set_interval(0);
- ao_log_stop();
- }
tracker_running = new_tracker_running;
- if (!tracker_running)
+ if (new_tracker_running && !ao_log_running)
+ ao_log_start();
+ else if (!new_tracker_running && ao_log_running)
+ ao_log_stop();
+
+ if (!ao_log_running)
continue;
if (new & AO_GPS_NEW_DATA) {
@@ -138,10 +141,11 @@ ao_tracker(void)
}
}
if (ao_tracker_force_telem) {
- printf ("moving %d\n", moving);
+ printf ("moving %d started %d\n", moving, log_started);
flush();
}
if (moving) {
+ ao_mutex_get(&tracker_mutex);
if (!log_started) {
ao_log_gps_flight();
log_started = 1;
@@ -151,12 +155,37 @@ ao_tracker(void)
gps_position[gps_head].longitude = gps_data.longitude;
gps_position[gps_head].altitude = gps_data.altitude;
gps_head = ao_gps_ring_next(gps_head);
+ ao_mutex_put(&tracker_mutex);
}
}
}
}
}
+static uint8_t erasing_current;
+
+void
+ao_tracker_erase_start(uint16_t flight)
+{
+ erasing_current = flight == ao_flight_number;
+ if (erasing_current) {
+ ao_mutex_get(&tracker_mutex);
+ ao_log_stop();
+ if (++ao_flight_number == 0)
+ ao_flight_number = 1;
+ }
+}
+
+void
+ao_tracker_erase_end(void)
+{
+ if (erasing_current) {
+ ao_log_scan();
+ log_started = 0;
+ ao_mutex_put(&tracker_mutex);
+ }
+}
+
static struct ao_task ao_tracker_task;
static void
diff --git a/src/kernel/ao_tracker.h b/src/kernel/ao_tracker.h
index a0fd2f49..78c40cb4 100644
--- a/src/kernel/ao_tracker.h
+++ b/src/kernel/ao_tracker.h
@@ -28,4 +28,10 @@
void
ao_tracker_init(void);
+void
+ao_tracker_erase_start(uint16_t flight);
+
+void
+ao_tracker_erase_end(void);
+
#endif /* _AO_TRACKER_H_ */