/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright (C) 2002 by Alan Korr * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ****************************************************************************/ #include "config.h" #include "hwcompat.h" #include "lcd.h" #include "kernel.h" #include "thread.h" #include #include #include "file.h" #include "debug.h" #include "system.h" #include "font-player.h" #include "lcd-playersim.h" /*** definitions ***/ #define CHAR_WIDTH 6 #define CHAR_HEIGHT 8 #define ICON_HEIGHT 24 #define CHAR_PIXEL 4 #define BORDER_MARGIN 5 unsigned char lcd_buffer[2][11]; static int double_height=1; extern bool lcd_display_redraw; extern unsigned const char *lcd_ascii; void lcd_print_icon(int x, int icon_line, bool enable, char **icon) { int xpos = x; int ypos = icon_line*(ICON_HEIGHT+CHAR_HEIGHT*2*4); int row=0, col; int p=0, cp=0; struct coordinate points[LCD_WIDTH * LCD_HEIGHT]; struct coordinate clearpoints[LCD_WIDTH * LCD_HEIGHT]; while (icon[row]) { col=0; while (icon[row][col]) { switch(icon[row][col]) { case '*': if (enable) { /* set a dot */ points[p].x = xpos + col +BORDER_MARGIN; points[p].y = ypos+row +BORDER_MARGIN; p++; /* increase the point counter */ } else { /* clear a dot */ clearpoints[cp].x = xpos + col +BORDER_MARGIN; clearpoints[cp].y = ypos+row +BORDER_MARGIN; cp++; /* increase the point counter */ } break; case ' ': /* Clear bit */ /* clear a dot */ clearpoints[cp].x = xpos + col+BORDER_MARGIN; clearpoints[cp].y = ypos+row+BORDER_MARGIN; cp++; /* increase the point counter */ break; } col++; } row++; } drawdots(0, &clearpoints[0], cp); drawdots(1, &points[0], p); } void lcd_print_char(int x, int y) { int xpos = x * CHAR_WIDTH * CHAR_PIXEL; int ypos = y * CHAR_HEIGHT * CHAR_PIXEL + ICON_HEIGHT; int col, row; int p=0, cp=0; struct rectangle points[CHAR_HEIGHT*CHAR_WIDTH]; struct rectangle clearpoints[CHAR_HEIGHT*CHAR_WIDTH]; unsigned char ch=lcd_buffer[y][x]; if (double_height == 2 && y == 1) return; /* Second row can't be printed in double height. ??*/ /* Clear all char clearpoints[cp].x = xpos +BORDER_MARGIN; clearpoints[cp].y = ypos +BORDER_MARGIN; clearpoints[cp].width=CHAR_WIDTH*CHAR_PIXEL; clearpoints[cp].height=7*CHAR_PIXEL*double_height; cp++; */ for (col=0; col<5; col++) { for (row=0; row<7; row++) { char fontbit=(*font_player)[ch][col]&(1<=32 && *str<128) {DEBUGF("%c", *str);} else {DEBUGF("(0x%02x)", *str);} #endif lcd_buffer[y][x++]=lcd_ascii[*str++]; } DEBUGF("\")\n"); for (; x<11; x++) lcd_buffer[y][x]=lcd_ascii[' ']; lcd_update(); } void lcd_double_height(bool on) { double_height = 1; if (on) double_height = 2; lcd_display_redraw=true; lcd_update(); } void lcd_define_pattern(int which, char *pattern, int length) { int i, j; int pat = which / 8; char icon[8]; memset(icon, 0, sizeof icon); DEBUGF("Defining pattern %d:", pat); for (j = 0; j <= 5; j++) { for (i = 0; i < length; i++) { if ((pattern[i])&(1<<(j))) icon[5-j] |= (1<<(i)); } } for (i = 1; i <= 5; i++) { DEBUGF(" 0x%02x", icon[i]); (*font_player)[pat][i-1] = icon[i]; } DEBUGF("\n"); lcd_display_redraw=true; lcd_update(); } extern void lcd_puts(int x, int y, unsigned char *str); void lcd_putc(int x, int y, unsigned char ch) { DEBUGF("lcd_putc(%d, %d, %d '0x%02x')\n", x, y, ch, ch); lcd_buffer[y][x]=lcd_ascii[ch]; lcd_update(); }