altos: Define ao_log_mutex in ao_log.c rather than every log product
[fw/altos] / src / kernel / ao_log.c
index 20febefe27f2df4693ad4cd02b6f31b96aaa20ea..d9c3e00f6ce2fb98a40016e161230aae88a02b5e 100644 (file)
@@ -19,6 +19,7 @@
 #include <ao_log.h>
 #include <ao_config.h>
 
+__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 +39,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 +65,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 +97,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 +158,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 +218,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
 
@@ -284,7 +310,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