X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=logging.c;h=05716bf1050cdc6d4aa907e7bc3a8d90e181dc47;hb=f7cba12a75f10da7267c2e4d4488bb5ccddbb9d9;hp=04f9515ceddd067e7adb454641e1d8180d75c26a;hpb=4b93ea55987c25fcce022403a505ca1749dc329c;p=bike-lights.git diff --git a/logging.c b/logging.c index 04f9515..05716bf 100644 --- a/logging.c +++ b/logging.c @@ -6,20 +6,42 @@ #include "lights.h" #define LOG_BUFFER 128 -static unsigned char log_state EEMEM; static unsigned char log_buffer_ee[LOG_BUFFER] EEMEM; static unsigned char log_buffer_count; static unsigned char log_buffer[LOG_BUFFER]; +static unsigned char log_state EEMEM; +/* Upper 4 bits are reset count, lower 4 bits are reset reason from MCUSR */ +static unsigned char reboot_count EEMEM = 0; +static unsigned char can_write_eeprom = 0; +static uint16_t flushed_end; void log_set_state(unsigned char val) { - eeprom_write_byte(&log_state, val); + if (can_write_eeprom) + eeprom_write_byte(&log_state, val); } void log_init() { + unsigned char r_count; + + r_count = eeprom_read_byte(&reboot_count); + r_count >>= 4; + + if (r_count < 5) { + r_count++; + eeprom_write_byte(&reboot_count, + (r_count << 4) | (MCUSR & 0xF)); + MCUSR = 0; + can_write_eeprom = 1; + } else { + //eeprom_write_byte(&log_state, 0xFF); + can_write_eeprom = 0; + } + log_set_state(1); log_buffer_count = 0; + flushed_end = 0; } void log_byte(unsigned char byte) { @@ -41,12 +63,18 @@ void log_word(uint16_t word) { void log_flush() { unsigned char i; - log_buffer_count = LOG_BUFFER; - for (i=0; i < LOG_BUFFER; i++) { + if (!can_write_eeprom) + return; + + for (i=flushed_end; i < log_buffer_count; i++) { eeprom_write_byte(&log_buffer_ee[i], log_buffer[i]); } - log_set_state(0x42); + + flushed_end = i; + + if (flushed_end == LOG_BUFFER) + log_set_state(0x42); } #endif