#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;
*/
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)
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();
}
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;
}
*/
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;
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
{
uint8_t slot;
uint8_t slots;
+ uint32_t log_current_pos, log_end_pos;
ao_cmd_decimal();
if (ao_cmd_status != ao_cmd_success)
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;
* 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;
}
#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