summaryrefslogtreecommitdiff
path: root/firmware/logf.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/logf.c')
-rw-r--r--firmware/logf.c58
1 files changed, 48 insertions, 10 deletions
diff --git a/firmware/logf.c b/firmware/logf.c
index 9599547907..539c2af9da 100644
--- a/firmware/logf.c
+++ b/firmware/logf.c
@@ -20,10 +20,23 @@
20 ****************************************************************************/ 20 ****************************************************************************/
21 21
22/* 22/*
23 * logf() logs MAX_LOGF_ENTRY (21) bytes per entry in a circular buffer. Each 23 * logf() logs MAX_LOGF_ENTRY (29) bytes per entry in a circular buffer. Each
24 * logged string is space- padded for easier and faster output on screen. Just 24 * logged string is space- padded for easier and faster output on screen. Just
25 * output MAX_LOGF_ENTRY characters on each line. MAX_LOGF_ENTRY bytes fit 25 * output MAX_LOGF_ENTRY characters on each line. MAX_LOGF_ENTRY bytes fit
26 * nicely on the iRiver remote LCD (128 pixels with an 8x6 pixels font). 26 * nicely on the iRiver remote LCD (128 pixels with an 8x6 pixels font).
27 *
28 * When the length of log exceeds MAX_LOGF_ENTRY bytes, dividing into the
29 * string of length is MAX_LOGF_ENTRY-1 bytes.
30 *
31 * logfbuffer[*]:
32 *
33 * |<- MAX_LOGF_ENTRY bytes ->|1|
34 * | log data area |T|
35 *
36 * T : log terminate flag
37 * == LOGF_TERMINATE_ONE_LINE(0x00) : log data end (one line)
38 * == LOGF_TERMINATE_CONTINUE_LINE(0x01) : log data continues
39 * == LOGF_TERMINATE_MULTI_LINE(0x02) : log data end (multi line)
27 */ 40 */
28 41
29#include <string.h> 42#include <string.h>
@@ -43,7 +56,7 @@
43#ifdef ROCKBOX_HAS_LOGF 56#ifdef ROCKBOX_HAS_LOGF
44 57
45#ifndef __PCTOOL__ 58#ifndef __PCTOOL__
46unsigned char logfbuffer[MAX_LOGF_LINES][MAX_LOGF_ENTRY]; 59unsigned char logfbuffer[MAX_LOGF_LINES][MAX_LOGF_ENTRY+1];
47int logfindex; 60int logfindex;
48bool logfwrap; 61bool logfwrap;
49#endif 62#endif
@@ -84,6 +97,15 @@ static void displayremote(void)
84#define displayremote() 97#define displayremote()
85#endif 98#endif
86 99
100static void check_logfindex(void)
101{
102 if(logfindex >= MAX_LOGF_LINES) {
103 /* wrap */
104 logfwrap = true;
105 logfindex = 0;
106 }
107}
108
87#ifdef __PCTOOL__ 109#ifdef __PCTOOL__
88void _logf(const char *format, ...) 110void _logf(const char *format, ...)
89{ 111{
@@ -98,17 +120,17 @@ void _logf(const char *format, ...)
98void _logf(const char *format, ...) 120void _logf(const char *format, ...)
99{ 121{
100 int len; 122 int len;
123 int tlen;
124 unsigned char buf[MAX_LOGF_ONE_LINE_SIZE];
101 unsigned char *ptr; 125 unsigned char *ptr;
102 va_list ap; 126 va_list ap;
127 bool multiline = false;
128
103 va_start(ap, format); 129 va_start(ap, format);
130 vsnprintf(buf, MAX_LOGF_ONE_LINE_SIZE, format, ap);
131 va_end(ap);
104 132
105 if(logfindex >= MAX_LOGF_LINES) { 133 len = strlen(buf);
106 /* wrap */
107 logfwrap = true;
108 logfindex = 0;
109 }
110 ptr = logfbuffer[logfindex];
111 len = vsnprintf(ptr, MAX_LOGF_ENTRY, format, ap);
112#ifdef HAVE_SERIAL 134#ifdef HAVE_SERIAL
113 serial_tx(ptr); 135 serial_tx(ptr);
114 serial_tx("\r\n"); 136 serial_tx("\r\n");
@@ -118,10 +140,26 @@ void _logf(const char *format, ...)
118 usb_serial_send("\r\n",2); 140 usb_serial_send("\r\n",2);
119#endif 141#endif
120 142
121 va_end(ap); 143 tlen = 0;
144 check_logfindex();
145 while(len > MAX_LOGF_ENTRY)
146 {
147 ptr = logfbuffer[logfindex];
148 strncpy(ptr, buf + tlen, MAX_LOGF_ENTRY);
149 ptr[MAX_LOGF_ENTRY] = LOGF_TERMINATE_CONTINUE_LINE;
150 logfindex++;
151 check_logfindex();
152 len -= MAX_LOGF_ENTRY;
153 tlen += MAX_LOGF_ENTRY;
154 multiline = true;
155 }
156 ptr = logfbuffer[logfindex];
157 strcpy(ptr, buf + tlen);
158
122 if(len < MAX_LOGF_ENTRY) 159 if(len < MAX_LOGF_ENTRY)
123 /* pad with spaces up to the MAX_LOGF_ENTRY byte border */ 160 /* pad with spaces up to the MAX_LOGF_ENTRY byte border */
124 memset(ptr+len, ' ', MAX_LOGF_ENTRY-len); 161 memset(ptr+len, ' ', MAX_LOGF_ENTRY-len);
162 ptr[MAX_LOGF_ENTRY] = (multiline)?LOGF_TERMINATE_MULTI_LINE:LOGF_TERMINATE_ONE_LINE;
125 163
126 logfindex++; /* leave it where we write the next time */ 164 logfindex++; /* leave it where we write the next time */
127 165