Index: trunk/apps/lang/english.lang
===================================================================
--- trunk.orig/apps/lang/english.lang
+++ trunk/apps/lang/english.lang
@@ -11417,3 +11417,51 @@
*: "Blank"
+
+ id: VOICE_CHARGER_INSERTED
+ desc: Spoken only, for charger event announcement
+ user:
+
+ *: ""
+ charging: ""
+
+
+ *: ""
+ charging: ""
+
+
+ *: ""
+ charging: "Charger inserted"
+
+
+
+ id: VOICE_CHARGER_REMOVED
+ desc: Spoken only, for charger event announcement
+ user:
+
+ *: ""
+ charging: ""
+
+
+ *: ""
+ charging: ""
+
+
+ *: ""
+ charging: "Charger removed"
+
+
+
+ id: LANG_ANNOUNCE_BATTERY_LEVEL
+ desc: Setting for spontaneous battery level announcement
+ user:
+
+ *: "Announce Battery Level"
+
+
+ *: "Announce Battery Level"
+
+
+ *: "Announce Battery Level"
+
+
Index: trunk/apps/settings.h
===================================================================
--- trunk.orig/apps/settings.h
+++ trunk/apps/settings.h
@@ -536,6 +536,7 @@ struct user_settings
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 announce_battery_level;
/* file browser sorting */
int sort_file; /* 0=alpha, 1=date, 2=date (new first), 3=type */
Index: trunk/apps/menus/settings_menu.c
===================================================================
--- trunk.orig/apps/menus/settings_menu.c
+++ trunk/apps/menus/settings_menu.c
@@ -443,9 +443,12 @@ static int talk_callback(int action,cons
}
return action;
}
+MENUITEM_SETTING(announce_battery_level_item,
+ &global_settings.announce_battery_level, NULL);
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,
+ &announce_battery_level_item);
/* VOICE MENU */
/***********************************/
Index: trunk/apps/settings_list.c
===================================================================
--- trunk.orig/apps/settings_list.c
+++ trunk/apps/settings_list.c
@@ -761,6 +761,9 @@ const struct settings_list settings[] =
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, announce_battery_level,
+ LANG_ANNOUNCE_BATTERY_LEVEL, false,
+ "Announce Battery Level", NULL),
/* file sorting */
CHOICE_SETTING(0, sort_file, LANG_SORT_FILE, 0 ,
Index: trunk/apps/misc.c
===================================================================
--- trunk.orig/apps/misc.c
+++ trunk/apps/misc.c
@@ -857,6 +857,16 @@ long default_event_handler_ex(long event
{
switch(event)
{
+ case SYS_BATTERY_UPDATE:
+ if(global_settings.announce_battery_level && !talk_disabled())
+ {
+ talk_ids(true, VOICE_PAUSE, VOICE_PAUSE,
+ LANG_BATTERY_TIME,
+ TALK_ID(battery_level(), UNIT_PERCENT),
+ VOICE_PAUSE);
+ talk_force_enqueue_next();
+ }
+ break;
case SYS_USB_CONNECTED:
if (callback != NULL)
callback(parameter);
@@ -888,10 +898,20 @@ long default_event_handler_ex(long event
#if CONFIG_CHARGING
case SYS_CHARGER_CONNECTED:
car_adapter_mode_processing(true);
+ if(talk_menus_enabled ())
+ {
+ talk_id(VOICE_CHARGER_INSERTED, true);
+ talk_force_enqueue_next();
+ }
return SYS_CHARGER_CONNECTED;
case SYS_CHARGER_DISCONNECTED:
car_adapter_mode_processing(false);
+ if(talk_menus_enabled ())
+ {
+ talk_id(VOICE_CHARGER_REMOVED, true);
+ talk_force_enqueue_next();
+ }
return SYS_CHARGER_DISCONNECTED;
case SYS_CAR_ADAPTER_RESUME:
Index: trunk/firmware/export/kernel.h
===================================================================
--- trunk.orig/firmware/export/kernel.h
+++ trunk/firmware/export/kernel.h
@@ -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: trunk/firmware/powermgmt.c
===================================================================
--- trunk.orig/firmware/powermgmt.c
+++ trunk/firmware/powermgmt.c
@@ -80,6 +80,9 @@ static int shutdown_timeout = 0;
charge_state_type charge_state; /* charging mode */
#endif
+static void send_battery_level_event(void);
+static int last_sent_battery_level = 100;
+
#if CONFIG_CHARGING
charger_input_state_type charger_input_state IDATA_ATTR;
#endif
@@ -111,6 +114,7 @@ static void battery_status_update(void)
batt_level = 100 * (batt_millivolts - BATT_MINMVOLT) / (BATT_MAXMVOLT - BATT_MINMVOLT);
batt_time = batt_level * BATT_MAXRUNTIME / 100;
}
+ send_battery_level_event();
}
void battery_read_info(int *voltage, int *level)
@@ -459,6 +463,7 @@ static void battery_status_update(void)
}
battery_percent = level;
+ send_battery_level_event();
}
/*
@@ -638,6 +643,7 @@ static void power_thread_sleep(int ticks
return;
case CHARGER_PLUGGED:
queue_broadcast(SYS_CHARGER_CONNECTED, 0);
+ last_sent_battery_level = 0;
charger_input_state = CHARGER;
break;
case CHARGER:
@@ -649,6 +655,7 @@ static void power_thread_sleep(int ticks
break;
case CHARGER_UNPLUGGED:
queue_broadcast(SYS_CHARGER_DISCONNECTED, 0);
+ last_sent_battery_level = 100;
charger_input_state = NO_CHARGER;
break;
case CHARGER_PLUGGED:
@@ -1192,3 +1199,22 @@ void shutdown_hw(void)
power_off();
#endif /* #ifndef SIMULATOR */
}
+
+/* Send system battery level update events on reaching certain
+ significant levels. */
+static void send_battery_level_event(void)
+{
+ int current_level = battery_level();
+ static const int levels[] = { 15, 30, 50, 0 };
+ const int *level = levels;
+ while (*level)
+ {
+ if (current_level <= *level && last_sent_battery_level > *level)
+ {
+ last_sent_battery_level = *level;
+ queue_broadcast(SYS_BATTERY_UPDATE, last_sent_battery_level);
+ break;
+ }
+ level++;
+ }
+}
Index: trunk/apps/talk.c
===================================================================
--- trunk.orig/apps/talk.c
+++ trunk/apps/talk.c
@@ -853,6 +853,10 @@ bool talk_menus_enabled(void)
{
return (global_settings.talk_menu && talk_menu_disable == 0);
}
+bool talk_disabled(void)
+{
+ return talk_menu_disable != 0;
+}
void talk_disable_menus(void)
Index: trunk/apps/talk.h
===================================================================
--- trunk.orig/apps/talk.h
+++ trunk/apps/talk.h
@@ -75,6 +75,11 @@ int talk_number(long n, bool enqueue); /
int talk_value(long n, int unit, bool enqueue); /* say a numeric value */
int talk_spell(const char* spell, bool enqueue); /* spell a string */
bool talk_menus_enabled(void); /* returns true if menus should be voiced */
+#if !defined(SIMULATOR) || CONFIG_CODEC == SWCODEC
+bool talk_disabled(void);
+#else
+#define talk_disabled() (0)
+#endif
void talk_disable_menus(void); /* disable voice menus (temporarily, not persisted) */
void talk_enable_menus(void); /* re-enable voice menus */
int do_shutup(void); /* kill voice unconditionally */