summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2020-12-24 00:04:14 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2020-12-24 00:04:14 +0000
commit76f2c6785fe6d87fc132f4f3483e3f4c9a7c4f50 (patch)
treebe3f299aede5edcf567fe2c6bf98a68ded7980c4
parentd43c35df538fc46f09a56beacc00b5274f657a93 (diff)
parentb4d9a38de38fdb15809aa1b95c7cbc7260a4b2d2 (diff)
downloadpixel-android11-qpr2-release.tar.gz
Change-Id: Ife4f4a5f8908a02f855975e09222e9438e0dcaee
-rw-r--r--health/BatteryDefender.cpp35
-rw-r--r--health/include/pixelhealth/BatteryDefender.h10
-rw-r--r--health/test/TestBatteryDefender.cpp23
3 files changed, 50 insertions, 18 deletions
diff --git a/health/BatteryDefender.cpp b/health/BatteryDefender.cpp
index 5873567d..4d937415 100644
--- a/health/BatteryDefender.cpp
+++ b/health/BatteryDefender.cpp
@@ -34,10 +34,12 @@ namespace google {
namespace pixel {
namespace health {
-BatteryDefender::BatteryDefender(const char *pathChargeLevelStart, const char *pathChargeLevelStop,
- const int32_t timeToActivateSecs,
+BatteryDefender::BatteryDefender(const char *pathWirelessPresent, const char *pathChargeLevelStart,
+ const char *pathChargeLevelStop, const int32_t timeToActivateSecs,
const int32_t timeToClearTimerSecs)
- : kPathChargeLevelStart(pathChargeLevelStart),
+
+ : kPathWirelessPresent(pathWirelessPresent),
+ kPathChargeLevelStart(pathChargeLevelStart),
kPathChargeLevelStop(pathChargeLevelStop),
kTimeToActivateSecs(timeToActivateSecs),
kTimeToClearTimerSecs(timeToClearTimerSecs) {
@@ -75,11 +77,13 @@ void BatteryDefender::removeLineEndings(std::string *str) {
str->erase(std::remove(str->begin(), str->end(), '\r'), str->end());
}
-int BatteryDefender::readFileToInt(const char *path) {
+int BatteryDefender::readFileToInt(const char *path, const bool optionalFile) {
std::string buffer;
int value = 0; // default
if (!android::base::ReadFileToString(path, &buffer)) {
- LOG(ERROR) << "Failed to read " << path;
+ if (optionalFile == false) {
+ LOG(ERROR) << "Failed to read " << path;
+ }
} else {
removeLineEndings(&buffer);
if (!android::base::ParseInt(buffer.c_str(), &value)) {
@@ -145,12 +149,18 @@ void BatteryDefender::writeChargeLevelsToFile(const int vendorStart, const int v
}
}
-bool BatteryDefender::isChargePowerAvailable(const bool chargerWirelessOnline) {
+bool BatteryDefender::isChargePowerAvailable(void) {
// USB presence is an indicator of power availability
const bool chargerPresentWired = readFileToInt(kPathUSBChargerPresent) != 0;
+ const bool chargerPresentWireless =
+ readFileToInt(kPathWirelessPresent, mIgnoreWirelessFileError) != 0;
mIsUsbPresent = chargerPresentWired;
+ mIsWirelessPresent = chargerPresentWireless;
+
+ // Report wireless read error only once; some devices may not have a wireless adapter
+ mIgnoreWirelessFileError = true;
- return chargerPresentWired || chargerWirelessOnline;
+ return chargerPresentWired || chargerPresentWireless;
}
bool BatteryDefender::isDefaultChargeLevel(const int start, const int stop) {
@@ -334,7 +344,7 @@ void BatteryDefender::updateDefenderProperties(struct android::BatteryProperties
/**
* If the kernel is forcing the input current limit to 0, then the online status may
* need to be overwritten. Also, setting a charge limit below the current charge level
- * may disable the adapter. This does not occur for wireless adapters.
+ * may disable the adapter.
* Note; only override "online" if necessary (all "online"s are false).
*/
if (props->chargerUsbOnline == false && props->chargerAcOnline == false) {
@@ -352,6 +362,13 @@ void BatteryDefender::updateDefenderProperties(struct android::BatteryProperties
mWasAcOnline = props->chargerAcOnline;
mWasUsbOnline = props->chargerUsbOnline;
}
+
+ /* Do the same as above for wireless adapters */
+ if (props->chargerWirelessOnline == false) {
+ if (mIsWirelessPresent && props->batteryHealth == android::BATTERY_HEALTH_OVERHEAT) {
+ props->chargerWirelessOnline = true;
+ }
+ }
}
void BatteryDefender::update(struct android::BatteryProperties *props) {
@@ -365,7 +382,7 @@ void BatteryDefender::update(struct android::BatteryProperties *props) {
const int chargeLevelVendorStop =
android::base::GetIntProperty(kPropChargeLevelVendorStop, kChargeLevelDefaultStop);
mIsDefenderDisabled = isBatteryDefenderDisabled(chargeLevelVendorStart, chargeLevelVendorStop);
- mIsPowerAvailable = isChargePowerAvailable(props->chargerWirelessOnline);
+ mIsPowerAvailable = isChargePowerAvailable();
mTimeBetweenUpdateCalls = getDeltaTimeSeconds(&mTimePreviousSecs);
// Run state machine
diff --git a/health/include/pixelhealth/BatteryDefender.h b/health/include/pixelhealth/BatteryDefender.h
index bf3c4929..4a16bcc6 100644
--- a/health/include/pixelhealth/BatteryDefender.h
+++ b/health/include/pixelhealth/BatteryDefender.h
@@ -44,7 +44,8 @@ const int DEFAULT_CAPACITY_LEVEL = 100;
class BatteryDefender {
public:
// Set default google charger paths - can be overridden for other devices
- BatteryDefender(const char *pathChargeLevelStart =
+ BatteryDefender(const char *pathWirelessPresent = "/sys/class/power_supply/wireless/present",
+ const char *pathChargeLevelStart =
"/sys/devices/platform/soc/soc:google,charger/charge_start_level",
const char *pathChargeLevelStop =
"/sys/devices/platform/soc/soc:google,charger/charge_stop_level",
@@ -71,6 +72,7 @@ class BatteryDefender {
[STATE_ACTIVE] = "ACTIVE",
};
+ const char *const kPathWirelessPresent;
const char *const kPathChargeLevelStart;
const char *const kPathChargeLevelStop;
const int32_t kTimeToActivateSecs;
@@ -114,6 +116,7 @@ class BatteryDefender {
int64_t mTimeBetweenUpdateCalls = 0;
int64_t mTimePreviousSecs;
bool mIsUsbPresent = false;
+ bool mIsWirelessPresent = false;
bool mIsPowerAvailable = false;
bool mIsDefenderDisabled = false;
int32_t mTimeToActivateSecsModified;
@@ -130,6 +133,7 @@ class BatteryDefender {
bool mHasReachedHighCapacityLevel = false;
bool mWasAcOnline = false;
bool mWasUsbOnline = true; /* Default; in case neither AC/USB online becomes 1 */
+ bool mIgnoreWirelessFileError = false;
// Process state actions
void stateMachine_runAction(const state_E state,
@@ -148,11 +152,11 @@ class BatteryDefender {
int64_t getDeltaTimeSeconds(int64_t *timeStartSecs);
int32_t getTimeToActivate(void);
void removeLineEndings(std::string *str);
- int readFileToInt(const char *path);
+ int readFileToInt(const char *path, const bool optionalFile = false);
bool writeIntToFile(const char *path, const int value);
void writeTimeToFile(const char *path, const int value, int64_t *previous);
void writeChargeLevelsToFile(const int vendorStart, const int vendorStop);
- bool isChargePowerAvailable(const bool chargerWirelessOnline);
+ bool isChargePowerAvailable(void);
bool isDefaultChargeLevel(const int start, const int stop);
bool isBatteryDefenderDisabled(const int vendorStart, const int vendorStop);
void addTimeToChargeTimers(void);
diff --git a/health/test/TestBatteryDefender.cpp b/health/test/TestBatteryDefender.cpp
index f050cccb..7366aabd 100644
--- a/health/test/TestBatteryDefender.cpp
+++ b/health/test/TestBatteryDefender.cpp
@@ -134,6 +134,7 @@ class BatteryDefenderTest : public ::testing::Test {
};
const char *kPathWiredChargerPresent = "/sys/class/power_supply/usb/present";
+const char *kPathWirelessChargerPresent = "/sys/class/power_supply/wireless/present";
const char *kPathPersistChargerPresentTime = "/mnt/vendor/persist/battery/defender_charger_time";
const char *kPathPersistDefenderActiveTime = "/mnt/vendor/persist/battery/defender_active_time";
const char *kPathStartLevel = "/sys/devices/platform/soc/soc:google,charger/charge_start_level";
@@ -165,8 +166,18 @@ static void usbPresent(void) {
.WillByDefault(DoAll(SetArgPointee<1>(std::string("1")), Return(true)));
}
+static void wirelessPresent(void) {
+ ON_CALL(*mock, ReadFileToString(kPathWirelessChargerPresent, _, _))
+ .WillByDefault(DoAll(SetArgPointee<1>(std::string("1")), Return(true)));
+}
+
+static void wirelessNotPresent(void) {
+ ON_CALL(*mock, ReadFileToString(kPathWirelessChargerPresent, _, _))
+ .WillByDefault(DoAll(SetArgPointee<1>(std::string("0")), Return(true)));
+}
+
static void powerAvailable(void) {
- props.chargerWirelessOnline = 1;
+ wirelessPresent();
usbPresent();
}
@@ -433,7 +444,7 @@ TEST_F(BatteryDefenderTest, ConnectDisconnectCycle) {
InSequence s;
// Power ON
- props.chargerWirelessOnline = true;
+ wirelessPresent();
EXPECT_CALL(*mock, WriteStringToFile(std::to_string(1000), kPathPersistChargerPresentTime, _));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
@@ -446,7 +457,7 @@ TEST_F(BatteryDefenderTest, ConnectDisconnectCycle) {
battDefender.update(&props);
// Power OFF
- props.chargerWirelessOnline = false;
+ wirelessNotPresent();
// Maintain kPathPersistChargerPresentTime = 1060
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
@@ -465,7 +476,7 @@ TEST_F(BatteryDefenderTest, ConnectDisconnectCycle) {
battDefender.update(&props);
// Power ON
- props.chargerWirelessOnline = true;
+ wirelessPresent();
// Maintain kPathPersistChargerPresentTime = 0
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
@@ -501,7 +512,7 @@ TEST_F(BatteryDefenderTest, ConnectDisconnectResumeTimeThreshold0) {
InSequence s;
// Power ON
- props.chargerWirelessOnline = true;
+ wirelessPresent();
EXPECT_CALL(*mock, WriteStringToFile(std::to_string(1000), kPathPersistChargerPresentTime, _));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
@@ -514,7 +525,7 @@ TEST_F(BatteryDefenderTest, ConnectDisconnectResumeTimeThreshold0) {
battDefender.update(&props);
// Power OFF
- props.chargerWirelessOnline = false;
+ wirelessNotPresent();
EXPECT_CALL(*mock, WriteStringToFile(std::to_string(0), kPathPersistChargerPresentTime, _));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "DISCONNECTED"));