healthd: add update time check and fix voltage value
Bug: 16540867
Change-Id: Id51f7d2de16514d872a510a0ede8961fba66d2e7
Signed-off-by: keny_wu <keny_wu@htc.com>
diff --git a/health/healthd-flounder.cpp b/health/healthd-flounder.cpp
index 613803c..aa2395f 100644
--- a/health/healthd-flounder.cpp
+++ b/health/healthd-flounder.cpp
@@ -20,6 +20,7 @@
#include <fcntl.h>
#include <cutils/klog.h>
#include <sys/types.h>
+#include <sys/sysinfo.h>
/* Nominal voltage for ENERGY_COUNTER computation */
#define VOLTAGE_NOMINAL 3.7
@@ -39,11 +40,14 @@
#define BATTERY_DEAD_MV (3400)
#define NORMAL_MAX_SOC_DEC (2)
#define CRITICAL_LOW_FORCE_SOC_DROP (6)
+#define UPDATE_PERIOD_MINIMUM_S (55)
using namespace android;
static bool first_update_done;
static int lasttime_soc;
static unsigned int flounder_monitor_voltage;
+static long last_update_time;
+static bool force_decrease;
static int read_sysfs(const char *path, char *buf, size_t size) {
char *cp = NULL;
@@ -103,6 +107,9 @@
{
if (props->batteryStatus == BATTERY_STATUS_UNKNOWN)
props->batteryStatus = BATTERY_STATUS_DISCHARGING;
+ else if (props->batteryStatus == BATTERY_STATUS_FULL &&
+ props->batteryLevel < BATTERY_FULL)
+ props->batteryStatus = BATTERY_STATUS_CHARGING;
}
static void flounder_health_check(struct BatteryProperties *props)
@@ -123,7 +130,7 @@
if (props->batteryStatus != BATTERY_STATUS_CHARGING &&
props->batteryStatus != BATTERY_STATUS_FULL && props->batteryLevel > 0) {
- vcell_mv = props->batteryVoltage / 1000;
+ vcell_mv = props->batteryVoltage;
if (vcell_mv > BATTERY_CRITICAL_LOW_MV)
monitor_voltage = BATTERY_CRITICAL_LOW_MV;
else if (vcell_mv > BATTERY_DEAD_MV)
@@ -141,6 +148,16 @@
{
int soc_decrease;
int soc, vcell_mv;
+ struct sysinfo info;
+ long uptime = 0;
+ int ret;
+
+ ret = sysinfo(&info);
+ if (ret) {
+ KLOG_ERROR(LOG_TAG, "Fail to get sysinfo!!\n");
+ uptime = last_update_time;
+ } else
+ uptime = info.uptime;
if (!first_update_done) {
if (props->batteryLevel >= BATTERY_FULL) {
@@ -149,14 +166,14 @@
} else {
lasttime_soc = props->batteryLevel;
}
+ last_update_time = uptime;
first_update_done = true;
}
- if (props->batteryLevel == BATTERY_STATUS_FULL)
+ if (props->batteryStatus == BATTERY_STATUS_FULL)
soc = BATTERY_FULL;
else if (props->batteryLevel >= BATTERY_FULL &&
- lasttime_soc < BATTERY_FULL &&
- props->batteryStatus != BATTERY_STATUS_FULL)
+ lasttime_soc < BATTERY_FULL)
soc = BATTERY_FULL - 1;
else
soc = props->batteryLevel;
@@ -166,16 +183,24 @@
else if (props->batteryLevel < 0)
props->batteryLevel = 0;
- vcell_mv = props->batteryVoltage / 1000;
+ vcell_mv = props->batteryVoltage;
if (props->batteryStatus == BATTERY_STATUS_DISCHARGING ||
+ props->batteryStatus == BATTERY_STATUS_NOT_CHARGING ||
props->batteryStatus == BATTERY_STATUS_UNKNOWN) {
if (vcell_mv >= BATTERY_CRITICAL_LOW_MV) {
+ force_decrease = false;
soc_decrease = lasttime_soc - soc;
if (soc_decrease < 0) {
soc = lasttime_soc;
goto done;
}
+ if (uptime > last_update_time &&
+ uptime - last_update_time <= UPDATE_PERIOD_MINIMUM_S) {
+ soc = lasttime_soc;
+ goto done;
+ }
+
if (soc_decrease < 0)
soc_decrease = 0;
else if (soc_decrease > NORMAL_MAX_SOC_DEC)
@@ -185,17 +210,28 @@
} else if (vcell_mv < BATTERY_DEAD_MV) {
soc = 0;
} else {
+ if (force_decrease &&
+ uptime > last_update_time &&
+ uptime - last_update_time <= UPDATE_PERIOD_MINIMUM_S) {
+ soc = lasttime_soc;
+ goto done;
+ }
+
soc_decrease = CRITICAL_LOW_FORCE_SOC_DROP;
if (lasttime_soc <= soc_decrease)
soc = 0;
else
soc = lasttime_soc - soc_decrease;
+ force_decrease = true;
}
- } else if (soc > lasttime_soc) {
- soc = lasttime_soc + 1;
+ } else {
+ force_decrease = false;
+ if (soc > lasttime_soc)
+ soc = lasttime_soc + 1;
}
+ last_update_time = uptime;
done:
- props->batteryLevel = soc;
+ props->batteryLevel = lasttime_soc = soc;
}
static void flounder_bat_monitor(struct BatteryProperties *props)