From f49540acd48292bd9f68ded647561d0e800c619d Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 12 Jun 2014 23:59:37 -0700 Subject: [PATCH] altos/telegps: Create new flight if current flight is erased telegps is unique in that USB may be connected while a flight is active and sensible things should happen. If a flight is being recorded and gets erased, then a new flight should be started. This is done by hooking in the flight erase code and calling out to the tracker code to figure out whether to switch to a new flight or not. Signed-off-by: Keith Packard --- src/kernel/ao_log.c | 22 +++++++++++++++------ src/kernel/ao_tracker.c | 43 ++++++++++++++++++++++++++++++++++------- src/kernel/ao_tracker.h | 6 ++++++ 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 #include +#if HAS_TRACKER +#include +#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_ */ -- 2.30.2