summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--uisimulator/common/powermgmt-sim.c84
1 files changed, 55 insertions, 29 deletions
diff --git a/uisimulator/common/powermgmt-sim.c b/uisimulator/common/powermgmt-sim.c
index 4445185bb9..41732c94a2 100644
--- a/uisimulator/common/powermgmt-sim.c
+++ b/uisimulator/common/powermgmt-sim.c
@@ -30,51 +30,76 @@
#define BATT_MAXMVOLT 4300 /* maximum millivolts of battery */
#define BATT_MAXRUNTIME (10 * 60) /* maximum runtime with full battery in
minutes */
+/* Number of millivolts to discharge the battery every second */
+#define BATT_DISCHARGE_STEP ((BATT_MAXMVOLT - BATT_MINMVOLT) / 100)
+/* Number of millivolts to charge the battery every second */
+#define BATT_CHARGE_STEP (BATT_DISCHARGE_STEP * 2)
+#if CONFIG_CHARGING >= CHARGING_MONITOR
+/* Number of seconds to externally power before discharging again */
+#define POWER_AFTER_CHARGE_TICKS (8 * HZ)
+#endif
extern int battery_percent;
static bool charging = false;
-
static unsigned int battery_millivolts = BATT_MAXMVOLT;
void powermgmt_init_target(void) {}
static void battery_status_update(void)
{
- static long last_tick = 0;
+ /* Delay next battery update until tick */
+ static long update_after_tick = 0;
+#if CONFIG_CHARGING >= CHARGING_MONITOR
+ /* When greater than 0, the tick to unplug the external power at */
+ static unsigned int ext_power_until_tick = 0;
+#endif
- if (TIME_AFTER(current_tick, (last_tick+HZ))) {
- last_tick = current_tick;
+ if TIME_BEFORE(current_tick, update_after_tick)
+ return;
- /* change the values: */
- if (charging) {
- if (battery_millivolts >= BATT_MAXMVOLT) {
-#if CONFIG_CHARGING
- /* Pretend the charger was disconnected */
- charger_input_state = CHARGER_UNPLUGGED;
-#endif
- charging = false;
- }
+ update_after_tick = current_tick + HZ;
+
+#if CONFIG_CHARGING >= CHARGING_MONITOR
+ /* Handle period of being externally powered */
+ if (ext_power_until_tick > 0) {
+ if (TIME_AFTER(current_tick, ext_power_until_tick)) {
+ /* Pretend the charger was disconnected */
+ charger_input_state = CHARGER_UNPLUGGED;
+ ext_power_until_tick = 0;
}
- else {
- if (battery_millivolts <= BATT_MINMVOLT) {
-#if CONFIG_CHARGING
- /* Pretend the charger was connected */
- charger_input_state = CHARGER_PLUGGED;
+ return;
+ }
#endif
- charging = true;
- }
- }
- if (charging) {
- battery_millivolts += (BATT_MAXMVOLT - BATT_MINMVOLT) / 50;
+ if (charging) {
+ battery_millivolts += BATT_CHARGE_STEP;
+ if (battery_millivolts >= BATT_MAXMVOLT) {
+ charging = false;
+ battery_percent = 100;
+#if CONFIG_CHARGING >= CHARGING_MONITOR
+ /* Keep external power until tick */
+ ext_power_until_tick = current_tick + POWER_AFTER_CHARGE_TICKS;
+#elif CONFIG_CHARGING
+ /* Pretend the charger was disconnected */
+ charger_input_state = CHARGER_UNPLUGGED;
+#endif
+ return;
}
- else {
- battery_millivolts -= (BATT_MAXMVOLT - BATT_MINMVOLT) / 100;
+ } else {
+ battery_millivolts -= BATT_DISCHARGE_STEP;
+ if (battery_millivolts <= BATT_MINMVOLT) {
+ charging = true;
+ battery_percent = 0;
+#if CONFIG_CHARGING
+ /* Pretend the charger was connected */
+ charger_input_state = CHARGER_PLUGGED;
+#endif
+ return;
}
-
- battery_percent = 100 * (battery_millivolts - BATT_MINMVOLT) /
- (BATT_MAXMVOLT - BATT_MINMVOLT);
}
+
+ battery_percent = 100 * (battery_millivolts - BATT_MINMVOLT) /
+ (BATT_MAXMVOLT - BATT_MINMVOLT);
}
const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = { 3200 };
@@ -96,7 +121,8 @@ int _battery_voltage(void)
#if CONFIG_CHARGING
unsigned int power_input_status(void)
{
- return charging ? POWER_INPUT_CHARGER : POWER_INPUT_NONE;
+ return charger_input_state >= CHARGER_PLUGGED
+ ? POWER_INPUT_CHARGER : POWER_INPUT_NONE;
}
bool charging_state(void)