summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2012-01-03 23:44:38 +0000
committerThomas Martitz <kugel@rockbox.org>2012-01-03 23:44:38 +0000
commitc1bd9b0361ba92c29ceef68d74093e70a1a3e481 (patch)
tree1a42acdf2099b7f5ac06eee11e1d488b388c6d9f /apps
parent949e6398c89e3c277a4c542f67a5ee788c6f642d (diff)
downloadrockbox-c1bd9b0361ba92c29ceef68d74093e70a1a3e481.tar.gz
rockbox-c1bd9b0361ba92c29ceef68d74093e70a1a3e481.zip
Rework powermgmt to enable code re-use on appliation and sims.
* Introduce CONFIG_BATTERY_MEASURE define, to allow targets (application) to break powermgmt.c's assumption about the ability to read battery voltage. There's now additionally percentage (android) and remaining time measure (maemo). No measure at all also works (sdl app). If voltage can't be measured, then battery_level() is king and it'll be used for power_history and runtime estimation. * Implement target's API in the simulator, i.e. _battery_voltage(), so it doesn't need to implement it's own powermgmt.c and other stubs. Now the sim behaves much more like a native target, although it still changes the simulated battery voltage quickly, * Other changes include include renaming battery_adc_voltage() to _battery_voltage(), for consistency with the new target functions and making some of the apps code aware that voltage and runtime estimation is not always available. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@31548 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/debug_menu.c66
-rw-r--r--apps/gui/skin_engine/skin_tokens.c10
-rw-r--r--apps/menus/main_menu.c6
-rw-r--r--apps/menus/theme_menu.c6
-rw-r--r--apps/misc.c4
-rw-r--r--apps/plugin.c2
-rw-r--r--apps/plugin.h4
-rw-r--r--apps/plugins/SOURCES2
-rw-r--r--apps/settings.h2
-rw-r--r--apps/settings_list.c2
10 files changed, 68 insertions, 36 deletions
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index b4d917a3eb..340407176c 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -900,8 +900,7 @@ static bool tsc2100_debug(void)
900 return simplelist_show_list(&info); 900 return simplelist_show_list(&info);
901} 901}
902#endif 902#endif
903#if (CONFIG_PLATFORM & PLATFORM_NATIVE) || defined(SAMSUNG_YPR0) 903#if (CONFIG_BATTERY_MEASURE != 0) && defined(HAVE_LCD_BITMAP) && !defined(SIMULATOR)
904#ifdef HAVE_LCD_BITMAP
905/* 904/*
906 * view_battery() shows a automatically scaled graph of the battery voltage 905 * view_battery() shows a automatically scaled graph of the battery voltage
907 * over time. Usable for estimating battery life / charging rate. 906 * over time. Usable for estimating battery life / charging rate.
@@ -909,13 +908,14 @@ static bool tsc2100_debug(void)
909 */ 908 */
910 909
911#define BAT_LAST_VAL MIN(LCD_WIDTH, POWER_HISTORY_LEN) 910#define BAT_LAST_VAL MIN(LCD_WIDTH, POWER_HISTORY_LEN)
912#define BAT_YSPACE (LCD_HEIGHT - 20) 911#define BAT_TSPACE 20
912#define BAT_YSPACE (LCD_HEIGHT - BAT_TSPACE)
913 913
914 914
915static bool view_battery(void) 915static bool view_battery(void)
916{ 916{
917 int view = 0; 917 int view = 0;
918 int i, x, y, y1, y2, grid, graph; 918 int i, x, y, z, y1, y2, grid, graph;
919 unsigned short maxv, minv; 919 unsigned short maxv, minv;
920 920
921 lcd_setfont(FONT_SYSFIXED); 921 lcd_setfont(FONT_SYSFIXED);
@@ -934,19 +934,28 @@ static bool view_battery(void)
934 if (power_history[i] < minv) 934 if (power_history[i] < minv)
935 minv = power_history[i]; 935 minv = power_history[i];
936 } 936 }
937 937 /* print header */
938#if (CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE)
938 /* adjust grid scale */ 939 /* adjust grid scale */
939 if ((maxv - minv) > 50) 940 if ((maxv - minv) > 50)
940 grid = 50; 941 grid = 50;
941 else 942 else
942 grid = 5; 943 grid = 5;
943 944
944 /* print header */
945 lcd_putsf(0, 0, "battery %d.%03dV", power_history[0] / 1000, 945 lcd_putsf(0, 0, "battery %d.%03dV", power_history[0] / 1000,
946 power_history[0] % 1000); 946 power_history[0] % 1000);
947 lcd_putsf(0, 1, "%d.%03d-%d.%03dV (%2dmV)", 947 lcd_putsf(0, 1, "%d.%03d-%d.%03dV (%2dmV)",
948 minv / 1000, minv % 1000, maxv / 1000, maxv % 1000, 948 minv / 1000, minv % 1000, maxv / 1000, maxv % 1000,
949 grid); 949 grid);
950#elif (CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE)
951 /* adjust grid scale */
952 if ((maxv - minv) > 10)
953 grid = 10;
954 else
955 grid = 1;
956 lcd_putsf(0, 0, "battery %d%%", power_history[0]);
957 lcd_putsf(0, 1, "%d%%-%d%% (%d %%)", minv, maxv, grid);
958#endif
950 959
951 i = 1; 960 i = 1;
952 while ((y = (minv - (minv % grid)+i*grid)) < maxv) 961 while ((y = (minv - (minv % grid)+i*grid)) < maxv)
@@ -971,11 +980,11 @@ static bool view_battery(void)
971 { 980 {
972 y1 = (power_history[i] - minv) * BAT_YSPACE / 981 y1 = (power_history[i] - minv) * BAT_YSPACE /
973 (maxv - minv); 982 (maxv - minv);
974 y1 = MIN(MAX(LCD_HEIGHT-1 - y1, 20), 983 y1 = MIN(MAX(LCD_HEIGHT-1 - y1, BAT_TSPACE),
975 LCD_HEIGHT-1); 984 LCD_HEIGHT-1);
976 y2 = (power_history[i-1] - minv) * BAT_YSPACE / 985 y2 = (power_history[i-1] - minv) * BAT_YSPACE /
977 (maxv - minv); 986 (maxv - minv);
978 y2 = MIN(MAX(LCD_HEIGHT-1 - y2, 20), 987 y2 = MIN(MAX(LCD_HEIGHT-1 - y2, BAT_TSPACE),
979 LCD_HEIGHT-1); 988 LCD_HEIGHT-1);
980 989
981 lcd_set_drawmode(DRMODE_SOLID); 990 lcd_set_drawmode(DRMODE_SOLID);
@@ -999,10 +1008,13 @@ static bool view_battery(void)
999 lcd_putsf(0, 0, "Pwr status: %s", 1008 lcd_putsf(0, 0, "Pwr status: %s",
1000 charging_state() ? "charging" : "discharging"); 1009 charging_state() ? "charging" : "discharging");
1001#else 1010#else
1002 lcd_puts(0, 0, "Power status:"); 1011 lcd_puts(0, 0, "Power status: unknown");
1003#endif 1012#endif
1004 battery_read_info(&y, NULL); 1013 battery_read_info(&y, &z);
1005 lcd_putsf(0, 1, "Battery: %d.%03d V", y / 1000, y % 1000); 1014 if (y > 0)
1015 lcd_putsf(0, 1, "Battery: %d.%03d V (%d %%)", y / 1000, y % 1000, z);
1016 else if (z > 0)
1017 lcd_putsf(0, 1, "Battery: %d %%", z);
1006#ifdef ADC_EXT_POWER 1018#ifdef ADC_EXT_POWER
1007 y = (adc_read(ADC_EXT_POWER) * EXT_SCALE_FACTOR) / 1000; 1019 y = (adc_read(ADC_EXT_POWER) * EXT_SCALE_FACTOR) / 1000;
1008 lcd_putsf(0, 2, "External: %d.%03d V", y / 1000, y % 1000); 1020 lcd_putsf(0, 2, "External: %d.%03d V", y / 1000, y % 1000);
@@ -1169,16 +1181,23 @@ static bool view_battery(void)
1169#endif /* target type */ 1181#endif /* target type */
1170#endif /* CONFIG_CHARGING */ 1182#endif /* CONFIG_CHARGING */
1171 break; 1183 break;
1172
1173 case 2: /* voltage deltas: */ 1184 case 2: /* voltage deltas: */
1185#if (CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE)
1174 lcd_puts(0, 0, "Voltage deltas:"); 1186 lcd_puts(0, 0, "Voltage deltas:");
1175 1187 for (i = 0; i < POWER_HISTORY_LEN-1; i++) {
1176 for (i = 0; i <= 6; i++) {
1177 y = power_history[i] - power_history[i+1]; 1188 y = power_history[i] - power_history[i+1];
1178 lcd_putsf(0, i+1, "-%d min: %s%d.%03d V", i, 1189 lcd_putsf(0, i+1, "-%d min: %c%d.%03d V", i,
1179 (y < 0) ? "-" : "", ((y < 0) ? y * -1 : y) / 1000, 1190 (y < 0) ? '-' : ' ', ((y < 0) ? y * -1 : y) / 1000,
1180 ((y < 0) ? y * -1 : y ) % 1000); 1191 ((y < 0) ? y * -1 : y ) % 1000);
1181 } 1192 }
1193#elif (CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE)
1194 lcd_puts(0, 0, "Percentage deltas:");
1195 for (i = 0; i < POWER_HISTORY_LEN-1; i++) {
1196 y = power_history[i] - power_history[i+1];
1197 lcd_putsf(0, i+1, "-%d min: %c%d%%", i,
1198 (y < 0) ? '-' : ' ', ((y < 0) ? y * -1 : y));
1199 }
1200#endif
1182 break; 1201 break;
1183 1202
1184 case 3: /* remaining time estimation: */ 1203 case 3: /* remaining time estimation: */
@@ -1195,13 +1214,19 @@ static bool view_battery(void)
1195 lcd_putsf(0, 4, "Trickle sec: %d/60", trickle_sec); 1214 lcd_putsf(0, 4, "Trickle sec: %d/60", trickle_sec);
1196#endif /* ARCHOS_RECORDER */ 1215#endif /* ARCHOS_RECORDER */
1197 1216
1217#if (CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE)
1198 lcd_putsf(0, 5, "Last PwrHist: %d.%03dV", 1218 lcd_putsf(0, 5, "Last PwrHist: %d.%03dV",
1199 power_history[0] / 1000, 1219 power_history[0] / 1000,
1200 power_history[0] % 1000); 1220 power_history[0] % 1000);
1221#endif
1201 1222
1202 lcd_putsf(0, 6, "battery level: %d%%", battery_level()); 1223 lcd_putsf(0, 6, "battery level: %d%%", battery_level());
1203 1224
1204 lcd_putsf(0, 7, "Est. remain: %d m", battery_time()); 1225 int time_left = battery_time();
1226 if (time_left >= 0)
1227 lcd_putsf(0, 7, "Est. remain: %d m", time_left);
1228 else
1229 lcd_puts(0, 7, "Estimation n/a");
1205 break; 1230 break;
1206 } 1231 }
1207 1232
@@ -1228,8 +1253,7 @@ static bool view_battery(void)
1228 return false; 1253 return false;
1229} 1254}
1230 1255
1231#endif /* HAVE_LCD_BITMAP */ 1256#endif /* (CONFIG_BATTERY_MEASURE != 0) && HAVE_LCD_BITMAP */
1232#endif
1233 1257
1234#if (CONFIG_PLATFORM & PLATFORM_NATIVE) 1258#if (CONFIG_PLATFORM & PLATFORM_NATIVE)
1235#if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD) 1259#if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
@@ -2168,7 +2192,7 @@ static const struct the_menu_item menuitems[] = {
2168 { "View CPU stats", dbg_cpuinfo }, 2192 { "View CPU stats", dbg_cpuinfo },
2169#endif 2193#endif
2170#ifdef HAVE_LCD_BITMAP 2194#ifdef HAVE_LCD_BITMAP
2171#if (CONFIG_PLATFORM & PLATFORM_NATIVE) || defined(SAMSUNG_YPR0) 2195#if (CONFIG_BATTERY_MEASURE != 0) && !defined(SIMULATOR)
2172 { "View battery", view_battery }, 2196 { "View battery", view_battery },
2173#endif 2197#endif
2174#ifndef APPLICATION 2198#ifndef APPLICATION
diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c
index 169c4a36fd..bae8ae8f8e 100644
--- a/apps/gui/skin_engine/skin_tokens.c
+++ b/apps/gui/skin_engine/skin_tokens.c
@@ -1068,9 +1068,13 @@ const char *get_token_value(struct gui_wps *gwps,
1068 1068
1069 case SKIN_TOKEN_BATTERY_VOLTS: 1069 case SKIN_TOKEN_BATTERY_VOLTS:
1070 { 1070 {
1071 unsigned int v = battery_voltage(); 1071 int v = battery_voltage();
1072 snprintf(buf, buf_size, "%d.%02d", v / 1000, (v % 1000) / 10); 1072 if (v >= 0) {
1073 return buf; 1073 snprintf(buf, buf_size, "%d.%02d", v / 1000, (v % 1000) / 10);
1074 return buf;
1075 } else {
1076 return "?";
1077 }
1074 } 1078 }
1075 1079
1076 case SKIN_TOKEN_BATTERY_TIME: 1080 case SKIN_TOKEN_BATTERY_TIME:
diff --git a/apps/menus/main_menu.c b/apps/menus/main_menu.c
index cefc395b3d..b7472a6849 100644
--- a/apps/menus/main_menu.c
+++ b/apps/menus/main_menu.c
@@ -210,7 +210,7 @@ static const char* info_getname(int selected_item, void *data,
210 snprintf(buffer, buffer_len, str(LANG_BATTERY_TIME), 210 snprintf(buffer, buffer_len, str(LANG_BATTERY_TIME),
211 battery_level(), battery_time() / 60, battery_time() % 60); 211 battery_level(), battery_time() / 60, battery_time() % 60);
212 else 212 else
213 return "(n/a)"; 213 return "Battery n/a"; /* translating worth it? */
214 break; 214 break;
215 case INFO_DISK1: /* disk usage 1 */ 215 case INFO_DISK1: /* disk usage 1 */
216#ifdef HAVE_MULTIVOLUME 216#ifdef HAVE_MULTIVOLUME
@@ -289,9 +289,11 @@ static int info_speak_item(int selected_item, void * data)
289#endif /* CONFIG_CHARGING = */ 289#endif /* CONFIG_CHARGING = */
290 if (battery_level() >= 0) 290 if (battery_level() >= 0)
291 { 291 {
292 int time_left = battery_time();
292 talk_id(LANG_BATTERY_TIME, false); 293 talk_id(LANG_BATTERY_TIME, false);
293 talk_value(battery_level(), UNIT_PERCENT, true); 294 talk_value(battery_level(), UNIT_PERCENT, true);
294 talk_value(battery_time() *60, UNIT_TIME, true); 295 if (time_left >= 0)
296 talk_value(time_left * 60, UNIT_TIME, true);
295 } 297 }
296 else talk_id(VOICE_BLANK, false); 298 else talk_id(VOICE_BLANK, false);
297 break; 299 break;
diff --git a/apps/menus/theme_menu.c b/apps/menus/theme_menu.c
index e1077a5efd..5e04191ed1 100644
--- a/apps/menus/theme_menu.c
+++ b/apps/menus/theme_menu.c
@@ -219,7 +219,11 @@ MAKE_MENU(bars_menu, ID2P(LANG_BARS_MENU), 0, Icon_NOICON,
219#if CONFIG_KEYPAD == RECORDER_PAD 219#if CONFIG_KEYPAD == RECORDER_PAD
220 &buttonbar, 220 &buttonbar,
221#endif 221#endif
222 &volume_type, &battery_display); 222 &volume_type
223#if (CONFIG_BATTERY_MEASURE != 0)
224 , &battery_display
225#endif
226 );
223#endif /* HAVE_LCD_BITMAP */ 227#endif /* HAVE_LCD_BITMAP */
224 228
225/* */ 229/* */
diff --git a/apps/misc.c b/apps/misc.c
index b1def596ab..30c747113c 100644
--- a/apps/misc.c
+++ b/apps/misc.c
@@ -277,6 +277,7 @@ static bool clean_shutdown(void (*callback)(void *), void *parameter)
277 277
278 if (batt_safe) 278 if (batt_safe)
279 { 279 {
280 int level;
280#ifdef HAVE_TAGCACHE 281#ifdef HAVE_TAGCACHE
281 if (!tagcache_prepare_shutdown()) 282 if (!tagcache_prepare_shutdown())
282 { 283 {
@@ -285,7 +286,8 @@ static bool clean_shutdown(void (*callback)(void *), void *parameter)
285 return false; 286 return false;
286 } 287 }
287#endif 288#endif
288 if (battery_level() > 10) 289 level = battery_level();
290 if (level > 10 || level < 0)
289 splash(0, str(LANG_SHUTTINGDOWN)); 291 splash(0, str(LANG_SHUTTINGDOWN));
290 else 292 else
291 { 293 {
diff --git a/apps/plugin.c b/apps/plugin.c
index f17ad3c57a..25280750ce 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -664,9 +664,7 @@ static const struct plugin_api rockbox_api = {
664 battery_level, 664 battery_level,
665 battery_level_safe, 665 battery_level_safe,
666 battery_time, 666 battery_time,
667#if (CONFIG_PLATFORM & PLATFORM_NATIVE) || defined(SAMSUNG_YPR0)
668 battery_voltage, 667 battery_voltage,
669#endif
670#if CONFIG_CHARGING 668#if CONFIG_CHARGING
671 charger_inserted, 669 charger_inserted,
672# if CONFIG_CHARGING >= CHARGING_MONITOR 670# if CONFIG_CHARGING >= CHARGING_MONITOR
diff --git a/apps/plugin.h b/apps/plugin.h
index 0bb7262bd8..918206ab69 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -794,9 +794,7 @@ struct plugin_api {
794 int (*battery_level)(void); 794 int (*battery_level)(void);
795 bool (*battery_level_safe)(void); 795 bool (*battery_level_safe)(void);
796 int (*battery_time)(void); 796 int (*battery_time)(void);
797#if (CONFIG_PLATFORM & PLATFORM_NATIVE) || defined(SAMSUNG_YPR0) 797 int (*battery_voltage)(void);
798 unsigned int (*battery_voltage)(void);
799#endif
800#if CONFIG_CHARGING 798#if CONFIG_CHARGING
801 bool (*charger_inserted)(void); 799 bool (*charger_inserted)(void);
802# if CONFIG_CHARGING >= CHARGING_MONITOR 800# if CONFIG_CHARGING >= CHARGING_MONITOR
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index 1b14c0dd5e..a72579e3da 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -1,5 +1,5 @@
1/* plugins common to all models */ 1/* plugins common to all models */
2#ifndef SIMULATOR 2#if !defined(SIMULATOR) && (CONFIG_BATTERY_MEASURE != 0)
3battery_bench.c 3battery_bench.c
4#endif 4#endif
5chessclock.c 5chessclock.c
diff --git a/apps/settings.h b/apps/settings.h
index 676e5bfb56..d0fd3204e9 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -638,7 +638,7 @@ struct user_settings
638 638
639 /* power settings */ 639 /* power settings */
640 int poweroff; /* idle power off timer */ 640 int poweroff; /* idle power off timer */
641#ifdef BATTERY_CAPACITY_DEFAULT 641#if BATTERY_CAPACITY_DEFAULT > 0
642 int battery_capacity; /* in mAh */ 642 int battery_capacity; /* in mAh */
643#endif 643#endif
644 644
diff --git a/apps/settings_list.c b/apps/settings_list.c
index c9003bb8f3..dff5ed26f4 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -838,7 +838,7 @@ const struct settings_list settings[] = {
838 NULL, NULL, NULL), 838 NULL, NULL, NULL),
839/* use this setting for user code even if there's no exchangable battery 839/* use this setting for user code even if there's no exchangable battery
840 * support enabled */ 840 * support enabled */
841#ifdef BATTERY_CAPACITY_DEFAULT 841#if BATTERY_CAPACITY_DEFAULT > 0
842/* define min/max/inc for this file if there's only one battery */ 842/* define min/max/inc for this file if there's only one battery */
843#ifndef BATTERY_CAPACITY_MIN 843#ifndef BATTERY_CAPACITY_MIN
844#define BATTERY_CAPACITY_MIN BATTERY_CAPACITY_DEFAULT 844#define BATTERY_CAPACITY_MIN BATTERY_CAPACITY_DEFAULT