The unified diff between revisions [4f22e7ef..] and [9142f333..] is displayed below. It can also be downloaded as a raw diff.
This diff has been restricted to the following files: 'log.c'
# # old_revision [4f22e7ef7d3064e3b51a5b868a4722f3f13c747b] # new_revision [9142f3330490a5aa00c1686475633b620c2ef5e7] # # add_file "log.c" # content [dd8755b026f0047b95fa77ca6906ef13a3bc42a1] # ============================================================ --- /dev/null +++ log.c dd8755b026f0047b95fa77ca6906ef13a3bc42a1 @@ -0,0 +1,110 @@ +/* log.c */ + +#include "types.h" +#include "sdcard.h" +#include "uart.h" +#include "timer.h" +#include "log.h" + +/* This is shared with sdcard.c */ +bool log_enabled; + +char log_buffer[LOG_BUFFERSIZE]; +unsigned int log_bufferstart; +unsigned int log_bufferend; + +unsigned int log_generation; + +/* DO NOT call when the buffer is empty */ +/* This should be safe against writes to the buffer, as the writes only + * affect log_bufferend. So no blocking of interrupts is necessary. + */ +char log_get_byte(void) +{ + char i; + i = log_buffer[log_bufferstart++]; + log_bufferstart = log_bufferstart % LOG_BUFFERSIZE; + + return i; +} + +void log_put_byte(char c) +{ + if (!log_enabled) + return; + + /* If the buffer is full, we just discard data. + * Better than overrunning. + */ + if (((log_bufferend + 1) % LOG_BUFFERSIZE) == log_bufferstart) + return; + log_buffer[log_bufferend++] = c; + log_bufferend = log_bufferend % LOG_BUFFERSIZE; +#if 0 + putint(c); + putch(' '); +#endif +} + +void log_put_uint16(unsigned int i) +{ + log_put_byte(i & 0xff); + log_put_byte((i >> 8) & 0xff); +} + +void log_put_uint(unsigned int i) +{ + log_put_byte(i & 0xff); + log_put_byte((i >> 8) & 0xff); + log_put_byte((i >> 16) & 0xff); + log_put_byte((i >> 24) & 0xff); +} + +void log_put_header(unsigned int timestamp) +{ + log_put_uint(LOG_MAGIC); + log_put_uint(log_generation); + log_put_uint(timestamp); + log_put_uint(log_read_busytime()); +} + +void log_put_array(char *data, int length) +{ + int i; + + for (i = 0; i < length; i++) + log_put_byte(data[i]); +} + +void log_put_float(float f) +{ + union { + float f; + unsigned int i; + } data; + data.f = f; + log_put_uint(data.i); +} + +unsigned int log_busystamp; +unsigned int log_busytime; + +void log_mark_busy(void) +{ + unsigned int time = timer_read(); + log_busystamp = time; +} + +void log_mark_idle(void) +{ + unsigned int time = timer_read(); + unsigned int diff = time - log_busystamp; + log_busytime += diff; +} + +unsigned int log_read_busytime(void) +{ + unsigned int time = log_busytime; + log_busytime = 0; + return time; +}