diff options
| author | Jens Arnold <amiconn@rockbox.org> | 2007-06-29 19:01:24 +0000 |
|---|---|---|
| committer | Jens Arnold <amiconn@rockbox.org> | 2007-06-29 19:01:24 +0000 |
| commit | da5910eac0629c4ac38c7967160e455ae6db9915 (patch) | |
| tree | 551cdd72c3aa945fcd97659ccf71da31f3ca4643 | |
| parent | 63c266e5e543cf7341418b1a83e938d05ede2c7d (diff) | |
| download | rockbox-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.c | 75 | ||||
| -rw-r--r-- | firmware/export/powermgmt.h | 3 | ||||
| -rw-r--r-- | firmware/powermgmt.c | 13 |
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 |