diff --git a/apps/playlist.c b/apps/playlist.c index 44d1e34349..48c66dbc80 100644 --- a/apps/playlist.c +++ b/apps/playlist.c @@ -30,6 +30,13 @@ #include "lcd.h" #include "kernel.h" #include "settings.h" +#include "status.h" + +#ifdef HAVE_LCD_BITMAP +#define LINE_Y (global_settings.statusbar&&statusbar_enabled?1:0) /* Y position the entry-list starts at */ +#else /* HAVE_LCD_BITMAP */ +#define LINE_Y 0 /* Y position the entry-list starts at */ +#endif /* HAVE_LCD_BITMAP */ playlist_info_t playlist; @@ -165,7 +172,8 @@ void play_list(char *dir, char *file, int start_index) /* If file is NULL, the list is in RAM */ if(file) { lcd_clear_display(); - lcd_puts(0,0,"Loading..."); + lcd_puts(0,LINE_Y,"Loading..."); + status_draw(); lcd_update(); playlist.in_ram = false; } else { @@ -194,14 +202,16 @@ void play_list(char *dir, char *file, int start_index) if(global_settings.playlist_shuffle) { if(!playlist.in_ram) { - lcd_puts(0,0,"Shuffling..."); + lcd_puts(0,LINE_Y,"Shuffling..."); + status_draw(); lcd_update(); } randomise_playlist( current_tick ); } if(!playlist.in_ram) { - lcd_puts(0,0,"Playing... "); + lcd_puts(0,LINE_Y,"Playing... "); + status_draw(); lcd_update(); } /* also make the first song get playing */ @@ -287,7 +297,8 @@ void add_indices_to_playlist(void) next_tick = current_tick + HZ; snprintf(line, sizeof line, "%d files", playlist.amount); - lcd_puts(0,1,line); + lcd_puts(0,LINE_Y+1,line); + status_draw(); lcd_update(); } } @@ -301,7 +312,8 @@ void add_indices_to_playlist(void) } if(!playlist.in_ram) { snprintf(line, sizeof line, "%d files", playlist.amount); - lcd_puts(0,1,line); + lcd_puts(0,LINE_Y+1,line); + status_draw(); lcd_update(); close(fd); } diff --git a/apps/recorder/icons.c b/apps/recorder/icons.c index 50475eb8c9..482c764b52 100644 --- a/apps/recorder/icons.c +++ b/apps/recorder/icons.c @@ -19,6 +19,12 @@ #include #include "icons.h" +#ifndef SIMULATOR +#include "sprintf.h" +#endif +#ifdef HAVE_RTC +#include "rtc.h" +#endif #ifdef HAVE_LCD_BITMAP @@ -34,6 +40,12 @@ unsigned char slider_bar[] = 0x7c, 0x28, 0x28, 0x28, 0x28, 0x38 }; +static unsigned char bitmap_icon_5x8[][5] = +{ + /* Lock */ + {0x78,0x7f,0x49,0x7f,0x78} +}; + unsigned char bitmap_icons_6x8[LastIcon][6] = { /* Box_Filled */ @@ -58,6 +70,36 @@ unsigned char bitmap_icons_6x8[LastIcon][6] = { 0x7f, 0x3e, 0x1c, 0x08, 0x00, 0x00 }, }; +static unsigned char bitmap_icon_7x8[][7] = +{ + /* Power plug */ + {0x08,0x1c,0x1c,0x3e,0x3e,0x14,0x14}, + /* Speaker */ + {0x00,0x1c,0x1c,0x3e,0x7f,0x00,0x00}, + /* Speaker mute */ + {0x01,0x1e,0x1c,0x3e,0x7f,0x20,0x40}, + /* Play */ + {0x00,0x7f,0x7f,0x3e,0x1c,0x08,0x00}, + /* Stop */ + {0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f}, + /* Pause */ + {0x00,0x7f,0x7f,0x00,0x7f,0x7f,0x00}, + /* Fast forward */ + {0x7f,0x3e,0x1c,0x7f,0x3e,0x1c,0x08}, + /* Fast backward */ + {0x08,0x1c,0x3e,0x7f,0x1c,0x3e,0x7f}, + /* Record */ + {0x1c,0x3e,0x7f,0x7f,0x7f,0x3e,0x1c}, + /* Record pause */ + {0x1c,0x3e,0x7f,0x00,0x7f,0x3e,0x1c}, + /* Normal playmode */ + {0x08,0x08,0x08,0x08,0x3e,0x1c,0x08}, + /* Repeat playmode */ + {0x38,0x44,0x44,0x4e,0x5f,0x44,0x38}, + /* Shuffle playmode (dice) */ + {0x3e,0x41,0x51,0x41,0x45,0x41,0x3e} +}; + unsigned char rockbox112x37[]={ 0x00, 0x00, 0x02, 0xff, 0x02, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xf8, 0xf8, 0xf0, 0xe0, 0x80, 0x00, 0x00, 0x80, 0xe0, 0xf0, 0xf8, 0xf8, 0xfc, @@ -111,4 +153,131 @@ unsigned char rockbox112x37[]={ }; +/* + * Wipe statusbar + */ +void statusbar_wipe(void) +{ + int x; + + for (x = 0; x < LCD_WIDTH; x++) + lcd_framebuffer[x][STATUSBAR_Y_POS/8]=0x00; +} + +/* + * Print battery icon to status bar + */ +void statusbar_icon_battery(int percent, bool charging) +{ + int i,j; + int fill; + + /* draw battery */ + for(i=0;i<17;i++) { + DRAW_PIXEL((ICON_BATTERY_X_POS+i),STATUSBAR_Y_POS); + DRAW_PIXEL((ICON_BATTERY_X_POS+i),(STATUSBAR_Y_POS+6)); + } + for(i=1;i<6;i++) { + DRAW_PIXEL(ICON_BATTERY_X_POS,(STATUSBAR_Y_POS+i)); + DRAW_PIXEL((ICON_BATTERY_X_POS+16),(STATUSBAR_Y_POS+i)); + } + for(i=2;i<5;i++) + DRAW_PIXEL((ICON_BATTERY_X_POS+17),(STATUSBAR_Y_POS+i)); + + /* fill battery */ + fill=percent; + if(fill<0) + fill=0; + if(fill>100) + fill=100; + fill=fill*15/100; + + for(i=1;i<=fill;i++) + for(j=1;j<6;j++) + DRAW_PIXEL((ICON_BATTERY_X_POS+i),(STATUSBAR_Y_POS+j)); + + if(charging) + lcd_bitmap(bitmap_icon_7x8[Icon_Plug], ICON_PLUG_X_POS, STATUSBAR_Y_POS, ICON_PLUG_WIDTH, STATUSBAR_HEIGHT, false); +}; + +/* + * Print volume gauge to status bar + */ +void statusbar_icon_volume(int percent) +{ + int i,j; + int volume; + int step=0; + + volume=percent; + if(volume<0) + volume=0; + if(volume>100) + volume=100; + + if(volume==0) + lcd_bitmap(bitmap_icon_7x8[Icon_Mute], ICON_VOLUME_X_POS+ICON_VOLUME_WIDTH/2-4, STATUSBAR_Y_POS, 7, STATUSBAR_HEIGHT, false); + else { + volume=volume*14/100; + for(i=0;i> 4, + hour & 0x0f, + (minute & 0xf0) >> 4, + minute & 0x0f); + lcd_putsxy(TIME_X_POS, STATUSBAR_Y_POS, buffer, 0); +} +#endif #endif diff --git a/apps/recorder/icons.h b/apps/recorder/icons.h index 866e4888f2..da94c2269a 100644 --- a/apps/recorder/icons.h +++ b/apps/recorder/icons.h @@ -36,9 +36,56 @@ extern unsigned char rockbox112x37[]; extern unsigned char slider_bar[]; +#define STATUSBAR_X_POS 0 +#define STATUSBAR_Y_POS 0 // MUST be a multiple of 8 +#define STATUSBAR_HEIGHT 8 +#define STATUSBAR_WIDTH LCD_WIDTH +#define ICON_BATTERY_X_POS 0 +#define ICON_BATTERY_WIDTH 18 +#define ICON_PLUG_X_POS STATUSBAR_X_POS+ICON_BATTERY_WIDTH+2 +#define ICON_PLUG_WIDTH 7 +#define ICON_VOLUME_X_POS STATUSBAR_X_POS+ICON_BATTERY_WIDTH+ICON_PLUG_WIDTH+2+2 +#define ICON_VOLUME_WIDTH 14 +#define ICON_PLAY_STATE_X_POS STATUSBAR_X_POS+ICON_BATTERY_WIDTH+ICON_PLUG_WIDTH+ICON_VOLUME_WIDTH+2+2+2 +#define ICON_PLAY_STATE_WIDTH 7 +#define ICON_PLAY_MODE_X_POS STATUSBAR_X_POS+ICON_BATTERY_WIDTH+ICON_PLUG_WIDTH+ICON_VOLUME_WIDTH+ICON_PLAY_STATE_WIDTH+2+2+2+2 +#define ICON_PLAY_MODE_WIDTH 7 +#define ICON_SHUFFLE_X_POS STATUSBAR_X_POS+ICON_BATTERY_WIDTH+ICON_PLUG_WIDTH+ICON_VOLUME_WIDTH+ICON_PLAY_STATE_WIDTH+ICON_PLAY_MODE_WIDTH+2+2+2+2+2 +#define ICON_SHUFFLE_WIDTH 7 +#define LOCK_X_POS STATUSBAR_X_POS+ICON_BATTERY_WIDTH+ICON_PLUG_WIDTH+ICON_VOLUME_WIDTH+ICON_PLAY_STATE_WIDTH+ICON_PLAY_MODE_WIDTH+ICON_SHUFFLE_WIDTH+2+2+2+2+2+2 +#define LOCK_WIDTH 5 +#define TIME_X_POS STATUSBAR_WIDTH-5*6-1 + +/* Symbolic names for icons */ +enum +{ + Icon_Lock = 0 +}; +enum +{ + Icon_Plug = 0, + Icon_Speaker, + Icon_Mute, + Icon_Play, + Icon_Stop, + Icon_Pause, + Icon_FastForward, + Icon_FastBackward, + Icon_Record, + Icon_RecPause, + Icon_Normal, + Icon_Repeat, + Icon_Shuffle +}; + +extern void statusbar_wipe(void); +extern void statusbar_icon_battery(int percent, bool charging); +extern void statusbar_icon_volume(int percent); +extern void statusbar_icon_play_state(int state); +extern void statusbar_icon_play_mode(int mode); +extern void statusbar_icon_shuffle(void); +extern void statusbar_icon_lock(void); +#ifdef HAVE_RTC +extern void statusbar_time(void); +#endif #endif /* End HAVE_LCD_BITMAP */ - - - - - diff --git a/apps/recorder/widgets.c b/apps/recorder/widgets.c new file mode 100644 index 0000000000..1c3f0b1a10 --- /dev/null +++ b/apps/recorder/widgets.c @@ -0,0 +1,161 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: not checked in + * + * Copyright (C) 2002 Markus Braun + * + * 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 + +#include "widgets.h" + +#ifdef HAVE_LCD_BITMAP +/* + * Print a progress bar + */ +void progressbar(int x, int y, int width, int height, int percent, int direction) +{ + int pos; + int i,j; + + /* draw horizontal lines */ + for(i=x+1;i<=x+width-2;i++) { + DRAW_PIXEL(i,y); + DRAW_PIXEL(i,(y+height-1)); + } + + /* draw vertical lines */ + for(i=1;i100) + pos=100; + + switch (direction) + { + case Grow_Right: + pos=(width-2)*pos/100; + for(i=1;i<=pos;i++) + for(j=1;j100) + pos=100; + + switch (direction) + { + case Grow_Right: + pos=(width-height-1)*pos/100; + break; + case Grow_Left: + pos=(width-height-1)*(100-pos)/100; + break; + case Grow_Down: + pos=(height-width-1)*pos/100; + break; + case Grow_Up: + pos=(height-width-1)*(100-pos)/100; + break; + } + + if(direction == Grow_Left || direction == Grow_Right) + for(i=1;i ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: not checked in + * + * Copyright (C) 2002 Markus Braun + * + * 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. + * + ****************************************************************************/ +#ifndef __WIDGETS_H__ +#define __WIDGETS_H__ +#include + +#ifdef HAVE_LCD_BITMAP +/* Directions for progressbar and scrollbar */ +enum +{ + Grow_Right = 0, + Grow_Left, + Grow_Down, + Grow_Up +}; + +extern void progressbar(int x, int y, int width, int height, int percent, int direction); +extern void slidebar(int x, int y, int width, int height, int percent, int direction); +#endif /* HAVE_LCD_BITMAP */ +#endif /* __WIDGETS_H__ */ diff --git a/apps/settings.c b/apps/settings.c index 4160721e8a..f3e7e554ad 100644 --- a/apps/settings.c +++ b/apps/settings.c @@ -275,6 +275,9 @@ int settings_save( void ) rtc_config_block[0x11] = (unsigned char)global_settings.avc; + rtc_config_block[0x12] = (unsigned char) + ((global_settings.statusbar & 1)); + memcpy(&rtc_config_block[0x24], &global_settings.total_uptime, 4); if(save_config_buffer()) @@ -347,6 +350,10 @@ void settings_load(void) if (rtc_config_block[0x11] != 0xFF) global_settings.avc = rtc_config_block[0x11]; + + if (rtc_config_block[0x12] != 0xFF) { + global_settings.statusbar = rtc_config_block[0x12] & 1; + } if (rtc_config_block[0x24] != 0xFF) memcpy(&global_settings.total_uptime, &rtc_config_block[0x24], 4); @@ -378,6 +385,7 @@ void settings_reset(void) { global_settings.wps_display = DEFAULT_WPS_DISPLAY; global_settings.mp3filter = true; global_settings.sort_case = false; + global_settings.statusbar = true; global_settings.playlist_shuffle = false; global_settings.discharge = 0; global_settings.total_uptime = 0; diff --git a/apps/settings.h b/apps/settings.h index b39ac73c89..e66bf8f53d 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -62,6 +62,9 @@ struct user_settings /* while playing screen settings */ int wps_display; /* 0=id3, 1=file, 2=parse */ + + /* show status bar */ + bool statusbar; /* 0=hide, 1=show */ /* geeky persistent statistics */ unsigned int total_uptime; /* total uptime since rockbox was first booted */ diff --git a/apps/settings_menu.c b/apps/settings_menu.c index 98c47b753c..7ab1b0479d 100644 --- a/apps/settings_menu.c +++ b/apps/settings_menu.c @@ -76,6 +76,13 @@ static void deep_discharge(void) } #endif +#ifdef HAVE_LCD_BITMAP +static void statusbar(void) +{ + set_bool( "[Show status bar]", &global_settings.statusbar ); +} +#endif + void settings_menu(void) { int m; @@ -88,6 +95,9 @@ void settings_menu(void) { "While Playing", wps_set }, #ifdef HAVE_CHARGE_CTRL { "Deep discharge", deep_discharge }, +#endif +#ifdef HAVE_LCD_BITMAP + { "Status bar", statusbar }, #endif }; bool old_shuffle = global_settings.playlist_shuffle; diff --git a/apps/status.c b/apps/status.c index fde7146a88..c4bd958964 100644 --- a/apps/status.c +++ b/apps/status.c @@ -24,8 +24,18 @@ #include "settings.h" #include "status.h" #include "mpeg.h" +#include "wps.h" +#ifdef HAVE_LCD_BITMAP +#include "icons.h" +#endif +#include "power.h" + static enum playmode current_mode; +#ifdef HAVE_LCD_BITMAP +bool statusbar_enabled = true; +#endif + void status_init(void) { status_set_playmode(STATUS_STOP); @@ -36,6 +46,22 @@ void status_set_playmode(enum playmode mode) current_mode = mode; } +#ifdef HAVE_LCD_BITMAP +bool statusbar(bool state) +{ + bool laststate=statusbar_enabled; + + statusbar_enabled=state; + + return(laststate); +} + +void statusbar_toggle(void) +{ + statusbar_enabled=!statusbar_enabled; +} +#endif + void status_draw(void) { #if defined(HAVE_LCD_CHARCELLS) && !defined(SIMULATOR) @@ -97,4 +123,28 @@ void status_draw(void) break; } #endif +#ifdef HAVE_LCD_BITMAP + int battlevel = battery_level(); + int volume = mpeg_val2phys(SOUND_VOLUME, global_settings.volume); + + if(global_settings.statusbar && statusbar_enabled) { + statusbar_wipe(); +#ifdef HAVE_CHARGE_CTRL + statusbar_icon_battery(battlevel,charger_enabled); +#else + statusbar_icon_battery(battlevel,false); +#endif + statusbar_icon_volume(volume); + statusbar_icon_play_state(current_mode+Icon_Play); + if (global_settings.loop_playlist) + statusbar_icon_play_mode(Icon_Repeat); + else + statusbar_icon_play_mode(Icon_Normal); + if(global_settings.playlist_shuffle) statusbar_icon_shuffle(); + if (keys_locked) statusbar_icon_lock(); +#ifdef HAVE_RTC + statusbar_time(); +#endif + } +#endif } diff --git a/apps/status.h b/apps/status.h index 344d12f91b..41251bef28 100644 --- a/apps/status.h +++ b/apps/status.h @@ -23,11 +23,20 @@ enum playmode { STATUS_PLAY, STATUS_STOP, - STATUS_PAUSE + STATUS_PAUSE, + STATUS_FASTFORWARD, + STATUS_FASTBACKWARD, + STATUS_RECORD, + STATUS_RECORD_PAUSE }; void status_init(void); void status_set_playmode(enum playmode mode); +#ifdef HAVE_LCD_BITMAP +extern bool statusbar_enabled; +bool statusbar(bool state); +void statusbar_toggle(void); +#endif void status_draw(void); #endif diff --git a/apps/tree.c b/apps/tree.c index 733545aa17..68b893c78f 100644 --- a/apps/tree.c +++ b/apps/tree.c @@ -65,12 +65,12 @@ void browse_root(void) #ifdef HAVE_LCD_BITMAP -#define TREE_MAX_ON_SCREEN ((LCD_HEIGHT-MARGIN_Y)/LINE_HEIGTH) +#define TREE_MAX_ON_SCREEN ((LCD_HEIGHT-MARGIN_Y)/LINE_HEIGTH-LINE_Y) #define TREE_MAX_LEN_DISPLAY 16 /* max length that fits on screen */ #define MARGIN_Y 0 /* Y pixel margin */ #define MARGIN_X 12 /* X pixel margin */ -#define LINE_Y 0 /* Y position the entry-list starts at */ +#define LINE_Y (global_settings.statusbar&&statusbar_enabled?1:0) /* Y position the entry-list starts at */ #define LINE_X 2 /* X position the entry-list starts at */ #define LINE_HEIGTH 8 /* pixels for each text line */ @@ -226,7 +226,7 @@ static int showdir(char *path, int start) icon_type = File; } lcd_bitmap(bitmap_icons_6x8[icon_type], - 6, MARGIN_Y+(i-start)*LINE_HEIGTH, 6, 8, true); + 6, MARGIN_Y+(LINE_Y+i-start)*LINE_HEIGTH, 6, 8, true); #endif /* if MP3 filter is on, cut off the extension */ @@ -264,6 +264,7 @@ bool dirbrowse(char *root) { char buf[MAX_PATH]; int i; + int lasti=-1; int rc; int button; int browse_speed = 0; @@ -274,33 +275,12 @@ bool dirbrowse(char *root) if (numentries == -1) return -1; /* root is not a directory */ - put_cursorxy(0, CURSOR_Y + dircursor, true); + put_cursorxy(0, CURSOR_Y + LINE_Y+dircursor, true); while(1) { bool restore = false; - if ( numentries ) { - i = start+dircursor; - - /* if MP3 filter is on, cut off the extension */ - if (global_settings.mp3filter && - (dircacheptr[i]->attr & - (TREE_ATTR_M3U|TREE_ATTR_MP3))) - { - int len = strlen(dircacheptr[i]->name); - char temp = dircacheptr[i]->name[len-4]; - dircacheptr[i]->name[len-4] = 0; - lcd_puts_scroll(LINE_X, LINE_Y+dircursor, - dircacheptr[i]->name); - dircacheptr[i]->name[len-4] = temp; - } - else - lcd_puts_scroll(LINE_X, LINE_Y+dircursor, - dircacheptr[i]->name); - } - lcd_update(); - - button = button_get(true); + button = button_get_w_tmo(HZ/5); switch ( button ) { case TREE_EXIT: i=strlen(currdir); @@ -327,6 +307,8 @@ bool dirbrowse(char *root) case BUTTON_OFF: mpeg_stop(); status_set_playmode(STATUS_STOP); + status_draw(); + restore = true; break; #endif @@ -389,7 +371,7 @@ bool dirbrowse(char *root) if (browse_speed < TREE_MAX_ON_SCREEN - 1) { /* moving the cursor up through a full screen */ put_cursorxy(0, CURSOR_Y + LINE_Y+dircursor, - false); + false); dircursor--; put_cursorxy(0, CURSOR_Y + LINE_Y+dircursor, true); } @@ -489,7 +471,7 @@ bool dirbrowse(char *root) dircursor=7; put_cursorxy(0, CURSOR_Y + LINE_Y+dircursor, true); } - + } else { /* leaving the cursor at bottom line and moving screen up */ @@ -561,9 +543,15 @@ bool dirbrowse(char *root) case TREE_MENU: { bool lastfilter = global_settings.mp3filter; bool lastsortcase = global_settings.sort_case; +#ifdef HAVE_LCD_BITMAP + bool laststate=statusbar(false); +#endif browse_speed = 0; lcd_stop_scroll(); main_menu(); +#ifdef HAVE_LCD_BITMAP + statusbar(laststate); +#endif /* do we need to rescan dir? */ if ( lastfilter != global_settings.mp3filter || lastsortcase != global_settings.sort_case) @@ -591,8 +579,26 @@ bool dirbrowse(char *root) } break; +#ifdef HAVE_RECORDER_KEYPAD + case BUTTON_F3: +#endif +#ifdef HAVE_LCD_BITMAP + if(global_settings.statusbar) { + statusbar_toggle(); + if(CURSOR_Y+LINE_Y+dircursor>TREE_MAX_ON_SCREEN) { + start++; + dircursor--; + } + restore = true; + } +#endif + break; + #ifndef SIMULATOR - case SYS_USB_CONNECTED: + case SYS_USB_CONNECTED: { +#ifdef HAVE_LCD_BITMAP + bool laststate=statusbar(false); +#endif /* Tell the USB thread that we are safe */ DEBUGF("dirbrowse got SYS_USB_CONNECTED\n"); usb_acknowledge(SYS_USB_CONNECTED_ACK); @@ -607,7 +613,11 @@ bool dirbrowse(char *root) dirlevel = 0; dircursor = 0; start = 0; - break; +#ifdef HAVE_LCD_BITMAP + statusbar(laststate); +#endif + } + break; #endif } @@ -617,7 +627,32 @@ bool dirbrowse(char *root) put_cursorxy(0, CURSOR_Y + LINE_Y+dircursor, true); } - lcd_stop_scroll(); + if ( numentries ) { + i = start+dircursor; + + /* if MP3 filter is on, cut off the extension */ + if(lasti!=i || restore) { + lasti=i; + lcd_stop_scroll(); + if (global_settings.mp3filter && + (dircacheptr[i]->attr & + (TREE_ATTR_M3U|TREE_ATTR_MP3))) + { + int len = strlen(dircacheptr[i]->name); + char temp = dircacheptr[i]->name[len-4]; + dircacheptr[i]->name[len-4] = 0; + lcd_puts_scroll(LINE_X, LINE_Y+dircursor, + dircacheptr[i]->name); + dircacheptr[i]->name[len-4] = temp; + } + else + lcd_puts_scroll(LINE_X, LINE_Y+dircursor, + dircacheptr[i]->name); + } + } + status_draw(); + lcd_update(); + } return false; diff --git a/apps/wps.c b/apps/wps.c index c3398e2ea4..db97a3c708 100644 --- a/apps/wps.c +++ b/apps/wps.c @@ -34,8 +34,16 @@ #include "power.h" #include "status.h" #include "main_menu.h" +#ifdef HAVE_LCD_BITMAP +#include "icons.h" +#include "widgets.h" +#endif -#define LINE_Y 1 /* initial line */ +#ifdef HAVE_LCD_BITMAP +#define LINE_Y (global_settings.statusbar&&statusbar_enabled?1:0) /* Y position the entry-list starts at */ +#else /* HAVE_LCD_BITMAP */ +#define LINE_Y 0 /* Y position the entry-list starts at */ +#endif /* HAVE_LCD_BITMAP */ #define PLAY_DISPLAY_DEFAULT 0 #define PLAY_DISPLAY_FILENAME_SCROLL 1 @@ -47,6 +55,8 @@ #define RELEASE_MASK (BUTTON_MENU | BUTTON_STOP) #endif +bool keys_locked = false; + static void draw_screen(struct mp3entry* id3) { lcd_clear_display(); @@ -83,14 +93,14 @@ static void draw_screen(struct mp3entry* id3) strncpy(szArtist,szTok,sizeof(szArtist)); szArtist[sizeof(szArtist)-1] = 0; szDelimit = strrchr(id3->path, ch); - lcd_puts(0,0, szArtist?szArtist:""); + lcd_puts(0,LINE_Y, szArtist?szArtist:""); // removes the .mp3 from the end of the display buffer szPeriod = strrchr(szDelimit, '.'); if (szPeriod != NULL) *szPeriod = 0; - lcd_puts_scroll(0,LINE_Y,(++szDelimit)); + lcd_puts_scroll(0,LINE_Y+1,(++szDelimit)); break; } case PLAY_DISPLAY_FILENAME_SCROLL: @@ -99,14 +109,14 @@ static void draw_screen(struct mp3entry* id3) char* szLast = strrchr(id3->path, ch); if (szLast) - lcd_puts_scroll(0,0, (++szLast)); + lcd_puts_scroll(0,LINE_Y, (++szLast)); else - lcd_puts_scroll(0,0, id3->path); + lcd_puts_scroll(0,LINE_Y, id3->path); break; } case PLAY_DISPLAY_DEFAULT: { - int l = 0; + int l = LINE_Y; #ifdef HAVE_LCD_BITMAP char buffer[64]; @@ -115,16 +125,28 @@ static void draw_screen(struct mp3entry* id3) lcd_puts(0, l++, id3->album?id3->album:""); lcd_puts(0, l++, id3->artist?id3->artist:""); - if(id3->vbr) - snprintf(buffer, sizeof(buffer), "%d kbit (avg)", - id3->bitrate); - else - snprintf(buffer, sizeof(buffer), "%d kbit", id3->bitrate); + if(LINE_Y==0) { + if(id3->vbr) + snprintf(buffer, sizeof(buffer), "%d kbit (avg)", + id3->bitrate); + else + snprintf(buffer, sizeof(buffer), "%d kbit", id3->bitrate); - lcd_puts(0, l++, buffer); + lcd_puts(0, l++, buffer); - snprintf(buffer,sizeof(buffer), "%d Hz", id3->frequency); - lcd_puts(0, l++, buffer); + snprintf(buffer,sizeof(buffer), "%d Hz", id3->frequency); + lcd_puts(0, l++, buffer); + } + else { + if(id3->vbr) + snprintf(buffer, sizeof(buffer), "%dkbit(a) %dHz", + id3->bitrate, id3->frequency); + else + snprintf(buffer, sizeof(buffer), "%dkbit %dHz", + id3->bitrate, id3->frequency); + + lcd_puts(0, l++, buffer); + } #else lcd_puts(0, l++, id3->artist?id3->artist:""); @@ -166,7 +188,6 @@ void display_keylock_text(bool locked) int wps_show(void) { struct mp3entry* id3 = NULL; - bool keys_locked = false; bool dont_go_to_menu = false; bool menu_button_is_down = false; bool pending_keylock = true; /* Keylock will go ON next time */ @@ -364,9 +385,15 @@ int wps_show(void) #endif if(!keys_locked && !dont_go_to_menu && menu_button_is_down) { +#ifdef HAVE_LCD_BITMAP + bool laststate=statusbar(false); +#endif lcd_stop_scroll(); button_set_release(old_release_mask); main_menu(); +#ifdef HAVE_LCD_BITMAP + statusbar(laststate); +#endif old_release_mask = button_set_release(RELEASE_MASK); id3 = mpeg_current_track(); draw_screen(id3); @@ -378,6 +405,17 @@ int wps_show(void) menu_button_is_down = false; break; +#ifdef HAVE_RECORDER_KEYPAD + case BUTTON_F3: +#ifdef HAVE_LCD_BITMAP + if(global_settings.statusbar) { + statusbar_toggle(); + draw_screen(id3); + } +#endif + break; +#endif + #ifdef HAVE_RECORDER_KEYPAD case BUTTON_OFF: #else @@ -396,7 +434,10 @@ int wps_show(void) return 0; #ifndef SIMULATOR - case SYS_USB_CONNECTED: + case SYS_USB_CONNECTED: { +#ifdef HAVE_LCD_BITMAP + bool laststate=statusbar(false); +#endif /* Tell the USB thread that we are safe */ DEBUGF("wps got SYS_USB_CONNECTED\n"); usb_acknowledge(SYS_USB_CONNECTED_ACK); @@ -404,16 +445,20 @@ int wps_show(void) /* Wait until the USB cable is extracted again */ usb_wait_for_disconnect(&button_queue); +#ifdef HAVE_LCD_BITMAP + statusbar(laststate); +#endif /* Signal to our caller that we have been in USB mode */ return SYS_USB_CONNECTED; break; + } #endif case BUTTON_NONE: /* Timeout */ if (mpeg_is_playing() && id3) { #ifdef HAVE_LCD_BITMAP snprintf(buffer,sizeof(buffer), - "Time: %d:%02d / %d:%02d", + "Time:%3d:%02d/%d:%02d", id3->elapsed / 60000, id3->elapsed % 60000 / 1000, id3->length / 60000, @@ -421,9 +466,9 @@ int wps_show(void) lcd_puts(0, 6, buffer); - lcd_slidebar(1, LCD_HEIGHT-7, LCD_WIDTH-2, 5, + slidebar(0, LCD_HEIGHT-6, LCD_WIDTH, 6, id3->elapsed*100/id3->length, - BAR_RIGHT); + Grow_Right); lcd_update(); #else @@ -432,7 +477,7 @@ int wps_show(void) if (global_settings.wps_display == PLAY_DISPLAY_FILENAME_SCROLL) { - snprintf(buffer,sizeof(buffer), "%d:%02d/%d:%02d", + snprintf(buffer,sizeof(buffer), "Time:%3d:%02d/%d:%02d", id3->elapsed / 60000, id3->elapsed % 60000 / 1000, id3->length / 60000, @@ -445,12 +490,6 @@ int wps_show(void) } status_draw(); -#ifdef HAVE_LCD_BITMAP - /* draw battery indicator line */ - lcd_clearline(0,LCD_HEIGHT-1,LCD_WIDTH-1, LCD_HEIGHT-1); - lcd_drawline(0,LCD_HEIGHT-1,battery_level() * - (LCD_WIDTH-1) / 100, LCD_HEIGHT-1); -#endif break; } } diff --git a/apps/wps.h b/apps/wps.h index 4b4e63efc5..b0673157f4 100644 --- a/apps/wps.h +++ b/apps/wps.h @@ -21,6 +21,8 @@ #include "id3.h" #include "playlist.h" +extern bool keys_locked; + int wps_show(void); #endif diff --git a/firmware/drivers/lcd.c b/firmware/drivers/lcd.c index 5e86647280..fe1e13a522 100644 --- a/firmware/drivers/lcd.c +++ b/firmware/drivers/lcd.c @@ -529,7 +529,7 @@ void lcd_init (void) * * Memory copy of display bitmap */ -unsigned char display[LCD_WIDTH][LCD_HEIGHT/8] __attribute__ ((section (".idata"))); +unsigned char lcd_framebuffer[LCD_WIDTH][LCD_HEIGHT/8] __attribute__ ((section (".idata"))); static int font=0; static int xmargin=0; @@ -590,7 +590,7 @@ void lcd_update (void) lcd_write (true, LCD_CNTL_LOWCOL); for (x = 0; x < LCD_WIDTH; x++) - lcd_write (false, display[x][y]); + lcd_write (false, lcd_framebuffer[x][y]); } } @@ -601,7 +601,7 @@ void lcd_update (void) */ void lcd_clear_display (void) { - memset (display, 0, sizeof display); + memset (lcd_framebuffer, 0, sizeof lcd_framebuffer); #if defined(SIMULATOR) && defined(HAVE_LCD_CHARCELLS) /* this function is being used when simulating a charcell LCD and then we update immediately */ @@ -791,7 +791,7 @@ void lcd_bitmap (unsigned char *src, int x, int y, int nx, int ny, ny = LCD_HEIGHT - y; shift = y & 7; - dst2 = &display[x][y/8]; + dst2 = &lcd_framebuffer[x][y/8]; ny += shift; /* Calculate bit masks */ @@ -881,9 +881,6 @@ void lcd_invertrect (int x, int y, int nx, int ny) lcd_bitmap (ones, x+i, y, 1, ny, false); } -#define DRAW_PIXEL(x,y) display[x][y/8] |= (1<<(y&7)) -#define CLEAR_PIXEL(x,y) display[x][y/8] &= ~(1<<(y&7)) - void lcd_drawline( int x1, int y1, int x2, int y2 ) { int numpixels; @@ -1051,144 +1048,6 @@ void lcd_getfontsize(unsigned int font, int *width, int *height) } } -/* - * Print a progress bar - */ -void lcd_progressbar(int x, int y, int width, int height, int percent, int direction) -{ - int pos; - int i,j; - - /* draw horizontal lines */ - for(i=x+1;i<=x+width-2;i++) { - DRAW_PIXEL(i,y); - DRAW_PIXEL(i,(y+height-1)); - } - - /* draw vertical lines */ - for(i=1;i100) - pos=100; - - switch (direction) - { - case BAR_RIGHT: - pos=(width-2)*pos/100; - for(i=1;i<=pos;i++) - for(j=1;j100) - pos=100; - - switch (direction) - { - case BAR_RIGHT: - pos=(width-height-1)*pos/100; - break; - case BAR_LEFT: - pos=(width-height-1)*(100-pos)/100; - break; - case BAR_DOWN: - pos=(height-width-1)*pos/100; - break; - case BAR_UP: - pos=(height-width-1)*(100-pos)/100; - break; - } - - if(direction == BAR_LEFT || direction == BAR_RIGHT) - for(i=1;i> (y & 7)) & 1); + bitmap[y][x] = ((lcd_framebuffer[x][y/8] >> (y & 7)) & 1); InvalidateRect (hGUIWnd, NULL, FALSE); diff --git a/uisimulator/x11/Makefile b/uisimulator/x11/Makefile index 3d40303271..e327a1cdb9 100644 --- a/uisimulator/x11/Makefile +++ b/uisimulator/x11/Makefile @@ -81,7 +81,7 @@ APPS = main.c tree.c menu.c credits.c main_menu.c\ MENUS = games_menu.c screensavers_menu.c settings_menu.c sound_menu.c ifeq ($(DISPLAY),-DHAVE_LCD_BITMAP) - APPS += tetris.c sokoban.c bounce.c boxes.c icons.c bmp.c + APPS += tetris.c sokoban.c bounce.c boxes.c icons.c bmp.c widgets.c endif SRCS = screenhack.c uibasic.c resources.c visual.c lcd-x11.c stubs.c \ @@ -167,6 +167,9 @@ $(OBJDIR)/settings_menu.o: $(APPDIR)/settings_menu.c $(OBJDIR)/icons.o: $(RECDIR)/icons.c $(CC) $(APPCFLAGS) -c $< -o $@ +$(OBJDIR)/widgets.o: $(RECDIR)/widgets.c + $(CC) $(APPCFLAGS) -c $< -o $@ + $(OBJDIR)/tetris.o: $(RECDIR)/tetris.c $(CC) $(APPCFLAGS) -c $< -o $@ diff --git a/uisimulator/x11/lcd-x11.c b/uisimulator/x11/lcd-x11.c index 96ce800c8f..e1d1953d54 100644 --- a/uisimulator/x11/lcd-x11.c +++ b/uisimulator/x11/lcd-x11.c @@ -38,11 +38,11 @@ #include "lcd-x11.h" -extern unsigned char display[LCD_WIDTH][LCD_HEIGHT/8]; +extern unsigned char lcd_framebuffer[LCD_WIDTH][LCD_HEIGHT/8]; extern void screen_resized(int width, int height); extern Display *dpy; -unsigned char display_copy[LCD_WIDTH][LCD_HEIGHT/8]; +unsigned char lcd_framebuffer_copy[LCD_WIDTH][LCD_HEIGHT/8]; /* this is in uibasic.c */ extern void drawdots(int color, XPoint *points, int count); @@ -61,10 +61,10 @@ void lcd_update (void) for(y=0; y