summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2007-06-29 19:01:24 +0000
committerJens Arnold <amiconn@rockbox.org>2007-06-29 19:01:24 +0000
commitda5910eac0629c4ac38c7967160e455ae6db9915 (patch)
tree551cdd72c3aa945fcd97659ccf71da31f3ca4643
parent63c266e5e543cf7341418b1a83e938d05ede2c7d (diff)
downloadrockbox-da5910eac0629c4ac38c7967160e455ae6db9915.zip
rockbox-da5910eac0629c4ac38c7967160e455ae6db9915.tar.gz
rockbox-da5910eac0629c4ac38c7967160e455ae6db9915.tar.bz2
rockbox-da5910eac0629c4ac38c7967160e455ae6db9915.tar.xz
Shutdown and powermanagement cleanup: * Use the proper function for determining whether the battery level is safe, and get rid of the extra one. Low battery warning now appears at 10% or less. * Don't delay shutdown artificially by 3 seconds due to low/critical battery warning. * Shutdown at critical battery level: Skip all disk-hitting housekeeping, make sure dircache stops, and don't mark disk as clean in eeprom.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13734 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/misc.c75
-rw-r--r--firmware/export/powermgmt.h3
-rw-r--r--firmware/powermgmt.c13
3 files changed, 43 insertions, 48 deletions
diff --git a/apps/misc.c b/apps/misc.c
index 08e699e..88ec73e 100644
--- a/apps/misc.c
+++ b/apps/misc.c
@@ -611,7 +611,7 @@ static bool clean_shutdown(void (*callback)(void *), void *parameter)
if(!charger_inserted())
#endif
{
- bool batt_crit = battery_level_critical();
+ bool batt_safe = battery_level_safe();
int audio_stat = audio_status();
FOR_NB_SCREENS(i)
@@ -619,15 +619,8 @@ static bool clean_shutdown(void (*callback)(void *), void *parameter)
#ifdef X5_BACKLIGHT_SHUTDOWN
x5_backlight_shutdown();
#endif
- if (!battery_level_safe())
- gui_syncsplash(3*HZ, "%s %s",
- str(LANG_WARNING_BATTERY_EMPTY),
- str(LANG_SHUTTINGDOWN));
- else if (battery_level_critical())
- gui_syncsplash(3*HZ, "%s %s",
- str(LANG_WARNING_BATTERY_LOW),
- str(LANG_SHUTTINGDOWN));
- else {
+ if (batt_safe)
+ {
#ifdef HAVE_TAGCACHE
if (!tagcache_prepare_shutdown())
{
@@ -636,44 +629,60 @@ static bool clean_shutdown(void (*callback)(void *), void *parameter)
return false;
}
#endif
- gui_syncsplash(0, str(LANG_SHUTTINGDOWN));
+ if (battery_level() > 10)
+ gui_syncsplash(0, str(LANG_SHUTTINGDOWN));
+ else
+ gui_syncsplash(0, "%s %s",
+ str(LANG_WARNING_BATTERY_LOW),
+ str(LANG_SHUTTINGDOWN));
+ }
+ else
+ {
+ gui_syncsplash(0, "%s %s",
+ str(LANG_WARNING_BATTERY_EMPTY),
+ str(LANG_SHUTTINGDOWN));
}
- if (global_settings.fade_on_stop
+ if (global_settings.fade_on_stop
&& (audio_stat & AUDIO_STATUS_PLAY))
{
fade(0);
}
-#if defined(HAVE_RECORDING) && CONFIG_CODEC == SWCODEC
- if (!batt_crit && (audio_stat & AUDIO_STATUS_RECORD))
+ if (batt_safe) /* do not save on critical battery */
{
- audio_stop_recording();
- while(audio_status() & AUDIO_STATUS_RECORD)
- sleep(1);
- }
-
- audio_close_recording();
+#if defined(HAVE_RECORDING) && CONFIG_CODEC == SWCODEC
+ if (audio_stat & AUDIO_STATUS_RECORD)
+ audio_stop_recording();
#endif
- /* audio_stop_recording == audio_stop for HWCODEC */
+ /* audio_stop_recording == audio_stop for HWCODEC */
+ audio_stop();
- audio_stop();
- while (audio_status())
- sleep(1);
-
- if (callback != NULL)
- callback(parameter);
+ if (callback != NULL)
+ callback(parameter);
- if (!batt_crit) /* do not save on critical battery */
+ /* wait for audio_stop or audio_stop_recording to complete */
+ while (audio_status())
+ sleep(1);
+
+#if defined(HAVE_RECORDING) && CONFIG_CODEC == SWCODEC
+ audio_close_recording();
+#endif
system_flush();
#ifdef HAVE_EEPROM_SETTINGS
- if (firmware_settings.initialized)
- {
- firmware_settings.disk_clean = true;
- firmware_settings.bl_version = 0;
- eeprom_settings_store();
+ if (firmware_settings.initialized)
+ {
+ firmware_settings.disk_clean = true;
+ firmware_settings.bl_version = 0;
+ eeprom_settings_store();
+ }
+#endif
}
+#ifdef HAVE_DIRCACHE
+ else
+ dircache_disable();
#endif
+
shutdown_hw();
}
#endif
diff --git a/firmware/export/powermgmt.h b/firmware/export/powermgmt.h
index b8e8b58..d42cc30 100644
--- a/firmware/export/powermgmt.h
+++ b/firmware/export/powermgmt.h
@@ -144,9 +144,6 @@ void battery_read_info(int *adc, int *voltage, int *level);
/* Tells if the battery level is safe for disk writes */
bool battery_level_safe(void);
-/* Tells if battery is in critical power saving state */
-bool battery_level_critical(void);
-
void set_poweroff_timeout(int timeout);
void set_battery_capacity(int capacity); /* set local battery capacity value */
void set_battery_type(int type); /* set local battery type */
diff --git a/firmware/powermgmt.c b/firmware/powermgmt.c
index 000a8bb..26323c4 100644
--- a/firmware/powermgmt.c
+++ b/firmware/powermgmt.c
@@ -143,11 +143,6 @@ bool battery_level_safe(void)
return battery_level() >= 10;
}
-bool battery_level_critical(void)
-{
- return false;
-}
-
void set_poweroff_timeout(int timeout)
{
(void)timeout;
@@ -422,12 +417,6 @@ bool battery_level_safe(void)
return battery_centivolts > battery_level_dangerous[battery_type];
}
-/* Tells if the battery is in critical powersaving state */
-bool battery_level_critical(void)
-{
- return ((battery_capacity * battery_percent / BATTERY_CAPACITY_MIN) < 10);
-}
-
void set_poweroff_timeout(int timeout)
{
poweroff_timeout = timeout;
@@ -1291,7 +1280,7 @@ void shutdown_hw(void)
}
#endif
audio_stop();
- if (!battery_level_critical()) { /* do not save on critical battery */
+ if (battery_level_safe()) { /* do not save on critical battery */
#ifdef HAVE_LCD_BITMAP
glyph_cache_save();
#endif