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