[prev in list] [next in list] [prev in thread] [next in thread] 

List:       rockbox-cvs
Subject:    mcuelenaere: r19625 - in trunk: apps firmware firmware/export
From:       mailer () svn ! rockbox ! org
Date:       2008-12-31 17:01:00
Message-ID: 200812311701.mBVH10fM017136 () giant ! haxx ! se
[Download RAW message or body]

Date: 2008-12-31 18:01:00 +0100 (Wed, 31 Dec 2008)
New Revision: 19625

Log Message:
Commit FS#9733 (multiline logf) by Yoshihisa Uchida


Modified:
   trunk/apps/logfdisp.c
   trunk/firmware/export/logf.h
   trunk/firmware/logf.c

Modified: trunk/apps/logfdisp.c
===================================================================
--- trunk/apps/logfdisp.c	2008-12-31 10:02:35 UTC (rev 19624)
+++ trunk/apps/logfdisp.c	2008-12-31 17:01:00 UTC (rev 19625)
@@ -62,8 +62,8 @@
 #endif
              :LCD_WIDTH)/w;
 
-    if (columns > MAX_LOGF_ENTRY)
-        columns = MAX_LOGF_ENTRY;
+    if (columns > MAX_LOGF_ENTRY+1)
+        columns = MAX_LOGF_ENTRY+1;
             
     if(!lines)
         return false;
@@ -83,7 +83,12 @@
             }
         
             memcpy(buffer, logfbuffer[index], columns);
-            buffer[columns]=0;
+            if (logfbuffer[index][MAX_LOGF_ENTRY] == LOGF_TERMINATE_CONTINUE_LINE)
+                buffer[columns-1] = '>';
+            else if (logfbuffer[index][MAX_LOGF_ENTRY] == LOGF_TERMINATE_MULTI_LINE)
+                buffer[columns-1] = '\0';
+            buffer[columns] = '\0';
+        
             lcd_puts(0, i, buffer);
         }
         lcd_update();
@@ -113,24 +118,61 @@
     
     fd = open(ROCKBOX_DIR "/logf.txt", O_CREAT|O_WRONLY|O_TRUNC);
     if(-1 != fd) {
-        unsigned char buffer[MAX_LOGF_ENTRY +1];
+        unsigned char buffer[MAX_LOGF_ONE_LINE_SIZE +1];
+        unsigned char *ptr;
         int index = logfindex-1;
         int stop = logfindex;
+        int tindex;
+        bool dumpwrap = false;
+        bool multiline;
 
-
-        while(index != stop) {
+        while(!dumpwrap || (index >= stop)) {
             if(index < 0) {
                 if(logfwrap)
+                {
                     index = MAX_LOGF_LINES-1;
+                    dumpwrap = true;
+                }
                 else
                     break; /* done */
             }
+
+            multiline = false;
+            if (logfbuffer[index][MAX_LOGF_ENTRY] == LOGF_TERMINATE_MULTI_LINE)
+            {
+                multiline = true;
+                do {
+                    index--;
+                    if(index < 0) {
+                        if(logfwrap)
+                        {
+                            index = MAX_LOGF_LINES-1;
+                            dumpwrap = true;
+                        }
+                        else
+                            goto end_loop;
+                    }
+                } while(logfbuffer[index][MAX_LOGF_ENTRY] == LOGF_TERMINATE_CONTINUE_LINE);
+                index++;
+                if (index >= MAX_LOGF_LINES)
+                    index = 0;
+            }
+
+            tindex = index-1;
+            ptr = buffer;
+            do {
+                tindex++;
+                memcpy(ptr, logfbuffer[tindex], MAX_LOGF_ENTRY);
+                ptr += MAX_LOGF_ENTRY;
+                if (tindex >= MAX_LOGF_LINES)
+                    tindex = 0;
+            } while(logfbuffer[tindex][MAX_LOGF_ENTRY] == LOGF_TERMINATE_CONTINUE_LINE);
+            *ptr = '\0';
         
-            memcpy(buffer, logfbuffer[index], MAX_LOGF_ENTRY);
-            buffer[MAX_LOGF_ENTRY]=0;
             fdprintf(fd, "%s\n", buffer);
             index--;
         }
+end_loop:
         close(fd);
     }
     return false;

Modified: trunk/firmware/export/logf.h
===================================================================
--- trunk/firmware/export/logf.h	2008-12-31 10:02:35 UTC (rev 19624)
+++ trunk/firmware/export/logf.h	2008-12-31 17:01:00 UTC (rev 19625)
@@ -29,10 +29,14 @@
 
 #ifndef __PCTOOL__
 #define MAX_LOGF_LINES 1000
-#define MAX_LOGF_ENTRY 30
-#define MAX_LOGF_DATASIZE (MAX_LOGF_ENTRY*MAX_LOGF_LINES)
+#define MAX_LOGF_ENTRY 29
+#define MAX_LOGF_ONE_LINE_SIZE 200
 
-extern unsigned char logfbuffer[MAX_LOGF_LINES][MAX_LOGF_ENTRY];
+#define LOGF_TERMINATE_ONE_LINE      0x00
+#define LOGF_TERMINATE_CONTINUE_LINE 0x01
+#define LOGF_TERMINATE_MULTI_LINE    0x02
+
+extern unsigned char logfbuffer[MAX_LOGF_LINES][MAX_LOGF_ENTRY+1];
 extern int logfindex;
 extern bool logfwrap;
 #endif /* __PCTOOL__ */

Modified: trunk/firmware/logf.c
===================================================================
--- trunk/firmware/logf.c	2008-12-31 10:02:35 UTC (rev 19624)
+++ trunk/firmware/logf.c	2008-12-31 17:01:00 UTC (rev 19625)
@@ -20,10 +20,23 @@
  ****************************************************************************/
 
 /*
- * logf() logs MAX_LOGF_ENTRY (21) bytes per entry in a circular buffer. Each
+ * logf() logs MAX_LOGF_ENTRY (29) bytes per entry in a circular buffer. Each
  * logged string is space- padded for easier and faster output on screen. Just
  * output MAX_LOGF_ENTRY characters on each line. MAX_LOGF_ENTRY bytes fit
  * nicely on the iRiver remote LCD (128 pixels with an 8x6 pixels font).
+ *
+ * When the length of log exceeds MAX_LOGF_ENTRY bytes, dividing into the
+ * string of length is MAX_LOGF_ENTRY-1 bytes.
+ *
+ * logfbuffer[*]:
+ *
+ *    |<-   MAX_LOGF_ENTRY bytes   ->|1|
+ *    | log data area                |T|
+ *
+ *  T : log terminate flag
+ *   == LOGF_TERMINATE_ONE_LINE(0x00)      : log data end (one line)
+ *   == LOGF_TERMINATE_CONTINUE_LINE(0x01) : log data continues
+ *   == LOGF_TERMINATE_MULTI_LINE(0x02)    : log data end (multi line)
  */
 
 #include <string.h>
@@ -43,7 +56,7 @@
 #ifdef ROCKBOX_HAS_LOGF
 
 #ifndef __PCTOOL__
-unsigned char logfbuffer[MAX_LOGF_LINES][MAX_LOGF_ENTRY];
+unsigned char logfbuffer[MAX_LOGF_LINES][MAX_LOGF_ENTRY+1];
 int logfindex;
 bool logfwrap;
 #endif
@@ -84,6 +97,15 @@
 #define displayremote()
 #endif
 
+static void check_logfindex(void)
+{
+    if(logfindex >= MAX_LOGF_LINES) {
+        /* wrap */
+        logfwrap = true;
+        logfindex = 0;
+    }
+}
+
 #ifdef __PCTOOL__
 void _logf(const char *format, ...)
 {
@@ -98,17 +120,17 @@
 void _logf(const char *format, ...)
 {
     int len;
+    int tlen;
+    unsigned char buf[MAX_LOGF_ONE_LINE_SIZE];
     unsigned char *ptr;
     va_list ap;
+    bool multiline = false;
+
     va_start(ap, format);
+    vsnprintf(buf, MAX_LOGF_ONE_LINE_SIZE, format, ap);
+    va_end(ap);
 
-    if(logfindex >= MAX_LOGF_LINES) {
-        /* wrap */
-        logfwrap = true;
-        logfindex = 0;
-    }
-    ptr = logfbuffer[logfindex];
-    len = vsnprintf(ptr, MAX_LOGF_ENTRY, format, ap);
+    len = strlen(buf);
 #ifdef HAVE_SERIAL
     serial_tx(ptr);
     serial_tx("\r\n");
@@ -118,10 +140,26 @@
     usb_serial_send("\r\n",2);
 #endif
 
-    va_end(ap);
+    tlen = 0;
+    check_logfindex();
+    while(len > MAX_LOGF_ENTRY)
+    {
+        ptr = logfbuffer[logfindex];
+        strncpy(ptr, buf + tlen, MAX_LOGF_ENTRY);
+        ptr[MAX_LOGF_ENTRY] = LOGF_TERMINATE_CONTINUE_LINE;
+        logfindex++;
+        check_logfindex();
+        len -= MAX_LOGF_ENTRY;
+        tlen += MAX_LOGF_ENTRY;
+        multiline = true;
+    }
+    ptr = logfbuffer[logfindex];
+    strcpy(ptr, buf + tlen);
+
     if(len < MAX_LOGF_ENTRY)
         /* pad with spaces up to the MAX_LOGF_ENTRY byte border */
         memset(ptr+len, ' ', MAX_LOGF_ENTRY-len);
+    ptr[MAX_LOGF_ENTRY] = (multiline)?LOGF_TERMINATE_MULTI_LINE:LOGF_TERMINATE_ONE_LINE;
 
     logfindex++; /* leave it where we write the next time */
 

_______________________________________________
rockbox-cvs mailing list
rockbox-cvs@cool.haxx.se
http://cool.haxx.se/cgi-bin/mailman/listinfo/rockbox-cvs
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic