X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fkernel%2Fao_log.c;h=91617d93531842dfe50b8469d0304817c254eb04;hb=50aec54bdc35962145eff9b465f9cd7b3d9fea0b;hp=20febefe27f2df4693ad4cd02b6f31b96aaa20ea;hpb=24167015705ae831692b95735968b04a876f935e;p=fw%2Faltos diff --git a/src/kernel/ao_log.c b/src/kernel/ao_log.c index 20febefe..91617d93 100644 --- a/src/kernel/ao_log.c +++ b/src/kernel/ao_log.c @@ -18,7 +18,11 @@ #include "ao.h" #include #include +#if HAS_TRACKER +#include +#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; @@ -196,7 +221,11 @@ ao_log_full(void) return ao_log_current_pos == ao_log_end_pos; } -#if HAS_ADC +#ifndef LOG_ADC +#define LOG_ADC HAS_ADC +#endif + +#if LOG_ADC static __xdata struct ao_task ao_log_task; #endif @@ -225,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) @@ -235,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; @@ -248,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; } @@ -284,7 +320,7 @@ ao_log_init(void) #ifndef HAS_ADC #error Define HAS_ADC for ao_log.c #endif -#if HAS_ADC +#if LOG_ADC /* Create a task to log events to eeprom */ ao_add_task(&ao_log_task, ao_log, "log"); #endif