Index: apps/lang/english.lang =================================================================== --- apps/lang/english.lang (revision 15044) +++ apps/lang/english.lang (working copy) @@ -11389,3 +11389,47 @@ lcd_color: "Line Selector Colours" + + id: LANG_CHARGER_REMOVED + desc: Tell the user when the charger is disconnected. +Only for voice + user: + + *: "Charger removed" + + + *: "Charger removed" + + + *: "Charger removed" + + + + id: LANG_CHARGER_INSERTED + desc: Tell the user when the charger is connected. +Only for voice + user: + + *: "Charger inserted" + + + *: "Charger inserted" + + + *: "Charger inserted" + + + +id: LANG_BATTERY_STATUS + desc: option to Speak battery levels when they hit 50, 20 and 5% + user: + + *: "Battery status notifications?" + + + *: "Battery status notifications?" + + + *: "Battery status notifications?" + + Index: apps/settings.h =================================================================== --- apps/settings.h (revision 15044) +++ apps/settings.h (working copy) @@ -535,7 +535,7 @@ bool talk_dir_clip; /* use directory .talk clips */ int talk_file; /* voice file mode: 0=off, 1=number, 2=spell */ bool talk_file_clip; /* use file .talk clips */ - + bool battery_status; /* file browser sorting */ int sort_file; /* 0=alpha, 1=date, 2=date (new first), 3=type */ int sort_dir; /* 0=alpha, 1=date (old first), 2=date (new first) */ Index: apps/menus/settings_menu.c =================================================================== --- apps/menus/settings_menu.c (revision 15044) +++ apps/menus/settings_menu.c (working copy) @@ -419,6 +419,8 @@ MENUITEM_SETTING(talk_dir_clip_item, &global_settings.talk_dir_clip, talk_callback); MENUITEM_SETTING(talk_file_item, &global_settings.talk_file, NULL); MENUITEM_SETTING(talk_file_clip_item, &global_settings.talk_file_clip, talk_callback); +MENUITEM_SETTING(battery_status_item, &global_settings.battery_status, NULL); + static int talk_callback(int action,const struct menu_item_ex *this_item) { static int oldval = 0; @@ -445,7 +447,8 @@ } MAKE_MENU(voice_settings_menu, ID2P(LANG_VOICE), 0, Icon_Voice, &talk_menu_item, &talk_dir_item, &talk_dir_clip_item, - &talk_file_item, &talk_file_clip_item); + &talk_file_item, &talk_file_clip_item, + &battery_status_item); /* VOICE MENU */ /***********************************/ Index: apps/settings_list.c =================================================================== --- apps/settings_list.c (revision 15044) +++ apps/settings_list.c (working copy) @@ -761,6 +761,7 @@ ID2P(LANG_OFF), ID2P(LANG_VOICE_NUMBER), ID2P(LANG_VOICE_SPELL)), OFFON_SETTING(F_TEMPVAR, talk_file_clip, LANG_VOICE_FILE_TALK, false, "talk file clip", NULL), + OFFON_SETTING(F_TEMPVAR, battery_status, LANG_BATTERY_STATUS, false, "Battery status notifications", NULL), /* file sorting */ CHOICE_SETTING(0, sort_file, LANG_SORT_FILE, 0 , Index: apps/misc.c =================================================================== --- apps/misc.c (revision 15044) +++ apps/misc.c (working copy) @@ -857,6 +857,16 @@ { switch(event) { + case SYS_BATTERY_UPDATE: + if(global_settings.battery_status) + { + if(talk_menus_enabled ()) + { + talk_id(LANG_BATTERY_TIME, true); + talk_value(battery_level(), UNIT_PERCENT, true); + } + } + break; case SYS_USB_CONNECTED: if (callback != NULL) callback(parameter); @@ -888,10 +898,20 @@ #if CONFIG_CHARGING case SYS_CHARGER_CONNECTED: car_adapter_mode_processing(true); + if(global_settings.battery_status) + { + if(talk_menus_enabled ()) + talk_id(LANG_CHARGER_INSERTED, true); + } return SYS_CHARGER_CONNECTED; case SYS_CHARGER_DISCONNECTED: car_adapter_mode_processing(false); + if(global_settings.battery_status) + { + if(talk_menus_enabled ()) + talk_id(LANG_CHARGER_REMOVED, true); + } return SYS_CHARGER_DISCONNECTED; case SYS_CAR_ADAPTER_RESUME: Index: firmware/export/kernel.h =================================================================== --- firmware/export/kernel.h (revision 15044) +++ firmware/export/kernel.h (working copy) @@ -62,6 +62,7 @@ #define SYS_POWEROFF MAKE_SYS_EVENT(SYS_EVENT_CLS_POWER, 0) #define SYS_CHARGER_CONNECTED MAKE_SYS_EVENT(SYS_EVENT_CLS_POWER, 1) #define SYS_CHARGER_DISCONNECTED MAKE_SYS_EVENT(SYS_EVENT_CLS_POWER, 2) +#define SYS_BATTERY_UPDATE MAKE_SYS_EVENT(SYS_EVENT_CLS_POWER, 3) #define SYS_FS_CHANGED MAKE_SYS_EVENT(SYS_EVENT_CLS_FILESYS, 0) #define SYS_HOTSWAP_INSERTED MAKE_SYS_EVENT(SYS_EVENT_CLS_PLUG, 0) #define SYS_HOTSWAP_EXTRACTED MAKE_SYS_EVENT(SYS_EVENT_CLS_PLUG, 1) Index: firmware/export/powermgmt.h =================================================================== --- firmware/export/powermgmt.h (revision 15044) +++ firmware/export/powermgmt.h (working copy) @@ -174,5 +174,4 @@ void cancel_shutdown(void); void shutdown_hw(void); void sys_poweroff(void); - #endif Index: firmware/powermgmt.c =================================================================== --- firmware/powermgmt.c (revision 15044) +++ firmware/powermgmt.c (working copy) @@ -74,12 +74,14 @@ #else #define DEBUG_STACK 0 #endif - static int shutdown_timeout = 0; #if CONFIG_CHARGING >= CHARGING_MONITOR charge_state_type charge_state; /* charging mode */ #endif +static int last_sent_level = 100; +static void send_level(void); + #if CONFIG_CHARGING charger_input_state_type charger_input_state IDATA_ATTR; #endif @@ -95,6 +97,7 @@ static int batt_time = BATT_MAXRUNTIME; /* estimated remaining time in minutes */ static time_t last_change = 0; + static void battery_status_update(void) { time_t now; @@ -111,6 +114,7 @@ batt_level = 100 * (batt_millivolts - BATT_MINMVOLT) / (BATT_MAXMVOLT - BATT_MINMVOLT); batt_time = batt_level * BATT_MAXRUNTIME / 100; } + send_level(); } void battery_read_info(int *voltage, int *level) @@ -459,6 +463,7 @@ } battery_percent = level; + send_level(); } /* @@ -638,6 +643,7 @@ return; case CHARGER_PLUGGED: queue_broadcast(SYS_CHARGER_CONNECTED, 0); + last_sent_level = 0; charger_input_state = CHARGER; break; case CHARGER: @@ -649,6 +655,7 @@ break; case CHARGER_UNPLUGGED: queue_broadcast(SYS_CHARGER_DISCONNECTED, 0); + last_sent_level = 100; charger_input_state = NO_CHARGER; break; case CHARGER_PLUGGED: @@ -1192,3 +1199,21 @@ power_off(); #endif /* #ifndef SIMULATOR */ } + +/*Returns the battery level on certain levels.*/ +static void send_level(void) +{ + int current_level = battery_level(); + const int levels[] = { 5, 20, 50, 0 }; + const int *level = levels; + while (*level) + { + if (current_level <= *level && last_sent_level > *level) + { + last_sent_level = *level; + queue_broadcast(SYS_BATTERY_UPDATE, last_sent_level); + break; + } + level++; + } +}