summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephane Lee <stayfan@google.com>2020-12-09 00:17:05 -0800
committerStephane Lee <stayfan@google.com>2020-12-15 15:28:15 -0800
commit3bf6cfbf722f19e80d3585caad10cd9ec29262b4 (patch)
tree6d0ff6fe51db7e5aebd425098e84b95fc2fe79c2
parent36b936b5ef6c32c635a691a6d65102bbd12dabfd (diff)
downloadpixel-3bf6cfbf722f19e80d3585caad10cd9ec29262b4.tar.gz
Allow the dwell defend battery defender to consume ctrl properties
Test: Ensure that the battery defender overrides its configuration based on the new properties. Run 'atest HealthTestCases' Bug: 173080734 Merged-In: I7fa8cba413bbbe9b8a74e5b12c3e9687e9373b11 Change-Id: I7fa8cba413bbbe9b8a74e5b12c3e9687e9373b11
-rw-r--r--health/BatteryDefender.cpp49
-rw-r--r--health/include/pixelhealth/BatteryDefender.h10
-rw-r--r--health/test/TestBatteryDefender.cpp149
3 files changed, 179 insertions, 29 deletions
diff --git a/health/BatteryDefender.cpp b/health/BatteryDefender.cpp
index e11d1a96..37d24e50 100644
--- a/health/BatteryDefender.cpp
+++ b/health/BatteryDefender.cpp
@@ -113,8 +113,20 @@ void BatteryDefender::writeChargeLevelsToFile(const int vendorStart, const int v
int chargeLevelStart = vendorStart;
int chargeLevelStop = vendorStop;
if (mCurrentState == STATE_ACTIVE) {
- chargeLevelStart = kChargeLevelDefenderStart;
- chargeLevelStop = kChargeLevelDefenderStop;
+ const int newDefenderLevelStart = android::base::GetIntProperty(
+ kPropBatteryDefenderCtrlStartSOC, kChargeLevelDefenderStart, 0, 100);
+ const int newDefenderLevelStop = android::base::GetIntProperty(
+ kPropBatteryDefenderCtrlStopSOC, kChargeLevelDefenderStop, 0, 100);
+ const bool overrideLevelsValid =
+ (newDefenderLevelStart <= newDefenderLevelStop) && (newDefenderLevelStop != 0);
+
+ if (overrideLevelsValid) {
+ chargeLevelStart = newDefenderLevelStart;
+ chargeLevelStop = newDefenderLevelStop;
+ } else {
+ chargeLevelStart = kChargeLevelDefenderStart;
+ chargeLevelStop = kChargeLevelDefenderStop;
+ }
}
// Disable battery defender effects in charger mode until
@@ -147,10 +159,12 @@ bool BatteryDefender::isDefaultChargeLevel(const int start, const int stop) {
bool BatteryDefender::isBatteryDefenderDisabled(const int vendorStart, const int vendorStop) {
const bool isDefaultVendorChargeLevel = isDefaultChargeLevel(vendorStart, vendorStop);
- const bool isExplicitlyDisabled =
+ const bool isOverrideDisabled =
android::base::GetBoolProperty(kPropBatteryDefenderDisable, false);
+ const bool isCtrlEnabled =
+ android::base::GetBoolProperty(kPropBatteryDefenderCtrlEnable, kDefaultEnable);
- return isExplicitlyDisabled || (isDefaultVendorChargeLevel == false);
+ return isOverrideDisabled || (isDefaultVendorChargeLevel == false) || (isCtrlEnabled == false);
}
void BatteryDefender::addTimeToChargeTimers(void) {
@@ -167,8 +181,20 @@ void BatteryDefender::addTimeToChargeTimers(void) {
int32_t BatteryDefender::getTimeToActivate(void) {
// Use the default constructor value if the modified property is not between 60 and INT_MAX
// (seconds)
- return android::base::GetIntProperty(kPropBatteryDefenderThreshold, kTimeToActivateSecs,
- (int32_t)ONE_MIN_IN_SECONDS, INT32_MAX);
+ const int32_t timeToActivateOverride =
+ android::base::GetIntProperty(kPropBatteryDefenderThreshold, kTimeToActivateSecs,
+ (int32_t)ONE_MIN_IN_SECONDS, INT32_MAX);
+
+ const bool overrideActive = timeToActivateOverride != kTimeToActivateSecs;
+ if (overrideActive) {
+ return timeToActivateOverride;
+ } else {
+ // No overrides taken; apply ctrl time to activate...
+ // Note; do not allow less than 1 day trigger time
+ return android::base::GetIntProperty(kPropBatteryDefenderCtrlActivateTime,
+ kTimeToActivateSecs, (int32_t)ONE_DAY_IN_SECONDS,
+ INT32_MAX);
+ }
}
void BatteryDefender::stateMachine_runAction(const state_E state,
@@ -242,12 +268,15 @@ BatteryDefender::state_E BatteryDefender::stateMachine_getNextState(const state_
}
FALLTHROUGH_INTENDED;
- case STATE_ACTIVE:
- if (mTimeChargerNotPresentSecs > kTimeToClearTimerSecs) {
+ case STATE_ACTIVE: {
+ const int timeToClear = android::base::GetIntProperty(
+ kPropBatteryDefenderCtrlResumeTime, kTimeToClearTimerSecs, 0, INT32_MAX);
+
+ /* Check for mIsPowerAvailable in case timeToClear is 0 */
+ if ((mTimeChargerNotPresentSecs >= timeToClear) && (mIsPowerAvailable == false)) {
nextState = STATE_DISCONNECTED;
}
-
- break;
+ } break;
default:
break;
diff --git a/health/include/pixelhealth/BatteryDefender.h b/health/include/pixelhealth/BatteryDefender.h
index bc642600..d6ad0ccb 100644
--- a/health/include/pixelhealth/BatteryDefender.h
+++ b/health/include/pixelhealth/BatteryDefender.h
@@ -90,8 +90,18 @@ class BatteryDefender {
const char *const kPropBatteryDefenderDisable = "vendor.battery.defender.disable";
const char *const kPropBatteryDefenderThreshold = "vendor.battery.defender.threshold";
const char *const kPropBootmode = "ro.bootmode";
+ const char *const kPropBatteryDefenderCtrlEnable = "vendor.battery.defender.ctrl.enable";
+ const char *const kPropBatteryDefenderCtrlActivateTime =
+ "vendor.battery.defender.ctrl.trigger_time";
+ const char *const kPropBatteryDefenderCtrlResumeTime =
+ "vendor.battery.defender.ctrl.resume_time";
+ const char *const kPropBatteryDefenderCtrlStartSOC =
+ "vendor.battery.defender.ctrl.recharge_soc_start";
+ const char *const kPropBatteryDefenderCtrlStopSOC =
+ "vendor.battery.defender.ctrl.recharge_soc_stop";
// Default thresholds
+ const bool kDefaultEnable = true;
const int kChargeLevelDefaultStart = DEFAULT_CHARGE_LEVEL_START;
const int kChargeLevelDefaultStop = DEFAULT_CHARGE_LEVEL_STOP;
const int kChargeLevelDefenderStart = DEFAULT_CHARGE_LEVEL_DEFENDER_START;
diff --git a/health/test/TestBatteryDefender.cpp b/health/test/TestBatteryDefender.cpp
index 233dd720..18949823 100644
--- a/health/test/TestBatteryDefender.cpp
+++ b/health/test/TestBatteryDefender.cpp
@@ -145,10 +145,18 @@ const char *kPropBatteryDefenderState = "vendor.battery.defender.state";
const char *kPropBatteryDefenderDisable = "vendor.battery.defender.disable";
const char *kPropBatteryDefenderThreshold = "vendor.battery.defender.threshold";
+const char *kPropBatteryDefenderCtrlEnable = "vendor.battery.defender.ctrl.enable";
+const char *kPropBatteryDefenderCtrlActivateTime = "vendor.battery.defender.ctrl.trigger_time";
+const char *kPropBatteryDefenderCtrlResumeTime = "vendor.battery.defender.ctrl.resume_time";
+const char *kPropBatteryDefenderCtrlStartSOC = "vendor.battery.defender.ctrl.recharge_soc_start";
+const char *kPropBatteryDefenderCtrlStopSOC = "vendor.battery.defender.ctrl.recharge_soc_stop";
+
static void enableDefender(void) {
ON_CALL(*mock, GetIntProperty(kPropChargeLevelVendorStart, _, _, _)).WillByDefault(Return(0));
ON_CALL(*mock, GetIntProperty(kPropChargeLevelVendorStop, _, _, _)).WillByDefault(Return(100));
ON_CALL(*mock, GetBoolProperty(kPropBatteryDefenderDisable, _)).WillByDefault(Return(false));
+
+ ON_CALL(*mock, GetBoolProperty(kPropBatteryDefenderCtrlEnable, _)).WillByDefault(Return(true));
}
static void usbPresent(void) {
@@ -161,9 +169,19 @@ static void powerAvailable(void) {
usbPresent();
}
-static void defaultThreshold(void) {
+static void defaultThresholds(void) {
ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderThreshold, _, _, _))
.WillByDefault(Return(DEFAULT_TIME_TO_ACTIVATE_SECONDS));
+
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderCtrlActivateTime, _, _, _))
+ .WillByDefault(Return(DEFAULT_TIME_TO_ACTIVATE_SECONDS));
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderCtrlResumeTime, _, _, _))
+ .WillByDefault(Return(DEFAULT_TIME_TO_CLEAR_SECONDS));
+
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderCtrlStartSOC, _, _, _))
+ .WillByDefault(Return(70));
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderCtrlStopSOC, _, _, _))
+ .WillByDefault(Return(80));
}
static void capacityReached(void) {
@@ -219,7 +237,7 @@ TEST_F(BatteryDefenderTest, InitActive) {
enableDefender();
powerAvailable();
- defaultThreshold();
+ defaultThresholds();
EXPECT_CALL(*mock, ReadFileToString(kPathPersistChargerPresentTime, _, _))
.WillOnce(DoAll(SetArgPointee<1>(std::to_string(DEFAULT_TIME_TO_ACTIVATE_SECONDS + 1)),
@@ -233,7 +251,7 @@ TEST_F(BatteryDefenderTest, InitConnectedCapacityReached) {
enableDefender();
powerAvailable();
- defaultThreshold();
+ defaultThresholds();
InSequence s;
@@ -256,7 +274,7 @@ TEST_F(BatteryDefenderTest, InitConnected) {
enableDefender();
powerAvailable();
- defaultThreshold();
+ defaultThresholds();
InSequence s;
@@ -276,7 +294,7 @@ TEST_F(BatteryDefenderTest, TriggerTime) {
enableDefender();
powerAvailable();
- defaultThreshold();
+ defaultThresholds();
InSequence s;
@@ -309,7 +327,7 @@ TEST_F(BatteryDefenderTest, ChargeLevels) {
enableDefender();
powerAvailable();
- defaultThreshold();
+ defaultThresholds();
initToConnectedCapacityReached();
InSequence s;
@@ -331,8 +349,62 @@ TEST_F(BatteryDefenderTest, ActiveTime) {
enableDefender();
powerAvailable();
- defaultThreshold();
+ defaultThresholds();
+ initToActive();
+
+ InSequence s;
+
+ EXPECT_CALL(*mock, WriteStringToFile(std::to_string(70), kPathStartLevel, _));
+ EXPECT_CALL(*mock, WriteStringToFile(std::to_string(80), kPathStopLevel, _));
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE"));
+ battDefender.update(&props);
+}
+
+TEST_F(BatteryDefenderTest, ActiveTime_NonDefaultLevels) {
+ BatteryDefender battDefender;
+
+ enableDefender();
+ powerAvailable();
+ initToActive();
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderThreshold, _, _, _))
+ .WillByDefault(Return(DEFAULT_TIME_TO_ACTIVATE_SECONDS));
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderCtrlActivateTime, _, _, _))
+ .WillByDefault(Return(DEFAULT_TIME_TO_ACTIVATE_SECONDS));
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderCtrlResumeTime, _, _, _))
+ .WillByDefault(Return(DEFAULT_TIME_TO_CLEAR_SECONDS));
+
+ // Non-default
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderCtrlStartSOC, _, _, _))
+ .WillByDefault(Return(50));
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderCtrlStopSOC, _, _, _))
+ .WillByDefault(Return(60));
+
+ InSequence s;
+
+ EXPECT_CALL(*mock, WriteStringToFile(std::to_string(50), kPathStartLevel, _));
+ EXPECT_CALL(*mock, WriteStringToFile(std::to_string(60), kPathStopLevel, _));
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "ACTIVE"));
+ battDefender.update(&props);
+}
+
+TEST_F(BatteryDefenderTest, ActiveTime_NonDefaultLevels_invalid) {
+ BatteryDefender battDefender;
+
+ enableDefender();
+ powerAvailable();
initToActive();
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderThreshold, _, _, _))
+ .WillByDefault(Return(DEFAULT_TIME_TO_ACTIVATE_SECONDS));
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderCtrlActivateTime, _, _, _))
+ .WillByDefault(Return(DEFAULT_TIME_TO_ACTIVATE_SECONDS));
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderCtrlResumeTime, _, _, _))
+ .WillByDefault(Return(DEFAULT_TIME_TO_CLEAR_SECONDS));
+
+ // Non-default
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderCtrlStartSOC, _, _, _))
+ .WillByDefault(Return(30));
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderCtrlStopSOC, _, _, _))
+ .WillByDefault(Return(10));
InSequence s;
@@ -346,7 +418,7 @@ TEST_F(BatteryDefenderTest, ConnectDisconnectCycle) {
BatteryDefender battDefender;
enableDefender();
- defaultThreshold();
+ defaultThresholds();
initToConnectedCapacityReached();
InSequence s;
@@ -374,9 +446,10 @@ TEST_F(BatteryDefenderTest, ConnectDisconnectCycle) {
// Maintain kPathPersistChargerPresentTime = 1060
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
- testvar_systemTimeSecs += 60 * 4;
+ testvar_systemTimeSecs += 60 * 4 - 1;
battDefender.update(&props);
+ testvar_systemTimeSecs += 1;
EXPECT_CALL(*mock, WriteStringToFile(std::to_string(0), kPathPersistChargerPresentTime, _));
EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "DISCONNECTED"));
testvar_systemTimeSecs += MIN_TIME_BETWEEN_FILE_UPDATES;
@@ -402,12 +475,50 @@ TEST_F(BatteryDefenderTest, ConnectDisconnectCycle) {
battDefender.update(&props);
}
+TEST_F(BatteryDefenderTest, ConnectDisconnectResumeTimeThreshold0) {
+ BatteryDefender battDefender;
+
+ enableDefender();
+ initToConnectedCapacityReached();
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderThreshold, _, _, _))
+ .WillByDefault(Return(DEFAULT_TIME_TO_ACTIVATE_SECONDS));
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderCtrlActivateTime, _, _, _))
+ .WillByDefault(Return(DEFAULT_TIME_TO_ACTIVATE_SECONDS));
+
+ // Non-default thresholds
+ ON_CALL(*mock, GetIntProperty(kPropBatteryDefenderCtrlResumeTime, _, _, _))
+ .WillByDefault(Return(0));
+
+ InSequence s;
+
+ // Power ON
+ props.chargerWirelessOnline = true;
+
+ EXPECT_CALL(*mock, WriteStringToFile(std::to_string(1000), kPathPersistChargerPresentTime, _));
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
+ testvar_systemTimeSecs += 60;
+ battDefender.update(&props);
+
+ EXPECT_CALL(*mock, WriteStringToFile(std::to_string(1060), kPathPersistChargerPresentTime, _));
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "CONNECTED"));
+ testvar_systemTimeSecs += 60;
+ battDefender.update(&props);
+
+ // Power OFF
+ props.chargerWirelessOnline = false;
+
+ EXPECT_CALL(*mock, WriteStringToFile(std::to_string(0), kPathPersistChargerPresentTime, _));
+ EXPECT_CALL(*mock, SetProperty(kPropBatteryDefenderState, "DISCONNECTED"));
+ testvar_systemTimeSecs += MIN_TIME_BETWEEN_FILE_UPDATES;
+ battDefender.update(&props);
+}
+
TEST_F(BatteryDefenderTest, PropsOverride_InitActive_allOnlineFalse) {
BatteryDefender battDefender;
enableDefender();
usbPresent();
- defaultThreshold();
+ defaultThresholds();
initToActive();
InSequence s;
@@ -431,7 +542,7 @@ TEST_F(BatteryDefenderTest, PropsOverride_InitActive_usbOnline) {
enableDefender();
usbPresent();
- defaultThreshold();
+ defaultThresholds();
initToActive();
InSequence s;
@@ -455,7 +566,7 @@ TEST_F(BatteryDefenderTest, PropsOverride_InitActive_acOnline) {
enableDefender();
usbPresent();
- defaultThreshold();
+ defaultThresholds();
initToActive();
InSequence s;
@@ -479,7 +590,7 @@ TEST_F(BatteryDefenderTest, PropsOverride_InitActive_allOnline) {
enableDefender();
usbPresent();
- defaultThreshold();
+ defaultThresholds();
initToActive();
InSequence s;
@@ -503,7 +614,7 @@ TEST_F(BatteryDefenderTest, PropsOverride_InitConnected_allOnlineFalse) {
enableDefender();
usbPresent();
- defaultThreshold();
+ defaultThresholds();
initToConnectedCapacityReached();
InSequence s;
@@ -531,7 +642,7 @@ TEST_F(BatteryDefenderTest, PropsOverride_InitConnected_usbOnline) {
enableDefender();
usbPresent();
- defaultThreshold();
+ defaultThresholds();
initToConnectedCapacityReached();
InSequence s;
@@ -559,7 +670,7 @@ TEST_F(BatteryDefenderTest, PropsOverride_InitConnected_acOnline) {
enableDefender();
usbPresent();
- defaultThreshold();
+ defaultThresholds();
initToConnectedCapacityReached();
InSequence s;
@@ -587,7 +698,7 @@ TEST_F(BatteryDefenderTest, PropsOverride_InitConnected_allOnline) {
enableDefender();
usbPresent();
- defaultThreshold();
+ defaultThresholds();
initToConnectedCapacityReached();
InSequence s;
@@ -615,7 +726,7 @@ TEST_F(BatteryDefenderTest, PropsOverride_InitConnected_overrideHealth) {
enableDefender();
usbPresent();
- defaultThreshold();
+ defaultThresholds();
initToConnectedCapacityReached();
InSequence s;
@@ -637,7 +748,7 @@ TEST_F(BatteryDefenderTest, PropsOverride_InitConnected_kernelDefend) {
enableDefender();
usbPresent();
- defaultThreshold();
+ defaultThresholds();
initToConnectedCapacityReached();
InSequence s;