]> www.fi.muni.cz Git - bike-lights.git/blob - firmware/logging.c
logging.c: shorten the log buffer
[bike-lights.git] / firmware / logging.c
1 #ifdef USE_LOGGING
2
3 #include <avr/io.h>
4 #include <avr/eeprom.h>
5
6 #include "lights.h"
7
8 #define LOG_BUFFER 64
9 static unsigned char log_buffer_ee[LOG_BUFFER] EEMEM;
10 static unsigned char log_buffer_count;
11 static unsigned char log_buffer[LOG_BUFFER];
12 static unsigned char log_state EEMEM;
13 /* Upper 4 bits are reset count, lower 4 bits are reset reason from MCUSR */
14 static unsigned char reboot_count EEMEM = 0;
15 static unsigned char can_write_eeprom = 0;
16 static uint16_t flushed_end;
17
18 void log_set_state(unsigned char val)
19 {
20         if (can_write_eeprom)
21                 eeprom_write_byte(&log_state, val);
22 }
23
24 void init_log(unsigned char mcusr)
25 {
26         unsigned char r_count;
27
28         r_count = eeprom_read_byte(&reboot_count);
29         r_count >>= 4;
30
31         if (r_count < 5) {
32                 r_count++;
33                 eeprom_write_byte(&reboot_count,
34                         (r_count << 4) | (mcusr & 0xF));
35                 can_write_eeprom = 1;
36         } else {
37                 //eeprom_write_byte(&log_state, 0xFF);
38                 can_write_eeprom = 0;
39         }
40
41         log_set_state(1);
42         log_buffer_count = 0;
43         flushed_end = 0;
44 }
45
46 void log_byte(unsigned char byte) {
47         if (log_buffer_count >= LOG_BUFFER)
48                 return;
49         
50         // eeprom_write_word(&log_buffer[log_buffer_count], word);
51         log_buffer[log_buffer_count++] = byte;
52
53         if (log_buffer_count == LOG_BUFFER)
54                 log_flush();
55 }
56
57 void log_word(uint16_t word) {
58         log_byte(word & 0xFF);
59         log_byte(word >> 8);
60 }
61
62 void log_flush() {
63         unsigned char i;
64
65         if (!can_write_eeprom)
66                 return;
67
68         for (i=flushed_end; i < log_buffer_count; i++) {
69                 eeprom_write_byte(&log_buffer_ee[i],
70                         log_buffer[i]);
71         }
72
73         flushed_end = i;
74
75         if (flushed_end == LOG_BUFFER)
76                 log_set_state(0x42);
77 }
78
79 #endif
80