diff --git a/apps/alarm_menu.c b/apps/alarm_menu.c index 9df664f8a8..ae5d5bb752 100644 --- a/apps/alarm_menu.c +++ b/apps/alarm_menu.c @@ -25,14 +25,12 @@ #include "options.h" #include "lcd.h" -#include "font.h" #include "button.h" #include "kernel.h" #include "sprintf.h" #include #include "settings.h" #include "power.h" -#include "status.h" #include "icons.h" #include "rtc.h" #include "misc.h" @@ -44,6 +42,8 @@ #include "backlight.h" #include "splash.h" +#include "statusbar.h" +#include "textarea.h" #define MARGIN_Y (global_settings.statusbar ? STATUSBAR_HEIGHT : 0) bool alarm_screen(void) @@ -54,6 +54,7 @@ bool alarm_screen(void) struct tm *tm; int togo; int button; + int i; bool update = true; rtc_get_alarm(&h, &m); @@ -69,20 +70,22 @@ bool alarm_screen(void) while(!done) { if(update) { - lcd_clear_display(); - status_draw(true); - lcd_setfont(FONT_SYSFIXED); - lcd_setmargins(0, MARGIN_Y); - lcd_puts(0, 3, str(LANG_ALARM_MOD_KEYS)); + FOR_NB_SCREENS(i) + { + gui_textarea_clear(&screens[i]); + screens[i].puts(0, 3, str(LANG_ALARM_MOD_KEYS)); + } update = false; } - - snprintf(buf, 32, str(LANG_ALARM_MOD_TIME), h, m); - lcd_puts(0, 1, buf); - lcd_update(); + snprintf(buf, 32, str(LANG_ALARM_MOD_TIME), h, m); + FOR_NB_SCREENS(i) + { + screens[i].puts(0, 1, buf); + gui_textarea_update(&screens[i]); + } button = button_get_w_tmo(HZ); - + switch(button) { case BUTTON_PLAY: /* prevent that an alarm occurs in the shutdown procedure */ @@ -95,7 +98,7 @@ bool alarm_screen(void) rtc_enable_alarm(true); gui_syncsplash(HZ*2, true, str(LANG_ALARM_MOD_TIME_TO_GO), togo / 60, togo % 60); - done = true; + done = true; } else { gui_syncsplash(HZ, true, str(LANG_ALARM_MOD_ERROR)); update = true; @@ -125,9 +128,9 @@ bool alarm_screen(void) if (h == -1) h = 23; break; - + #if CONFIG_KEYPAD == RECORDER_PAD - /* inc(h) */ + /* inc(h) */ case BUTTON_UP: case BUTTON_UP | BUTTON_REPEAT: h = (h+1) % 24; @@ -152,7 +155,7 @@ bool alarm_screen(void) break; case BUTTON_NONE: - status_draw(false); + gui_syncstatusbar_draw(&statusbars, false); break; default: diff --git a/apps/bookmark.c b/apps/bookmark.c index c01567848a..4ca828089f 100644 --- a/apps/bookmark.c +++ b/apps/bookmark.c @@ -49,6 +49,8 @@ #include "misc.h" #include "abrepeat.h" #include "splash.h" +#include "yesno.h" + #define MAX_BOOKMARKS 10 #define MAX_BOOKMARK_SIZE 350 #define RECENT_BOOKMARK_FILE ROCKBOX_DIR "/most-recent.bmark" @@ -189,10 +191,6 @@ bool bookmark_mrb_load() /* ----------------------------------------------------------------------- */ bool bookmark_autobookmark(void) { - /* prompts the user as to create a bookmark */ - bool done = false; - int key = 0; - if (!system_check()) return false; @@ -208,42 +206,23 @@ bool bookmark_autobookmark(void) case BOOKMARK_RECENT_ONLY_YES: return write_bookmark(false); } - - /* Prompting user to confirm bookmark creation */ - lcd_clear_display(); #ifdef HAVE_LCD_BITMAP - lcd_setmargins(0, STATUSBAR_HEIGHT); - lcd_puts(0,0, str(LANG_AUTO_BOOKMARK_QUERY)); - lcd_puts(0,1, str(LANG_CONFIRM_WITH_PLAY_RECORDER)); - lcd_puts(0,2, str(LANG_CANCEL_WITH_ANY_RECORDER)); + char *lines[]={str(LANG_AUTO_BOOKMARK_QUERY), + str(LANG_CONFIRM_WITH_PLAY_RECORDER), + str(LANG_CANCEL_WITH_ANY_RECORDER)}; + struct text_message message={lines, 3}; #else - status_draw(false); - lcd_puts(0,0, str(LANG_AUTO_BOOKMARK_QUERY)); - lcd_puts(0,1,str(LANG_RESUME_CONFIRM_PLAYER)); + char *lines[]={str(LANG_AUTO_BOOKMARK_QUERY), + str(LANG_RESUME_CONFIRM_PLAYER)}; + struct text_message message={lines, 2}; #endif - lcd_update(); - - while (!done) + gui_syncstatusbar_draw(&statusbars, false); + if(gui_syncyesno_run(&message, NULL, NULL)==YESNO_YES) { - /* Wait for a key to be pushed */ - key = button_get(true); - switch (key) - { - case SETTINGS_OK: - if (global_settings.autocreatebookmark == - BOOKMARK_RECENT_ONLY_ASK) - return write_bookmark(false); - else - return write_bookmark(true); - break; - - default: - /* Handle sys events, ignore button releases & repeats */ - if(default_event_handler(key) || - !(key & (BUTTON_REL|BUTTON_REPEAT))) - done = true; - break; - } + if (global_settings.autocreatebookmark == BOOKMARK_RECENT_ONLY_ASK) + return write_bookmark(false); + else + return write_bookmark(true); } return false; } @@ -434,7 +413,6 @@ bool bookmark_autoload(const char* file) { return false; } - fd = open(global_bookmark_file_name, O_RDONLY); if(fd<0) return false; @@ -444,7 +422,6 @@ bool bookmark_autoload(const char* file) return false; } close(fd); - if(global_settings.autoloadbookmark == BOOKMARK_YES) { return bookmark_load(global_bookmark_file_name, true); @@ -453,6 +430,7 @@ bool bookmark_autoload(const char* file) { /* Prompting user to confirm bookmark load */ lcd_clear_display(); + gui_syncstatusbar_draw(&statusbars, false); #ifdef HAVE_LCD_BITMAP lcd_setmargins(0, STATUSBAR_HEIGHT); lcd_puts_scroll(0,0, str(LANG_BOOKMARK_AUTOLOAD_QUERY)); @@ -460,7 +438,6 @@ bool bookmark_autoload(const char* file) lcd_puts(0,2, str(LANG_BOOKMARK_SELECT_LIST_BOOKMARKS)); lcd_puts(0,3, str(LANG_CANCEL_WITH_ANY_RECORDER)); #else - status_draw(false); lcd_puts_scroll(0,0, str(LANG_BOOKMARK_AUTOLOAD_QUERY)); lcd_puts(0,1,str(LANG_RESUME_CONFIRM_PLAYER)); #endif @@ -857,7 +834,7 @@ static void display_bookmark(const char* bookmark, global_filename); } - status_draw(false); + gui_syncstatusbar_draw(&statusbars, false); lcd_puts_scroll(0,0,global_temp_buffer); lcd_puts(0,1,str(LANG_RESUME_CONFIRM_PLAYER)); if (dot) diff --git a/apps/filetree.c b/apps/filetree.c index 236ee487d7..0a2c855375 100644 --- a/apps/filetree.c +++ b/apps/filetree.c @@ -342,7 +342,6 @@ int ft_enter(struct tree_context* c) bool play = false; int start_index=0; - lcd_stop_scroll(); gui_syncsplash(0, true, str(LANG_WAIT)); switch ( file->attr & TREE_ATTR_MASK ) { case TREE_ATTR_M3U: diff --git a/apps/gui/splash.c b/apps/gui/splash.c index ce8b3cd995..551888544f 100644 --- a/apps/gui/splash.c +++ b/apps/gui/splash.c @@ -56,6 +56,7 @@ static void splash(struct screen * screen, #ifdef HAVE_LCD_CHARCELLS screen->double_height (false); #endif + screen->stop_scroll(); vsnprintf( splash_buf, sizeof(splash_buf), fmt, ap ); if(center) { diff --git a/apps/gui/statusbar.c b/apps/gui/statusbar.c index dad317e9e2..02c69815a1 100644 --- a/apps/gui/statusbar.c +++ b/apps/gui/statusbar.c @@ -107,17 +107,17 @@ void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw) #ifdef HAVE_LCD_BITMAP if(!global_settings.statusbar) return; -#endif +#endif /* HAVE_LCD_BITMAP */ struct screen * display = bar->display; #ifdef HAVE_RTC struct tm* tm; /* For Time */ -#endif +#endif /* HAVE_RTC */ #ifdef HAVE_LCD_CHARCELLS (void)force_redraw; /* players always "redraw" */ -#endif +#endif /* HAVE_LCD_CHARCELLS */ bar->info.volume = sound_val2phys(SOUND_VOLUME, global_settings.volume); bar->info.inserted = charger_inserted(); @@ -129,22 +129,22 @@ void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw) tm = get_time(); bar->info.hour = tm->tm_hour; bar->info.minute = tm->tm_min; -#endif +#endif /* HAVE_RTC */ bar->info.shuffle = global_settings.playlist_shuffle; #if CONFIG_KEYPAD == IRIVER_H100_PAD bar->info.keylock = button_hold(); #else bar->info.keylock = keys_locked; -#endif +#endif /* CONFIG_KEYPAD == IRIVER_H100_PAD */ bar->info.repeat = global_settings.repeat_mode; bar->info.playmode = current_playmode(); -#if CONFIG_LED == LED_VIRTUAL - bar->info.led = led_read(HZ/2); /* delay should match polling interval */ -#endif + if(!display->has_disk_led) + bar->info.led = led_read(HZ/2); /* delay should match polling interval */ + #ifdef HAVE_USB_POWER bar->info.usb_power = usb_powered(); -#endif +#endif /* HAVE_USB_POWER */ /* only redraw if forced to, or info has changed */ if (force_redraw || @@ -161,7 +161,7 @@ void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw) /* players always "redraw" */ { -#endif +#endif /* HAVE_LCD_BITMAP */ #ifdef HAVE_CHARGING if (bar->info.inserted) { @@ -220,7 +220,7 @@ void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw) STATUSBAR_PLUG_X_POS, STATUSBAR_Y_POS, STATUSBAR_PLUG_WIDTH, STATUSBAR_HEIGHT); -#endif +#endif /* HAVE_USB_POWER */ bar->info.redraw_volume = gui_statusbar_icon_volume(bar, bar->info.volume); @@ -232,7 +232,7 @@ void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw) case REPEAT_AB: gui_statusbar_icon_play_mode(display, Icon_RepeatAB); break; -#endif +#endif /* AB_REPEAT_ENABLE */ case REPEAT_ONE: gui_statusbar_icon_play_mode(display, Icon_RepeatOne); @@ -249,14 +249,12 @@ void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw) gui_statusbar_icon_lock(display); #ifdef HAVE_RTC gui_statusbar_time(display, bar->info.hour, bar->info.minute); -#endif -#if CONFIG_LED == LED_VIRTUAL - if (bar->info.led) - statusbar_led(); -#endif +#endif /* HAVE_RTC */ + if(!display->has_disk_led && bar->info.led) + gui_statusbar_led(display); display->update_rect(0, 0, display->width, STATUSBAR_HEIGHT); bar->lastinfo = bar->info; -#endif +#endif /* HAVE_LCD_BITMAP */ } @@ -284,7 +282,7 @@ void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw) display->icon(ICON_AUDIO, audio); display->icon(ICON_PARAM, param); display->icon(ICON_USB, usb); -#endif +#endif /* HAVE_LCD_CHARCELLS */ } #ifdef HAVE_LCD_BITMAP @@ -448,7 +446,6 @@ void gui_statusbar_icon_lock(struct screen * display) STATUSBAR_Y_POS, 5, 8); } -#if CONFIG_LED == LED_VIRTUAL /* * no real LED: disk activity in status bar */ @@ -459,8 +456,6 @@ void gui_statusbar_led(struct screen * display) STATUSBAR_Y_POS, STATUSBAR_DISK_WIDTH, STATUSBAR_HEIGHT); } -#endif - #ifdef HAVE_RTC /* diff --git a/apps/gui/statusbar.h b/apps/gui/statusbar.h index afbdce6d5a..77ceefd69f 100644 --- a/apps/gui/statusbar.h +++ b/apps/gui/statusbar.h @@ -42,9 +42,8 @@ struct status_info { bool keylock; bool battery_safe; bool redraw_volume; /* true if the volume gauge needs updating */ -#if CONFIG_LED == LED_VIRTUAL bool led; /* disk LED simulation in the status bar */ -#endif + #ifdef HAVE_USB_POWER bool usb_power; #endif @@ -100,9 +99,8 @@ void gui_statusbar_icon_play_state(struct screen * display, int state); void gui_statusbar_icon_play_mode(struct screen * display, int mode); void gui_statusbar_icon_shuffle(struct screen * display); void gui_statusbar_icon_lock(struct screen * display); -#if CONFIG_LED == LED_VIRTUAL void gui_statusbar_led(struct screen * display); -#endif + #ifdef HAVE_RTC void gui_statusbar_time(struct screen * display, int hour, int minute); diff --git a/apps/gui/textarea.c b/apps/gui/textarea.c index d73f20d0e7..28ca2c5b29 100644 --- a/apps/gui/textarea.c +++ b/apps/gui/textarea.c @@ -18,6 +18,7 @@ ****************************************************************************/ #include "textarea.h" +#include "font.h" void gui_textarea_clear(struct screen * display) { @@ -27,6 +28,7 @@ void gui_textarea_clear(struct screen * display) screen_clear_area(display, 0, y_start, display->width, y_end - y_start); display->stop_scroll(); screen_set_ymargin(display, y_start); + display->setfont(FONT_SYSFIXED); #else display->clear_display(); #endif @@ -48,7 +50,7 @@ int gui_textarea_put_message(struct screen * display, int i; gui_textarea_clear(display); for(i=0;inb_lines && i+ystartnb_lines;i++) - display->puts(0, i+ystart, message->message_lines[i]); + display->puts_scroll(0, i+ystart, message->message_lines[i]); gui_textarea_update(display); return(i); } diff --git a/apps/onplay.c b/apps/onplay.c index 704e0c04ec..df4ff15db9 100644 --- a/apps/onplay.c +++ b/apps/onplay.c @@ -39,7 +39,7 @@ #include "tree.h" #include "buffer.h" #include "settings.h" -#include "status.h" +#include "statusbar.h" #include "playlist_viewer.h" #include "talk.h" #include "onplay.h" @@ -220,7 +220,7 @@ static bool add_to_playlist(int position, bool queue) if (global_settings.playlist_shuffle) playlist_shuffle(current_tick, -1); playlist_start(0,0); - status_draw(false); + gui_syncstatusbar_draw(&statusbars, false); onplay_result = ONPLAY_START_PLAY; } diff --git a/apps/player/keyboard.c b/apps/player/keyboard.c index fb06a0dc7b..385532a6f3 100644 --- a/apps/player/keyboard.c +++ b/apps/player/keyboard.c @@ -26,7 +26,7 @@ #include #include "lcd-player-charset.h" #include "settings.h" -#include "status.h" +#include "statusbar.h" #include "talk.h" #include "misc.h" @@ -153,7 +153,7 @@ int kbd_input(char* text, int buflen) lcd_puts(1, 1, temptext); lcd_put_cursor(curpos + 1, 1, KEYBOARD_CURSOR); - status_draw(true); + gui_syncstatusbar_draw(&statusbars, true); } /* The default action is to redraw */ @@ -251,7 +251,7 @@ int kbd_input(char* text, int buflen) break; case BUTTON_NONE: - status_draw(false); + gui_syncstatusbar_draw(&statusbars, false); redraw = false; break; diff --git a/apps/recorder/icons.c b/apps/recorder/icons.c index baba77bc52..1306a1d770 100644 --- a/apps/recorder/icons.c +++ b/apps/recorder/icons.c @@ -73,11 +73,9 @@ const unsigned char bitmap_icons_7x8[][7] = {0x7f,0x04,0x4e,0x5f,0x44,0x38,0x7f} /* Repeat-AB playmode */ }; -#if CONFIG_LED == LED_VIRTUAL /* Disk/MMC activity */ const unsigned char bitmap_icon_disk[12] = {0x15,0x3f,0x7d,0x7B,0x77,0x67,0x79,0x7b,0x57,0x4f,0x47,0x7f}; -#endif #if LCD_WIDTH == 112 || LCD_WIDTH == 128 \ || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_WIDTH == 128) @@ -340,130 +338,6 @@ const unsigned char rockbox160x53x2[] = { #endif -/* - * Print battery icon to status bar - */ -void statusbar_icon_battery(int percent) -{ - int fill; - char buffer[5]; - unsigned int width, height; - - /* fill battery */ - fill = percent; - if (fill < 0) - fill = 0; - if (fill > 100) - fill = 100; - -#if defined(HAVE_CHARGE_CTRL) && !defined(SIMULATOR) /* Rec v1 target only */ - /* show graphical animation when charging instead of numbers */ - if ((global_settings.battery_display) && - (charge_state != 1) && - (percent > -1)) { -#else /* all others */ - if (global_settings.battery_display && (percent > -1)) { -#endif - /* Numeric display */ - snprintf(buffer, sizeof(buffer), "%3d", fill); - lcd_setfont(FONT_SYSFIXED); - lcd_getstringsize(buffer, &width, &height); - if (height <= STATUSBAR_HEIGHT) - lcd_putsxy(ICON_BATTERY_X_POS + ICON_BATTERY_WIDTH / 2 - - width/2, STATUSBAR_Y_POS, buffer); - lcd_setfont(FONT_UI); - - } - else { - /* draw battery */ - lcd_drawrect(ICON_BATTERY_X_POS, STATUSBAR_Y_POS, 17, 7); - lcd_vline(ICON_BATTERY_X_POS + 17, STATUSBAR_Y_POS + 2, - STATUSBAR_Y_POS + 4); - - fill = fill * 15 / 100; - lcd_fillrect(ICON_BATTERY_X_POS + 1, STATUSBAR_Y_POS + 1, fill, 5); - } - - if (percent == -1) { - lcd_setfont(FONT_SYSFIXED); - lcd_putsxy(ICON_BATTERY_X_POS + ICON_BATTERY_WIDTH / 2 - 4, - STATUSBAR_Y_POS, "?"); - lcd_setfont(FONT_UI); - } -} - -/* - * Print volume gauge to status bar - */ -bool statusbar_icon_volume(int percent) -{ - int i; - int volume; - int vol; - char buffer[4]; - unsigned int width, height; - bool needs_redraw = false; - int type = global_settings.volume_type; - static long switch_tick; - static int last_volume = -1; /* -1 means "first update ever" */ - - volume = percent; - if (volume < 0) - volume = 0; - if (volume > 100) - volume = 100; - - if (volume == 0) { - lcd_mono_bitmap(bitmap_icons_7x8[Icon_Mute], - ICON_VOLUME_X_POS + ICON_VOLUME_WIDTH / 2 - 4, - STATUSBAR_Y_POS, 7, STATUSBAR_HEIGHT); - } - else { - /* We want to redraw the icon later on */ - if (last_volume != volume && last_volume >= 0) { - switch_tick = current_tick + HZ; - } - - /* If the timeout hasn't yet been reached, we show it numerically - and tell the caller that we want to be called again */ - if (TIME_BEFORE(current_tick,switch_tick)) { - type = 1; - needs_redraw = true; - } - - /* display volume level numerical? */ - if (type) - { - snprintf(buffer, sizeof(buffer), "%2d", percent); - lcd_setfont(FONT_SYSFIXED); - lcd_getstringsize(buffer, &width, &height); - if (height <= STATUSBAR_HEIGHT) - lcd_putsxy(ICON_VOLUME_X_POS + ICON_VOLUME_WIDTH / 2 - - width/2, STATUSBAR_Y_POS, buffer); - lcd_setfont(FONT_UI); - } else { - /* display volume bar */ - vol = volume * 14 / 100; - for(i=0; i < vol; i++) { - lcd_vline(ICON_VOLUME_X_POS + i, STATUSBAR_Y_POS + 6 - i / 2, - STATUSBAR_Y_POS + 6); - } - } - } - last_volume = volume; - - return needs_redraw; -} - -/* - * Print play state to status bar - */ -void statusbar_icon_play_state(int state) -{ - lcd_mono_bitmap(bitmap_icons_7x8[state], ICON_PLAY_STATE_X_POS, - STATUSBAR_Y_POS, ICON_PLAY_STATE_WIDTH, STATUSBAR_HEIGHT); -} - /* * Print play mode to status bar */ @@ -478,59 +352,6 @@ void statusbar_icon_play_mode(int mode) */ void statusbar_icon_shuffle(void) { - lcd_mono_bitmap(bitmap_icons_7x8[Icon_Shuffle], ICON_SHUFFLE_X_POS, + lcd_mono_bitmap(bitmap_icons_7x8[Icon_Shuffle], ICON_SHUFFLE_X_POS, STATUSBAR_Y_POS, ICON_SHUFFLE_WIDTH, STATUSBAR_HEIGHT); } - -/* - * Print lock when keys are locked - */ -void statusbar_icon_lock(void) -{ - lcd_mono_bitmap(bitmap_icons_5x8[Icon_Lock], LOCK_X_POS, - STATUSBAR_Y_POS, 5, 8); -} - -#if CONFIG_LED == LED_VIRTUAL -/* - * no real LED: disk activity in status bar - */ -void statusbar_led(void) -{ - lcd_mono_bitmap(bitmap_icon_disk, ICON_DISK_X_POS, - STATUSBAR_Y_POS, ICON_DISK_WIDTH, STATUSBAR_HEIGHT); -} -#endif - -#ifdef HAVE_RTC -/* - * Print time to status bar - */ -void statusbar_time(int hour, int minute) -{ - unsigned char buffer[6]; - unsigned int width, height; - - if ( hour >= 0 && - hour <= 23 && - minute >= 0 && - minute <= 59 ) { - if ( global_settings.timeformat ) { /* 12 hour clock */ - hour %= 12; - if ( hour == 0 ) { - hour += 12; - } - } - snprintf(buffer, sizeof(buffer), "%02d:%02d", hour, minute); - } - else { - strncpy(buffer, "--:--", sizeof buffer); - } - - lcd_setfont(FONT_SYSFIXED); - lcd_getstringsize(buffer, &width, &height); - if (height <= STATUSBAR_HEIGHT) - lcd_putsxy(TIME_X_END - width, STATUSBAR_Y_POS, buffer); - lcd_setfont(FONT_UI); -} -#endif diff --git a/apps/recorder/icons.h b/apps/recorder/icons.h index 6ffcc9cb80..c996fd92aa 100644 --- a/apps/recorder/icons.h +++ b/apps/recorder/icons.h @@ -74,9 +74,7 @@ enum icons_7x8 { extern const unsigned char bitmap_icons_5x8[1][5]; extern const unsigned char bitmap_icons_6x8[LastIcon][6]; extern const unsigned char bitmap_icons_7x8[Icon_Last][7]; -#if CONFIG_LED == LED_VIRTUAL extern const unsigned char bitmap_icon_disk[]; -#endif #if LCD_WIDTH == 112 || LCD_WIDTH == 128 || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_WIDTH == 128) extern const unsigned char rockbox112x37[]; diff --git a/apps/recorder/keyboard.c b/apps/recorder/keyboard.c index 5ff340b596..31c0643e3c 100644 --- a/apps/recorder/keyboard.c +++ b/apps/recorder/keyboard.c @@ -26,10 +26,11 @@ #include #include "font.h" #include "screens.h" -#include "status.h" +#include "statusbar.h" #include "talk.h" #include "settings.h" #include "misc.h" +#include "buttonbar.h" #define KEYBOARD_MARGIN 3 @@ -177,7 +178,11 @@ int kbd_input(char* text, int buflen) char outline[256]; struct font* font = font_get(FONT_SYSFIXED); int button, lastbutton = 0; - +#ifdef HAS_BUTTONBAR + struct gui_buttonbar buttonbar; + gui_buttonbar_init(&buttonbar); + gui_buttonbar_set_display(&buttonbar, &(screens[SCREEN_MAIN]) ); +#endif lcd_setfont(FONT_SYSFIXED); font_w = font->maxwidth; font_h = font->height; @@ -229,10 +234,10 @@ int kbd_input(char* text, int buflen) i = (curpos + 1) * font_w; lcd_vline(i, main_y, main_y + font_h); -#if CONFIG_KEYPAD == RECORDER_PAD +#ifdef HAS_BUTTONBAR /* draw the status bar */ - buttonbar_set("Shift", "OK", "Del"); - buttonbar_draw(); + gui_buttonbar_set(&buttonbar, "Shift", "OK", "Del"); + gui_buttonbar_draw(&buttonbar); #endif #ifdef KBD_MODES @@ -245,8 +250,7 @@ int kbd_input(char* text, int buflen) lcd_set_drawmode(DRMODE_SOLID); } - status_draw(true); - + gui_syncstatusbar_draw(&statusbars, true); lcd_update(); } @@ -454,7 +458,7 @@ int kbd_input(char* text, int buflen) #endif /* !KBD_MODES */ case BUTTON_NONE: - status_draw(false); + gui_syncstatusbar_draw(&statusbars, false); redraw = false; break; diff --git a/apps/recorder/radio.c b/apps/recorder/radio.c index ff1d49bd2a..a6b540dd3d 100644 --- a/apps/recorder/radio.c +++ b/apps/recorder/radio.c @@ -56,6 +56,7 @@ #include "textarea.h" #include "splash.h" #include "yesno.h" +#include "buttonbar.h" #include "power.h" #ifdef CONFIG_TUNER @@ -298,9 +299,13 @@ bool radio_screen(void) int hours, minutes; bool keep_playing = false; bool statusbar = global_settings.statusbar; +#ifdef HAS_BUTTONBAR + struct gui_buttonbar buttonbar; + gui_buttonbar_init(&buttonbar); + gui_buttonbar_set_display(&buttonbar, &(screens[SCREEN_MAIN]) ); +#endif /* always display status bar in radio screen for now */ global_settings.statusbar = true; - FOR_NB_SCREENS(i){ gui_textarea_clear(&screens[i]); screen_set_xmargin(&screens[i],0); @@ -377,8 +382,8 @@ bool radio_screen(void) radio_mode = RADIO_PRESET_MODE; #endif -#if CONFIG_KEYPAD == RECORDER_PAD - buttonbar_set(str(LANG_BUTTONBAR_MENU), str(LANG_FM_BUTTONBAR_PRESETS), +#ifdef HAS_BUTTONBAR + gui_buttonbar_set(&buttonbar, str(LANG_BUTTONBAR_MENU), str(LANG_FM_BUTTONBAR_PRESETS), str(LANG_FM_BUTTONBAR_RECORD)); #endif @@ -613,10 +618,10 @@ bool radio_screen(void) gui_textarea_clear(&screens[i]); screen_set_xmargin(&screens[i],0); } -#if CONFIG_KEYPAD == RECORDER_PAD - buttonbar_set(str(LANG_BUTTONBAR_MENU), - str(LANG_FM_BUTTONBAR_PRESETS), - str(LANG_FM_BUTTONBAR_RECORD)); +#ifdef HAS_BUTTONBAR + gui_buttonbar_set(&buttonbar, str(LANG_BUTTONBAR_MENU), + str(LANG_FM_BUTTONBAR_PRESETS), + str(LANG_FM_BUTTONBAR_RECORD)); #endif update_screen = true; break; @@ -646,10 +651,11 @@ bool radio_screen(void) gui_textarea_clear(&screens[i]); screen_set_xmargin(&screens[i],0); } -#if CONFIG_KEYPAD == RECORDER_PAD - buttonbar_set(str(LANG_BUTTONBAR_MENU), - str(LANG_FM_BUTTONBAR_PRESETS), - str(LANG_FM_BUTTONBAR_RECORD)); +#ifdef HAS_BUTTONBAR + gui_buttonbar_set(&buttonbar, + str(LANG_BUTTONBAR_MENU), + str(LANG_FM_BUTTONBAR_PRESETS), + str(LANG_FM_BUTTONBAR_RECORD)); #endif update_screen = true; break; @@ -807,16 +813,16 @@ bool radio_screen(void) screens[i].puts_scroll(0, top_of_screen + 4, buf); } } - -#if CONFIG_KEYPAD == RECORDER_PAD - buttonbar_draw(); -#endif + +#if HAS_BUTTONBAR + gui_buttonbar_draw(&buttonbar); +#endif FOR_NB_SCREENS(i) gui_textarea_update(&screens[i]); } /* Only force the redraw if update_screen is true */ gui_syncstatusbar_draw(&statusbars,true); - + update_screen = false; } diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c index eda56a5bf9..63cd513c78 100644 --- a/apps/recorder/recording.c +++ b/apps/recorder/recording.c @@ -45,7 +45,7 @@ #include "icons.h" #include "screens.h" #include "peakmeter.h" -#include "status.h" +#include "statusbar.h" #include "menu.h" #include "sound_menu.h" #include "timefuncs.h" @@ -831,7 +831,7 @@ bool recording_screen(void) lcd_puts(0, 6, buf); } - status_draw(true); + gui_syncstatusbar_draw(&statusbars, true); peak_meter_draw(0, 8 + h*2, LCD_WIDTH, h); lcd_update(); @@ -860,7 +860,7 @@ bool recording_screen(void) if (audio_stat & AUDIO_STATUS_ERROR) { gui_syncsplash(0, true, str(LANG_DISK_FULL)); - status_draw(true); + gui_syncstatusbar_draw(&statusbars, true); lcd_update(); audio_error_clear(); diff --git a/apps/screen_access.c b/apps/screen_access.c index 6bceb1747e..db64e27199 100644 --- a/apps/screen_access.c +++ b/apps/screen_access.c @@ -38,6 +38,8 @@ void screen_init(struct screen * screen, enum screen_type screen_type) #ifdef HAVE_REMOTE_LCD case SCREEN_REMOTE: screen->depth=LCD_REMOTE_DEPTH; + screen->has_disk_led=false; + #if 1 /* all remote LCDs are bitmapped so far */ screen->width=LCD_REMOTE_WIDTH; screen->height=LCD_REMOTE_HEIGHT; @@ -87,13 +89,17 @@ void screen_init(struct screen * screen, enum screen_type screen_type) screen->clear_display=&lcd_remote_clear_display; screen->update=&lcd_remote_update; screen->puts=&lcd_remote_puts; - break; #endif /* HAVE_REMOTE_LCD */ case SCREEN_MAIN: default: screen->depth=LCD_DEPTH; +#if CONFIG_LED == LED_VIRTUAL + screen->has_disk_led=false; +#else + screen->has_disk_led=true; +#endif #ifdef HAVE_LCD_BITMAP screen->width=LCD_WIDTH; screen->height=LCD_HEIGHT; diff --git a/apps/screen_access.h b/apps/screen_access.h index 782bd9219d..7f235a2480 100644 --- a/apps/screen_access.h +++ b/apps/screen_access.h @@ -54,6 +54,7 @@ struct screen int depth; int char_width; int char_height; + bool has_disk_led; #ifdef HAS_BUTTONBAR bool has_buttonbar; #endif diff --git a/apps/screens.c b/apps/screens.c index f861bb76c9..acfcd01dbe 100644 --- a/apps/screens.c +++ b/apps/screens.c @@ -48,6 +48,8 @@ #include "abrepeat.h" #include "gwps-common.h" #include "splash.h" +#include "statusbar.h" + #if defined(HAVE_LCD_BITMAP) #include "widgets.h" #endif @@ -108,7 +110,7 @@ void usb_display_info(void) lcd_mono_bitmap(usb_logo, LCD_WIDTH/2-BMPWIDTH_usb_logo/2, LCD_HEIGHT/2-BMPHEIGHT_usb_logo/2, BMPWIDTH_usb_logo, BMPHEIGHT_usb_logo); - status_draw(true); + gui_syncstatusbar_draw(&statusbars, true); lcd_update(); #else lcd_double_height(false); @@ -116,7 +118,7 @@ void usb_display_info(void) status_set_param(false); status_set_audio(false); status_set_usb(true); - status_draw(false); + gui_syncstatusbar_draw(&statusbars, false); #endif } @@ -138,7 +140,7 @@ void usb_screen(void) #endif - status_draw(false); + gui_syncstatusbar_draw(&statusbars, false); } } #ifdef HAVE_LCD_CHARCELLS @@ -358,7 +360,7 @@ int charging_screen(void) remote_backlight_set_timeout(global_settings.remote_backlight_timeout); #endif backlight_set_on_when_charging(global_settings.backlight_on_when_charging); - status_draw(true); + gui_syncstatusbar_draw(&statusbars, true); #ifdef HAVE_LCD_CHARCELLS logo_lock_patterns(true); @@ -367,7 +369,7 @@ int charging_screen(void) do { - status_draw(false); + gui_syncstatusbar_draw(&statusbars, false); charging_display_info(true); button = button_get_w_tmo(HZ/3); if (button == BUTTON_ON) @@ -990,7 +992,7 @@ bool set_time_screen(const char* string, struct tm *tm) lcd_puts(0, 4, str(LANG_TIME_SET)); lcd_puts(0, 5, str(LANG_TIME_REVERT)); #ifdef HAVE_LCD_BITMAP - status_draw(true); + gui_syncstatusbar_draw(&statusbars, true); #endif lcd_update(); @@ -1186,7 +1188,7 @@ bool browse_id3(void) char* body; lcd_clear_display(); - status_draw(true); + gui_syncstatusbar_draw(&statusbars, true); line = draw_id3_item(line, top, LANG_ID3_TITLE, id3->title); line = draw_id3_item(line, top, LANG_ID3_ARTIST, id3->artist); line = draw_id3_item(line, top, LANG_ID3_ALBUM, id3->album); @@ -1260,7 +1262,7 @@ bool browse_id3(void) while (!exit && (top == old_top)) { - status_draw(false); + gui_syncstatusbar_draw(&statusbars, false); lcd_update(); button = button_get_w_tmo(HZ / 2); diff --git a/apps/sleeptimer.c b/apps/sleeptimer.c index 4e6ca5313e..982cbe621a 100644 --- a/apps/sleeptimer.c +++ b/apps/sleeptimer.c @@ -28,7 +28,7 @@ #include "settings.h" #include "power.h" #include "powermgmt.h" -#include "status.h" +#include "statusbar.h" #include "debug.h" #include "talk.h" #include "icons.h" @@ -155,7 +155,7 @@ bool sleeptimer_screen(void) } } - status_draw(true); + gui_syncstatusbar_draw(&statusbars, true); lcd_update(); } diff --git a/apps/sound_menu.c b/apps/sound_menu.c index f2d92d6df6..d8795ab8ae 100644 --- a/apps/sound_menu.c +++ b/apps/sound_menu.c @@ -26,7 +26,7 @@ #include "button.h" #include "mp3_playback.h" #include "settings.h" -#include "status.h" +#include "statusbar.h" #include "screens.h" #ifdef HAVE_LCD_BITMAP #include "icons.h" @@ -575,7 +575,7 @@ bool rectrigger(void) lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); lcd_fillrect(0, stat_height, LCD_WIDTH, LCD_HEIGHT - stat_height); lcd_set_drawmode(DRMODE_SOLID); - status_draw(true); + gui_syncstatusbar_draw(&statusbars, true); /* reselect FONT_SYSFONT as status_draw has changed the font */ /*lcd_setfont(FONT_SYSFIXED);*/ diff --git a/apps/status.c b/apps/status.c index 00f8c5e1fe..e678c76674 100644 --- a/apps/status.c +++ b/apps/status.c @@ -28,6 +28,7 @@ #include "audio.h" #include "gwps.h" #include "abrepeat.h" +#include "statusbar.h" #ifdef HAVE_RTC #include "timefuncs.h" #endif @@ -54,27 +55,6 @@ bool battery_state = true; int battery_charge_step = 0; #endif -struct status_info { - int battlevel; - int volume; - int hour; - int minute; - int playmode; - int repeat; - bool inserted; - bool shuffle; - bool keylock; - bool battery_safe; - bool redraw_volume; /* true if the volume gauge needs updating */ -#if CONFIG_LED == LED_VIRTUAL - bool led; /* disk LED simulation in the status bar */ -#endif -#ifdef HAVE_USB_POWER - bool usb_power; -#endif - -}; - void status_init(void) { ff_mode = 0; @@ -83,7 +63,7 @@ void status_init(void) void status_set_ffmode(enum playmode mode) { ff_mode = mode; /* Either STATUS_FASTFORWARD or STATUS_FASTBACKWARD */ - status_draw(false); + gui_syncstatusbar_draw(&statusbars, false); } enum playmode status_get_ffmode(void) @@ -162,257 +142,3 @@ void status_set_usb(bool b) } #endif /* HAVE_LCD_CHARCELLS */ - -void status_draw(bool force_redraw) -{ - /* This is static because we use memcmp() below to check for changes, and - the unused bytes (due to struct member alignment) might change if - the struct is allocated on the stack. */ - static struct status_info info; - -#ifdef HAVE_LCD_BITMAP - static struct status_info lastinfo; - struct tm* tm; - - if ( !global_settings.statusbar ) - return; -#else - (void)force_redraw; /* players always "redraw" */ -#endif - - info.volume = sound_val2phys(SOUND_VOLUME, global_settings.volume); - info.inserted = charger_inserted(); - info.battlevel = battery_level(); - info.battery_safe = battery_level_safe(); - -#ifdef HAVE_LCD_BITMAP - tm = get_time(); - info.hour = tm->tm_hour; - info.minute = tm->tm_min; - info.shuffle = global_settings.playlist_shuffle; -#if CONFIG_KEYPAD == IRIVER_H100_PAD - info.keylock = button_hold(); -#else - info.keylock = keys_locked; -#endif - info.repeat = global_settings.repeat_mode; - info.playmode = current_playmode(); -#if CONFIG_LED == LED_VIRTUAL - info.led = led_read(HZ/2); /* delay should match polling interval */ -#endif -#ifdef HAVE_USB_POWER - info.usb_power = usb_powered(); -#endif - - /* only redraw if forced to, or info has changed */ - if (force_redraw || - info.inserted || - !info.battery_safe || - info.redraw_volume || - memcmp(&info, &lastinfo, sizeof(struct status_info))) - { - lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); - lcd_fillrect(0,0,LCD_WIDTH,8); - lcd_set_drawmode(DRMODE_SOLID); -#else - /* players always "redraw" */ - { -#endif - -#ifdef HAVE_CHARGING - if (info.inserted) { - battery_state = true; -#if defined(HAVE_CHARGE_CTRL) || CONFIG_BATTERY == BATT_LIION2200 - /* zero battery run time if charging */ - if (charge_state > 0) { - global_settings.runtime = 0; - lasttime = current_tick; - } - - /* animate battery if charging */ - if ((charge_state == 1) || - (charge_state == 2)) { -#else - global_settings.runtime = 0; - lasttime = current_tick; - { -#endif - /* animate in three steps (34% per step for a better look) */ - info.battlevel = battery_charge_step * 34; - if (info.battlevel > 100) - info.battlevel = 100; - if(TIME_AFTER(current_tick, switch_tick)) { - battery_charge_step=(battery_charge_step+1)%4; - switch_tick = current_tick + HZ; - } - } - } - else -#endif /* HAVE_CHARGING */ - { - if (info.battery_safe) - battery_state = true; - else { - /* blink battery if level is low */ - if(TIME_AFTER(current_tick, switch_tick) && - (info.battlevel > -1)) { - switch_tick = current_tick+HZ; - battery_state =! battery_state; - } - } - } - -#ifdef HAVE_LCD_BITMAP - if (battery_state) - statusbar_icon_battery(info.battlevel); - - /* draw power plug if charging */ - if (info.inserted) - lcd_mono_bitmap(bitmap_icons_7x8[Icon_Plug], ICON_PLUG_X_POS, - STATUSBAR_Y_POS, ICON_PLUG_WIDTH, STATUSBAR_HEIGHT); -#ifdef HAVE_USB_POWER - else if (info.usb_power) - lcd_mono_bitmap(bitmap_icons_7x8[Icon_USBPlug], ICON_PLUG_X_POS, - STATUSBAR_Y_POS, ICON_PLUG_WIDTH, STATUSBAR_HEIGHT); -#endif - - info.redraw_volume = statusbar_icon_volume(info.volume); - statusbar_icon_play_state(current_playmode() + Icon_Play); - switch (info.repeat) { -#ifdef AB_REPEAT_ENABLE - case REPEAT_AB: - statusbar_icon_play_mode(Icon_RepeatAB); - break; -#endif - - case REPEAT_ONE: - statusbar_icon_play_mode(Icon_RepeatOne); - break; - - case REPEAT_ALL: - case REPEAT_SHUFFLE: - statusbar_icon_play_mode(Icon_Repeat); - break; - } - if (info.shuffle) - statusbar_icon_shuffle(); - if (info.keylock) - statusbar_icon_lock(); -#ifdef HAVE_RTC - statusbar_time(info.hour, info.minute); -#endif -#if CONFIG_LED == LED_VIRTUAL - if (info.led) - statusbar_led(); -#endif - lcd_update_rect(0, 0, LCD_WIDTH, STATUSBAR_HEIGHT); - lastinfo = info; -#endif - } - - -#if defined(HAVE_LCD_CHARCELLS) - if (info.battlevel > -1) - lcd_icon(ICON_BATTERY, battery_state); - lcd_icon(ICON_BATTERY_1, info.battlevel > 25); - lcd_icon(ICON_BATTERY_2, info.battlevel > 50); - lcd_icon(ICON_BATTERY_3, info.battlevel > 75); - - lcd_icon(ICON_VOLUME, true); - lcd_icon(ICON_VOLUME_1, info.volume > 10); - lcd_icon(ICON_VOLUME_2, info.volume > 30); - lcd_icon(ICON_VOLUME_3, info.volume > 50); - lcd_icon(ICON_VOLUME_4, info.volume > 70); - lcd_icon(ICON_VOLUME_5, info.volume > 90); - - lcd_icon(ICON_PLAY, current_playmode() == STATUS_PLAY); - lcd_icon(ICON_PAUSE, current_playmode() == STATUS_PAUSE); - - lcd_icon(ICON_REPEAT, global_settings.repeat_mode != REPEAT_OFF); - lcd_icon(ICON_1, global_settings.repeat_mode == REPEAT_ONE); - - lcd_icon(ICON_RECORD, record); - lcd_icon(ICON_AUDIO, audio); - lcd_icon(ICON_PARAM, param); - lcd_icon(ICON_USB, usb); -#endif - -} - -#if defined(HAVE_LCD_BITMAP) && (CONFIG_KEYPAD == RECORDER_PAD) -static void draw_buttonbar_btn(int num, const char* caption) -{ - int xpos, ypos, button_width, text_width; - int fw, fh; - - lcd_setfont(FONT_SYSFIXED); - lcd_getstringsize("M", &fw, &fh); - - button_width = LCD_WIDTH/3; - xpos = num * button_width; - ypos = LCD_HEIGHT - fh; - - if(caption) - { - /* center the text */ - text_width = fw * strlen(caption); - lcd_putsxy(xpos + (button_width - text_width)/2, ypos, caption); - } - - lcd_set_drawmode(DRMODE_COMPLEMENT); - lcd_fillrect(xpos, ypos, button_width - 1, fh); - lcd_set_drawmode(DRMODE_SOLID); -} - -static char stored_caption1[8]; -static char stored_caption2[8]; -static char stored_caption3[8]; - -void buttonbar_set(const char* caption1, const char *caption2, - const char *caption3) -{ - buttonbar_unset(); - if(caption1) - { - strncpy(stored_caption1, caption1, 7); - stored_caption1[7] = 0; - } - if(caption2) - { - strncpy(stored_caption2, caption2, 7); - stored_caption2[7] = 0; - } - if(caption3) - { - strncpy(stored_caption3, caption3, 7); - stored_caption3[7] = 0; - } -} - -void buttonbar_unset(void) -{ - stored_caption1[0] = 0; - stored_caption2[0] = 0; - stored_caption3[0] = 0; -} - -void buttonbar_draw(void) -{ - lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); - lcd_fillrect(0, LCD_HEIGHT-8, LCD_WIDTH, 8); - lcd_set_drawmode(DRMODE_SOLID); - draw_buttonbar_btn(0, stored_caption1); - draw_buttonbar_btn(1, stored_caption2); - draw_buttonbar_btn(2, stored_caption3); -} - -bool buttonbar_isset(void) -{ - /* If all buttons are unset, the button bar is considered disabled */ - return (global_settings.buttonbar && - ((stored_caption1[0] != 0) || - (stored_caption2[0] != 0) || - (stored_caption3[0] != 0))); -} - -#endif diff --git a/apps/status.h b/apps/status.h index 25d3166d78..68319257b8 100644 --- a/apps/status.h +++ b/apps/status.h @@ -52,27 +52,14 @@ void status_set_ffmode(enum playmode mode); enum playmode status_get_ffmode(void); int current_playmode(void); -#ifdef HAVE_LCD_BITMAP -bool statusbar(bool state); -#if CONFIG_KEYPAD == RECORDER_PAD -void buttonbar_set(const char* caption1, const char* caption2, - const char* caption3); -void buttonbar_unset(void); -bool buttonbar_isset(void); -void buttonbar_draw(void); -#define BUTTONBAR_HEIGHT 8 -#endif /* CONFIG_KEYPAD == RECORDER_PAD */ -#endif /* HAVE_LCD_BITMAP */ -void status_draw(bool force_redraw); - -#if defined(HAVE_LCD_CHARCELLS) +#ifdef SIMULATOR +#include +#endif +#ifdef HAVE_LCD_CHARCELLS void status_set_record(bool b); void status_set_audio(bool b); void status_set_param(bool b); void status_set_usb(bool b); -#endif +#endif /* HAVE_LCD_CHARCELLS */ -#ifdef SIMULATOR -#include -#endif -#endif +#endif /* _STATUS_H */ diff --git a/firmware/SOURCES b/firmware/SOURCES index fb8ed7b6d7..e5056c54df 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -65,9 +65,7 @@ drivers/lcd-ipod.c drivers/lcd-h300.c #endif drivers/power.c -#ifdef CONFIG_LED drivers/led.c -#endif #ifndef SIMULATOR drivers/adc.c #ifdef HAVE_MMC diff --git a/firmware/drivers/led.c b/firmware/drivers/led.c index ca4aadac71..1e38fa63d3 100644 --- a/firmware/drivers/led.c +++ b/firmware/drivers/led.c @@ -23,44 +23,50 @@ #include "system.h" #include "kernel.h" +static bool disk_led_status; +static long last_on; /* timestamp of switching off */ + + + +void disk_led_on(void) +{ + disk_led_status=true; #if CONFIG_LED == LED_REAL +#ifdef GMINI_ARCH + P2 |= 1; +#else + or_b(0x40, &PBDRL); +#endif +#endif +} + +void disk_led_off(void) +{ + if(disk_led_status) + { + last_on = current_tick;/* remember for off delay */ + disk_led_status=false; +#if CONFIG_LED == LED_REAL +#ifdef GMINI_ARCH + P2 &= ~1; +#else + and_b(~0x40, &PBDRL); +#endif +#endif + } +} void led(bool on) { if ( on ) -#ifdef GMINI_ARCH - P2 |= 1; + disk_led_on(); else - P2 &= ~1; -#else - { - or_b(0x40, &PBDRL); - } - else - { - and_b(~0x40, &PBDRL); - } -#endif + disk_led_off(); } -#elif CONFIG_LED == LED_VIRTUAL - -static bool current; -static long last_on; /* timestamp of switching off */ - -void led(bool on) -{ - if (current && !on) /* switching off */ - { - last_on = current_tick; /* remember for off delay */ - } - current = on; -} - -bool led_read(int delayticks) /* read by status bar update */ +bool led_read(int delayticks) { /* reading "off" is delayed by user-supplied monoflop value */ - return (current || TIME_BEFORE(current_tick, last_on+delayticks)); + return (disk_led_status || + TIME_BEFORE(current_tick, last_on+delayticks)); } - -#endif /* CONFIG_LED */ diff --git a/firmware/export/led.h b/firmware/export/led.h index f1b3b95447..1dad329e4b 100644 --- a/firmware/export/led.h +++ b/firmware/export/led.h @@ -23,8 +23,6 @@ #include extern void led( bool on ); -#if CONFIG_LED == LED_VIRTUAL -extern bool led_read(int delayticks); /* read for status bar */ -#endif +extern bool led_read(int delayticks); #endif