Accept FS#7910: spontaneously speak out the battery level when it falls

under 50%, 30% and 15%. Guarded by an option under voice settings.


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15422 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Stéphane Doyon 2007-11-03 05:00:49 +00:00
parent 775279b63e
commit da93299865
8 changed files with 61 additions and 3 deletions

View file

@ -11448,3 +11448,17 @@
multivolume: "Not present" multivolume: "Not present"
</voice> </voice>
</phrase> </phrase>
<phrase>
id: LANG_TALK_BATTERY_LEVEL
desc: Setting for spontaneous battery level announcement
user:
<source>
*: "Announce Battery Level"
</source>
<dest>
*: "Announce Battery Level"
</dest>
<voice>
*: "Announce Battery Level"
</voice>
</phrase>

View file

@ -443,9 +443,12 @@ static int talk_callback(int action,const struct menu_item_ex *this_item)
} }
return action; return action;
} }
MENUITEM_SETTING(talk_battery_level_item,
&global_settings.talk_battery_level, NULL);
MAKE_MENU(voice_settings_menu, ID2P(LANG_VOICE), 0, Icon_Voice, MAKE_MENU(voice_settings_menu, ID2P(LANG_VOICE), 0, Icon_Voice,
&talk_menu_item, &talk_dir_item, &talk_dir_clip_item, &talk_menu_item, &talk_dir_item, &talk_dir_clip_item,
&talk_file_item, &talk_file_clip_item); &talk_file_item, &talk_file_clip_item,
&talk_battery_level_item);
/* VOICE MENU */ /* VOICE MENU */
/***********************************/ /***********************************/

View file

@ -857,6 +857,16 @@ long default_event_handler_ex(long event, void (*callback)(void *), void *parame
{ {
switch(event) switch(event)
{ {
case SYS_BATTERY_UPDATE:
if(global_settings.talk_battery_level)
{
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: case SYS_USB_CONNECTED:
if (callback != NULL) if (callback != NULL)
callback(parameter); callback(parameter);

View file

@ -112,12 +112,12 @@
#define PLUGIN_MAGIC 0x526F634B /* RocK */ #define PLUGIN_MAGIC 0x526F634B /* RocK */
/* increase this every time the api struct changes */ /* increase this every time the api struct changes */
#define PLUGIN_API_VERSION 86 #define PLUGIN_API_VERSION 87
/* update this to latest version if a change to the api struct breaks /* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any backwards compatibility (and please take the opportunity to sort in any
new function which are "waiting" at the end of the function table) */ new function which are "waiting" at the end of the function table) */
#define PLUGIN_MIN_API_VERSION 86 #define PLUGIN_MIN_API_VERSION 87
/* plugin return codes */ /* plugin return codes */
enum plugin_status { enum plugin_status {

View file

@ -529,6 +529,7 @@ struct user_settings
bool talk_dir_clip; /* use directory .talk clips */ bool talk_dir_clip; /* use directory .talk clips */
int talk_file; /* voice file mode: 0=off, 1=number, 2=spell */ int talk_file; /* voice file mode: 0=off, 1=number, 2=spell */
bool talk_file_clip; /* use file .talk clips */ bool talk_file_clip; /* use file .talk clips */
bool talk_battery_level;
/* file browser sorting */ /* file browser sorting */
int sort_file; /* 0=alpha, 1=date, 2=date (new first), 3=type */ int sort_file; /* 0=alpha, 1=date, 2=date (new first), 3=type */

View file

@ -753,6 +753,9 @@ const struct settings_list settings[] = {
ID2P(LANG_OFF), ID2P(LANG_VOICE_NUMBER), ID2P(LANG_OFF), ID2P(LANG_VOICE_NUMBER),
ID2P(LANG_VOICE_SPELL)), ID2P(LANG_VOICE_SPELL)),
OFFON_SETTING(F_TEMPVAR, talk_file_clip, LANG_VOICE_FILE_TALK, false, "talk file clip", NULL), OFFON_SETTING(F_TEMPVAR, talk_file_clip, LANG_VOICE_FILE_TALK, false, "talk file clip", NULL),
OFFON_SETTING(F_TEMPVAR, talk_battery_level,
LANG_TALK_BATTERY_LEVEL, false,
"Announce Battery Level", NULL),
/* file sorting */ /* file sorting */
CHOICE_SETTING(0, sort_file, LANG_SORT_FILE, 0 , CHOICE_SETTING(0, sort_file, LANG_SORT_FILE, 0 ,

View file

@ -65,6 +65,7 @@
#define SYS_POWEROFF MAKE_SYS_EVENT(SYS_EVENT_CLS_POWER, 0) #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_CONNECTED MAKE_SYS_EVENT(SYS_EVENT_CLS_POWER, 1)
#define SYS_CHARGER_DISCONNECTED MAKE_SYS_EVENT(SYS_EVENT_CLS_POWER, 2) #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_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_INSERTED MAKE_SYS_EVENT(SYS_EVENT_CLS_PLUG, 0)
#define SYS_HOTSWAP_EXTRACTED MAKE_SYS_EVENT(SYS_EVENT_CLS_PLUG, 1) #define SYS_HOTSWAP_EXTRACTED MAKE_SYS_EVENT(SYS_EVENT_CLS_PLUG, 1)

View file

@ -80,6 +80,9 @@ static int shutdown_timeout = 0;
charge_state_type charge_state; /* charging mode */ charge_state_type charge_state; /* charging mode */
#endif #endif
static void send_battery_level_event(void);
static int last_sent_battery_level = 100;
#if CONFIG_CHARGING #if CONFIG_CHARGING
charger_input_state_type charger_input_state IDATA_ATTR; charger_input_state_type charger_input_state IDATA_ATTR;
#endif #endif
@ -111,6 +114,7 @@ static void battery_status_update(void)
batt_level = 100 * (batt_millivolts - BATT_MINMVOLT) / (BATT_MAXMVOLT - BATT_MINMVOLT); batt_level = 100 * (batt_millivolts - BATT_MINMVOLT) / (BATT_MAXMVOLT - BATT_MINMVOLT);
batt_time = batt_level * BATT_MAXRUNTIME / 100; batt_time = batt_level * BATT_MAXRUNTIME / 100;
} }
send_battery_level_event();
} }
void battery_read_info(int *voltage, int *level) void battery_read_info(int *voltage, int *level)
@ -459,6 +463,7 @@ static void battery_status_update(void)
} }
battery_percent = level; battery_percent = level;
send_battery_level_event();
} }
/* /*
@ -638,6 +643,7 @@ static void power_thread_sleep(int ticks)
return; return;
case CHARGER_PLUGGED: case CHARGER_PLUGGED:
queue_broadcast(SYS_CHARGER_CONNECTED, 0); queue_broadcast(SYS_CHARGER_CONNECTED, 0);
last_sent_battery_level = 0;
charger_input_state = CHARGER; charger_input_state = CHARGER;
break; break;
case CHARGER: case CHARGER:
@ -649,6 +655,7 @@ static void power_thread_sleep(int ticks)
break; break;
case CHARGER_UNPLUGGED: case CHARGER_UNPLUGGED:
queue_broadcast(SYS_CHARGER_DISCONNECTED, 0); queue_broadcast(SYS_CHARGER_DISCONNECTED, 0);
last_sent_battery_level = 100;
charger_input_state = NO_CHARGER; charger_input_state = NO_CHARGER;
break; break;
case CHARGER_PLUGGED: case CHARGER_PLUGGED:
@ -1192,3 +1199,22 @@ void shutdown_hw(void)
power_off(); power_off();
#endif /* #ifndef SIMULATOR */ #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++;
}
}