forked from len0rd/rockbox
		
	Note: I left behind lcd_bitmap in features.txt, because removing it would require considerable work in the manual and the translations. Change-Id: Ia8ca7761f610d9332a0d22a7d189775fb15ec88a
		
			
				
	
	
		
			265 lines
		
	
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			265 lines
		
	
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /***************************************************************************
 | |
|  *             __________               __   ___.
 | |
|  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 | |
|  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 | |
|  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 | |
|  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 | |
|  *                     \/            \/     \/    \/            \/
 | |
|  * $Id$
 | |
|  *
 | |
|  * Copyright (C) 2005 Daniel Stenberg
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU General Public License
 | |
|  * as published by the Free Software Foundation; either version 2
 | |
|  * of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 | |
|  * KIND, either express or implied.
 | |
|  *
 | |
|  ****************************************************************************/
 | |
| #include "config.h"
 | |
| 
 | |
| #ifdef ROCKBOX_HAS_LOGF
 | |
| #include <file.h>
 | |
| #include <timefuncs.h>
 | |
| #include <string.h>
 | |
| #include <kernel.h>
 | |
| #include <action.h>
 | |
| 
 | |
| #include <lcd.h>
 | |
| #include <font.h>
 | |
| #include "menu.h"
 | |
| #include "logf.h"
 | |
| #include "settings.h"
 | |
| #include "logfdisp.h"
 | |
| #include "action.h"
 | |
| #include "splash.h"
 | |
| 
 | |
| int compute_nb_lines(int w, struct font* font)
 | |
| {
 | |
|     int i, nb_lines;
 | |
|     int cur_x, delta_x;
 | |
| 
 | |
|     if(logfindex == 0 && !logfwrap)
 | |
|         return 0;
 | |
| 
 | |
|     if(logfwrap)
 | |
|         i = logfindex;
 | |
|     else
 | |
|         i = 0;
 | |
|     
 | |
|     cur_x = 0;
 | |
|     nb_lines = 0;
 | |
|         
 | |
|     do {
 | |
|         if(logfbuffer[i] == '\0')
 | |
|         {
 | |
|             cur_x = 0;
 | |
|             nb_lines++;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             /* does character fit on this line ? */
 | |
|             delta_x = font_get_width(font, logfbuffer[i]);
 | |
|             
 | |
|             if(cur_x + delta_x > w)
 | |
|             {
 | |
|                 cur_x = 0;
 | |
|                 nb_lines++;
 | |
|             }
 | |
|             
 | |
|             /* update pointer */
 | |
|             cur_x += delta_x;
 | |
|         }
 | |
| 
 | |
|         i++;
 | |
|         if(i >= MAX_LOGF_SIZE)
 | |
|             i = 0;
 | |
|     } while(i != logfindex);
 | |
|     
 | |
|     return nb_lines;
 | |
| }
 | |
| 
 | |
| bool logfdisplay(void)
 | |
| {
 | |
|     int action;
 | |
|     int w, h, i, index;
 | |
|     int fontnr;
 | |
|     int cur_x, cur_y, delta_y, delta_x;
 | |
|     struct font* font;
 | |
|     int user_index;/* user_index will be number of the first line to display (warning: line!=logf entry) */
 | |
|     char buf[2];
 | |
|     
 | |
|     fontnr = lcd_getfont();
 | |
|     font = font_get(fontnr);
 | |
|     
 | |
|     /* get the horizontal size of each line */
 | |
|     font_getstringsize("A", NULL, &delta_y, fontnr);
 | |
|     
 | |
|     buf[1] = '\0';
 | |
|     w = LCD_WIDTH;
 | |
|     h = LCD_HEIGHT;
 | |
|     /* start at the end of the log */
 | |
|     user_index = compute_nb_lines(w, font) - h/delta_y -1; /* if negative, will be set 0 to zero later */
 | |
| 
 | |
|     do {
 | |
|         lcd_clear_display();
 | |
|         
 | |
|         if(user_index < 0)
 | |
|             user_index = 0;
 | |
|         
 | |
|         if(logfwrap)
 | |
|             i = logfindex;
 | |
|         else
 | |
|             i = 0;
 | |
|         
 | |
|         index = 0;
 | |
|         cur_x = 0;
 | |
|         cur_y = 0;
 | |
|         
 | |
|         /* nothing to print ? */
 | |
|         if(logfindex == 0 && !logfwrap)
 | |
|             goto end_print;
 | |
|         
 | |
|         do {
 | |
|             if(logfbuffer[i] == '\0')
 | |
|             {
 | |
|                 /* should be display a newline ? */
 | |
|                 if(index >= user_index)
 | |
|                     cur_y += delta_y;
 | |
|                 cur_x = 0;
 | |
|                 index++;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 /* does character fit on this line ? */
 | |
|                 delta_x = font_get_width(font, logfbuffer[i]);
 | |
|                 
 | |
|                 if(cur_x + delta_x > w)
 | |
|                 {
 | |
|                     /* should be display a newline ? */
 | |
|                     if(index >= user_index)
 | |
|                         cur_y += delta_y;
 | |
|                     cur_x = 0;
 | |
|                     index++;
 | |
|                 }
 | |
|                 
 | |
|                 /* should we print character ? */
 | |
|                 if(index >= user_index)
 | |
|                 {
 | |
|                     buf[0] = logfbuffer[i];
 | |
|                     lcd_putsxy(cur_x, cur_y, buf);
 | |
|                 }
 | |
|                 
 | |
|                 /* update pointer */
 | |
|                 cur_x += delta_x;
 | |
|             }
 | |
|             
 | |
|             /* did we fill the screen ? */
 | |
|             if(cur_y > h)
 | |
|                 break;
 | |
|             
 | |
|             i++;
 | |
|             if(i >= MAX_LOGF_SIZE)
 | |
|                 i = 0;
 | |
|         } while(i != logfindex);
 | |
|         
 | |
|         end_print:
 | |
|         lcd_update();
 | |
|         
 | |
|         action = get_action(CONTEXT_STD, HZ);
 | |
|         switch( action )
 | |
|         {
 | |
|             case ACTION_STD_NEXT:
 | |
|             case ACTION_STD_NEXTREPEAT:
 | |
|                 user_index++;
 | |
|                 break;
 | |
|             case ACTION_STD_PREV:
 | |
|             case ACTION_STD_PREVREPEAT:
 | |
|                 user_index--;
 | |
|                 break;
 | |
|             case ACTION_STD_OK:
 | |
|                 user_index = 0;
 | |
|                 break;
 | |
| #ifdef HAVE_TOUCHSCREEN
 | |
|             case ACTION_TOUCHSCREEN:
 | |
|             {
 | |
|                 short x, y;
 | |
|                 static int prev_y;
 | |
|                 
 | |
|                 action = action_get_touchscreen_press(&x, &y);
 | |
|                 
 | |
|                 if(action & BUTTON_REL)
 | |
|                     prev_y = 0;
 | |
|                 else
 | |
|                 {
 | |
|                     if(prev_y != 0)
 | |
|                         user_index += (prev_y - y) / delta_y;
 | |
|                     
 | |
|                     prev_y = y;
 | |
|                 }
 | |
|             }
 | |
| #endif
 | |
|             default:
 | |
|                 break;
 | |
|         }
 | |
|     } while(action != ACTION_STD_CANCEL);
 | |
| 
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool logfdump(void)
 | |
| {
 | |
|     int fd;
 | |
| #if CONFIG_RTC
 | |
|     struct tm *nowtm;
 | |
|     char fname[MAX_PATH];
 | |
| #endif
 | |
| 
 | |
|     splashf(HZ, "Log File Dumped");
 | |
| 
 | |
|     /* nothing to print ? */
 | |
|     if(logfindex == 0 && !logfwrap)
 | |
|         /* nothing is logged just yet */
 | |
|         return false;
 | |
| 
 | |
|     logfenabled = false;
 | |
| 
 | |
| #if CONFIG_RTC
 | |
|     nowtm = get_time();
 | |
|     snprintf(fname, MAX_PATH, "%s/logf_%04d%02d%02d%02d%02d%02d.txt", ROCKBOX_DIR,
 | |
|              nowtm->tm_year + 1900, nowtm->tm_mon + 1, nowtm->tm_mday,
 | |
|              nowtm->tm_hour, nowtm->tm_min, nowtm->tm_sec);
 | |
|     fd = open(fname, O_CREAT|O_WRONLY|O_TRUNC);
 | |
| #else
 | |
|     fd = open(ROCKBOX_DIR "/logf.txt", O_CREAT|O_WRONLY|O_TRUNC, 0666);
 | |
| #endif
 | |
|     if(-1 != fd) {
 | |
|         int i;
 | |
| 
 | |
|         if(logfwrap)
 | |
|             i = logfindex;
 | |
|         else
 | |
|             i = 0;
 | |
| 
 | |
|         do {
 | |
|             if(logfbuffer[i]=='\0')
 | |
|                 fdprintf(fd, "\n");
 | |
|             else
 | |
|                 fdprintf(fd, "%c", logfbuffer[i]);
 | |
| 
 | |
|             i++;
 | |
|             if(i >= MAX_LOGF_SIZE)
 | |
|                 i = 0;
 | |
|         } while(i != logfindex);
 | |
| 
 | |
|         close(fd);
 | |
|     }
 | |
| 
 | |
|     logfenabled = true;
 | |
| 
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| #endif /* ROCKBOX_HAS_LOGF */
 |