diff --git a/apps/gui/list.c b/apps/gui/list.c index 6f61a61992..64551055c3 100644 --- a/apps/gui/list.c +++ b/apps/gui/list.c @@ -1283,9 +1283,8 @@ bool simplelist_show_list(struct simplelist_info *info) while(1) { gui_syncstatusbar_draw(&statusbars, true); - if (list_do_action(CONTEXT_STD, info->timeout, - &lists, &action, LIST_WRAP_UNLESS_HELD)) - continue; + list_do_action(CONTEXT_STD, info->timeout, + &lists, &action, LIST_WRAP_UNLESS_HELD); if (info->action_callback) { action = info->action_callback(action, &lists); diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 29957eceb6..a706003e3d 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -6880,7 +6880,7 @@ player: "Buf: %d.%03dMB" - *: "" + *: "Buffer size" @@ -6912,7 +6912,7 @@ *: "Disk:" - *: "" + *: "Disk size" diff --git a/apps/menus/main_menu.c b/apps/menus/main_menu.c index e94074217a..17cd1bcd37 100644 --- a/apps/menus/main_menu.c +++ b/apps/menus/main_menu.c @@ -49,7 +49,6 @@ #include "time.h" - static struct browse_folder_info config = {ROCKBOX_DIR, SHOW_CFG}; /***********************************/ @@ -129,9 +128,52 @@ struct info_data { unsigned long free2; #endif }; +enum InfoScreenOrder { + Order_SVN_revision = 0, + Order_GAP1, +#if CONFIG_RTC + Order_Time, + Order_Date, + Order_GAP2, +#endif + Order_Buffer, + Order_Batt, + Order_Disk1, /* capacity or internal capacity/free on hotswap */ + Order_Disk2,/* free space or external capacity/free on hotswap */ + Order_Count +}; +#if CONFIG_RTC +const int dayname[] = { + LANG_WEEKDAY_SUNDAY, + LANG_WEEKDAY_MONDAY, + LANG_WEEKDAY_TUESDAY, + LANG_WEEKDAY_WEDNESDAY, + LANG_WEEKDAY_THURSDAY, + LANG_WEEKDAY_FRIDAY, + LANG_WEEKDAY_SATURDAY +}; + +const int monthname[] = { + LANG_MONTH_JANUARY, + LANG_MONTH_FEBRUARY, + LANG_MONTH_MARCH, + LANG_MONTH_APRIL, + LANG_MONTH_MAY, + LANG_MONTH_JUNE, + LANG_MONTH_JULY, + LANG_MONTH_AUGUST, + LANG_MONTH_SEPTEMBER, + LANG_MONTH_OCTOBER, + LANG_MONTH_NOVEMBER, + LANG_MONTH_DECEMBER +}; +#endif static char* info_getname(int selected_item, void * data, char *buffer) { - struct info_data *info = (struct info_data*)data; + struct info_data *info = (struct info_data*)data; +#if CONFIG_RTC + struct tm *tm; +#endif const unsigned char *kbyte_units[] = { ID2P(LANG_KILOBYTE), ID2P(LANG_MEGABYTE), @@ -154,13 +196,34 @@ static char* info_getname(int selected_item, void * data, char *buffer) } switch (selected_item) { - case 0: + case Order_SVN_revision: snprintf(buffer, MAX_PATH, "%s: %s", str(LANG_VERSION), appsversion); break; - case 1: + case Order_GAP1: +#if CONFIG_RTC + case Order_GAP2: +#endif return ""; - case 2: /* buffer */ +#if CONFIG_RTC + case Order_Time: + tm = get_time(); + snprintf(buffer, MAX_PATH, "%02d:%02d:%02d %s", + global_settings.timeformat == 0 + ?tm->tm_hour:tm->tm_hour-12, + tm->tm_min, tm->tm_sec, + global_settings.timeformat == 0 + ?"":tm->tm_hour>11?"P":"A"); + break; + case Order_Date: + tm = get_time(); + snprintf(buffer, MAX_PATH, "%s %d %s %d", str(dayname[tm->tm_wday]), + tm->tm_year+1900, + str(monthname[tm->tm_mon]), + tm->tm_mday); + break; +#endif + case Order_Buffer: /* buffer */ { long buflen = ((audiobufend - audiobuf) * 2) / 2097; /* avoid overflow */ int integer = buflen / 1000; @@ -170,7 +233,7 @@ static char* info_getname(int selected_item, void * data, char *buffer) integer, decimal); } break; - case 3: /* battery */ + case Order_Batt: /* battery */ #if CONFIG_CHARGING == CHARGING_CONTROL if (charge_state == CHARGING) snprintf(buffer, MAX_PATH, (char *)str(LANG_BATTERY_CHARGE)); @@ -186,7 +249,7 @@ static char* info_getname(int selected_item, void * data, char *buffer) else strcpy(buffer, "(n/a)"); break; - case 4: /* disc usage 1 */ + case Order_Disk1: /* disc usage 1 */ #ifdef HAVE_MULTIVOLUME output_dyn_value(s1, sizeof s1, info->free, kbyte_units, true); output_dyn_value(s2, sizeof s2, info->size, kbyte_units, true); @@ -197,7 +260,7 @@ static char* info_getname(int selected_item, void * data, char *buffer) snprintf(buffer, MAX_PATH, SIZE_FMT, str(LANG_DISK_SIZE_INFO), s1); #endif break; - case 5: /* disc usage 2 */ + case Order_Disk2: /* disc usage 2 */ #ifdef HAVE_MULTIVOLUME if (info->size2) { @@ -223,23 +286,38 @@ static int info_speak_item(int selected_item, void * data) ID2P(LANG_KILOBYTE), ID2P(LANG_MEGABYTE), ID2P(LANG_GIGABYTE) - }; + }; switch (selected_item) { - case 0:/* version, not voiced, so say the time instead */ + case Order_SVN_revision: /* version */ + talk_id(LANG_VERSION, false); + talk_spell(appsversion, true); + break; #if CONFIG_RTC - talk_date_time(get_time(), false); + case Order_Time: + talk_id(LANG_CURRENT_TIME, false); + talk_time(get_time(), true); + break; + case Order_Date: + talk_date(get_time(), true); + break; #endif - break; - case 1: /* nothing */ - break; - case 2: /* buffer, not spoken */ - break; - case 3: /* battery */ + case Order_Buffer: /* buffer, not spoken */ + { + talk_id(LANG_BUFFER_STAT, false); + long buflen = (audiobufend - audiobuf) / 1024L; + output_dyn_value(NULL, 0, buflen, kbyte_units, true); + break; + } + case Order_Batt: /* battery */ if (battery_level() >= 0) { talk_id(LANG_BATTERY_TIME, false); talk_value(battery_level(), UNIT_PERCENT, true); + if(battery_time () / 60 > 0) + talk_value(battery_time () / 60, UNIT_INT, true); + if(battery_time () % 60 > 0) + talk_value(battery_time () % 60, UNIT_INT, true); #if CONFIG_CHARGING >= CHARGING_MONITOR if (charge_state == CHARGING) talk_id(LANG_BATTERY_CHARGE, true); @@ -252,20 +330,27 @@ static int info_speak_item(int selected_item, void * data) #endif } break; - case 4: /* disk 1 */ - talk_id(LANG_DISK_FREE_INFO, false); + case Order_Disk1: /* disk 1 */ #ifdef HAVE_MULTIVOLUME + talk_id(LANG_DISK_FREE_INFO, false); talk_id(LANG_DISK_NAME_INTERNAL, true); -#endif output_dyn_value(NULL, 0, info->free, kbyte_units, true); +#else + talk_id(LANG_DISK_SIZE_INFO, false); + output_dyn_value(NULL, 0, info->size, kbyte_units, true); +#endif break; - case 5: /* disk 2 */ + case Order_Disk2: /* disk 2 */ #ifdef HAVE_MULTIVOLUME if (info->size2) { + talk_id(LANG_DISK_FREE_INFO, false); talk_id(LANG_DISK_NAME_MMC, false); output_dyn_value(NULL, 0, info->free2, kbyte_units, true); } +#else + talk_id(LANG_DISK_FREE_INFO, false); + output_dyn_value(NULL, 0, info->free, kbyte_units, true); #endif break; } @@ -274,7 +359,8 @@ static int info_speak_item(int selected_item, void * data) static int info_action_callback(int action, struct gui_synclist *lists) { - (void)lists; + if (action == ACTION_STD_CANCEL) + return action; if ((action == ACTION_STD_OK) #ifdef HAVE_MULTIVOLUME || action == SYS_HOTSWAP_INSERTED @@ -294,13 +380,33 @@ static int info_action_callback(int action, struct gui_synclist *lists) #endif return ACTION_REDRAW; } + else if (lists->gui_list[SCREEN_MAIN].show_selection_marker == true) + { + if (lists->gui_list[SCREEN_MAIN].selected_item == Order_GAP1 +#if CONFIG_RTC + || lists->gui_list[SCREEN_MAIN].selected_item == Order_GAP2 +#endif + ) + { + if (action == ACTION_STD_PREV) + { + gui_synclist_select_item(lists, lists->gui_list[SCREEN_MAIN].selected_item-1); + return ACTION_REDRAW; + } + else if (action == ACTION_STD_NEXT) + { + gui_synclist_select_item(lists, lists->gui_list[SCREEN_MAIN].selected_item+1); + return ACTION_REDRAW; + } + } + } return action; } static bool show_info(void) { - struct info_data data = {.new_data = true}; + struct info_data data = {.new_data = true }; struct simplelist_info info; - simplelist_info_init(&info, str(LANG_ROCKBOX_INFO), 6, (void*)&data); + simplelist_info_init(&info, str(LANG_ROCKBOX_INFO), Order_Count, (void*)&data); info.hide_selection = !global_settings.talk_menu; info.get_name = info_getname; if(global_settings.talk_menu) diff --git a/apps/screens.c b/apps/screens.c index dc54a00b1d..7e48ae16fb 100644 --- a/apps/screens.c +++ b/apps/screens.c @@ -7,7 +7,7 @@ * \/ \/ \/ \/ \/ * $Id$ * - * Copyright (C) 2002 Björn Stenberg + * Copyright (C) 2002 Bj�rn Stenberg * * 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. @@ -791,30 +791,8 @@ void charging_splash(void) #if defined(HAVE_LCD_BITMAP) && (CONFIG_RTC != 0) -const int dayname[] = { - LANG_WEEKDAY_SUNDAY, - LANG_WEEKDAY_MONDAY, - LANG_WEEKDAY_TUESDAY, - LANG_WEEKDAY_WEDNESDAY, - LANG_WEEKDAY_THURSDAY, - LANG_WEEKDAY_FRIDAY, - LANG_WEEKDAY_SATURDAY -}; - -const int monthname[] = { - LANG_MONTH_JANUARY, - LANG_MONTH_FEBRUARY, - LANG_MONTH_MARCH, - LANG_MONTH_APRIL, - LANG_MONTH_MAY, - LANG_MONTH_JUNE, - LANG_MONTH_JULY, - LANG_MONTH_AUGUST, - LANG_MONTH_SEPTEMBER, - LANG_MONTH_OCTOBER, - LANG_MONTH_NOVEMBER, - LANG_MONTH_DECEMBER -}; +extern const int dayname[]; +extern const int monthname[]; /* little helper function for voice output */ static void say_time(int cursorpos, const struct tm *tm) diff --git a/apps/talk.c b/apps/talk.c index ede0aff66b..0c8fafbe59 100644 --- a/apps/talk.c +++ b/apps/talk.c @@ -848,66 +848,61 @@ void talk_disable(bool disable) } #if CONFIG_RTC -void talk_date_time(struct tm *tm, bool speak_current_time_string) +void talk_date(struct tm *tm, bool enqueue) { - if(global_settings.talk_menu) + talk_id(LANG_MONTH_JANUARY + tm->tm_mon, enqueue); + talk_number(tm->tm_mday, true); + talk_number(1900 + tm->tm_year, true); +} + +void talk_time(struct tm *tm, bool enqueue) +{ + if (global_settings.timeformat == 1) { - if(speak_current_time_string) - talk_id(VOICE_CURRENT_TIME, true); - if (global_settings.timeformat == 1) + /* Voice the hour */ + long am_pm_id = VOICE_AM; + int hour = tm->tm_hour; + if (hour >= 12) { - long am_pm_id = VOICE_AM; - int hour = tm->tm_hour; + am_pm_id = VOICE_PM; + hour -= 12; + } + if (hour == 0) + hour = 12; + talk_number(hour, enqueue); - if (hour >= 12) - { - am_pm_id = VOICE_PM; - hour -= 12; - } - if (hour == 0) - hour = 12; - - talk_number(hour, true); - - /* Voice the minutes */ - if (tm->tm_min == 0) - { - /* Say o'clock if the minute is 0. */ - talk_id(VOICE_OCLOCK, true); - } - else - { - /* Pronounce the leading 0 */ - if(tm->tm_min < 10) - { - talk_id(VOICE_OH, true); - } - talk_number(tm->tm_min, true); - } - talk_id(am_pm_id, true); + /* Voice the minutes */ + if (tm->tm_min == 0) + { + /* Say o'clock if the minute is 0. */ + talk_id(VOICE_OCLOCK, true); } else { - /* Voice the time in 24 hour format */ - talk_number(tm->tm_hour, true); - if (tm->tm_min == 0) - { - talk_id(VOICE_HUNDRED, true); - talk_id(VOICE_HOUR, true); - } - else - { - /* Pronounce the leading 0 */ - if(tm->tm_min < 10) - { - talk_id(VOICE_OH, true); - } - talk_number(tm->tm_min, true); - } + /* Pronounce the leading 0 */ + if(tm->tm_min < 10) + talk_id(VOICE_OH, true); + talk_number(tm->tm_min, true); + } + talk_id(am_pm_id, true); + } + else + { + /* Voice the time in 24 hour format */ + talk_number(tm->tm_hour, enqueue); + if (tm->tm_min == 0) + { + talk_id(VOICE_HUNDRED, true); + talk_id(VOICE_HOUR, true); + } + else + { + /* Pronounce the leading 0 */ + if(tm->tm_min < 10) + talk_id(VOICE_OH, true); + talk_number(tm->tm_min, true); } - talk_id(LANG_MONTH_JANUARY + tm->tm_mon, true); - talk_number(tm->tm_mday, true); - talk_number(1900 + tm->tm_year, true); } } + #endif diff --git a/apps/talk.h b/apps/talk.h index a939c1f3d1..0dea8d6b18 100644 --- a/apps/talk.h +++ b/apps/talk.h @@ -80,9 +80,11 @@ void talk_shutup(void); /* Interrupt voice, as when enqueue is false */ #if CONFIG_RTC /* this is in talk.c which isnt compiled for hwcodec simulator */ #if !defined(SIMULATOR) || CONFIG_CODEC == SWCODEC -void talk_date_time(struct tm *time, bool speak_current_time_string); +void talk_time(struct tm *tm, bool enqueue); +void talk_date(struct tm *tm, bool enqueue); #else -#define talk_date_time(t, s) +#define talk_date(t, e) +#define talk_time(t, e) #endif #endif /* CONFIG_RTC */