altos/telegps: Create new flight if current flight is erased
[fw/altos] / src / kernel / ao_log.c
index d60485e0d7f2fb962cda1f8c08ead66325b351e8..91617d93531842dfe50b8469d0304817c254eb04 100644 (file)
 #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;
 __pdata uint32_t ao_log_end_pos;
 __pdata uint32_t ao_log_start_pos;
@@ -38,13 +42,22 @@ ao_log_flush(void)
  */
 
 struct ao_log_erase {
-       uint8_t unused;
+       uint8_t mark;
        uint16_t flight;
 };
 
 static __xdata struct ao_log_erase erase;
 
+#ifndef LOG_MAX_ERASE
 #define LOG_MAX_ERASE  16
+#endif
+
+#ifndef LOG_ERASE_MARK
+#if USE_EEPROM_CONFIG
+#error "Must define LOG_ERASE_MARK with USE_EEPROM_CONFIG"
+#endif
+#define LOG_ERASE_MARK 0x00
+#endif
 
 static uint32_t
 ao_log_erase_pos(uint8_t i)
@@ -55,9 +68,21 @@ ao_log_erase_pos(uint8_t i)
 void
 ao_log_write_erase(uint8_t pos)
 {
-       erase.unused = 0x00;
+       erase.mark = LOG_ERASE_MARK;
        erase.flight = ao_flight_number;
        ao_config_write(ao_log_erase_pos(pos),  &erase, sizeof (erase));
+
+#if USE_EEPROM_CONFIG
+       if (pos == 0) {
+               uint8_t i;
+               for (i = 1; i < LOG_MAX_ERASE; i++) {
+                       erase.mark = ~LOG_ERASE_MARK;
+                       erase.flight = 0;
+                       ao_config_write(ao_log_erase_pos(i), &erase, sizeof (erase));
+               }
+       }
+#endif
+
        ao_config_flush();
 }
 
@@ -75,9 +100,9 @@ ao_log_erase_mark(void)
 
        for (i = 0; i < LOG_MAX_ERASE; i++) {
                ao_log_read_erase(i);
-               if (erase.unused == 0 && erase.flight == ao_flight_number)
+               if (erase.mark == LOG_ERASE_MARK && erase.flight == ao_flight_number)
                        return;
-               if (erase.unused == 0xff) {
+               if (erase.mark != LOG_ERASE_MARK) {
                        ao_log_write_erase(i);
                        return;
                }
@@ -136,7 +161,7 @@ ao_log_scan(void) __reentrant
         */
        for (log_slot = LOG_MAX_ERASE; log_slot-- > 0;) {
                ao_log_read_erase(log_slot);
-               if (erase.unused == 0) {
+               if (erase.mark == LOG_ERASE_MARK) {
                        if (ao_flight_number == 0 ||
                            (int16_t) (erase.flight - ao_flight_number) > 0)
                                ao_flight_number = erase.flight;
@@ -229,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)
@@ -239,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;
 
@@ -252,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;
                        }