Use battery capacity estimates provided by Health HAL
Bug: 186807039 Test: atest FrameworksCoreTests:com.android.internal.os.BatteryChargeCalculatorTest Change-Id: I4eb1606843ca1f2f2c0589e0abe6408f6be149c5
This commit is contained in:
@@ -3233,6 +3233,11 @@ public abstract class BatteryStats implements Parcelable {
|
||||
*/
|
||||
public abstract int getMaxLearnedBatteryCapacity() ;
|
||||
|
||||
/**
|
||||
* @return The latest learned battery capacity in uAh.
|
||||
*/
|
||||
public abstract int getLearnedBatteryCapacity();
|
||||
|
||||
/**
|
||||
* Return the array of discharge step durations.
|
||||
*/
|
||||
@@ -3925,7 +3930,9 @@ public abstract class BatteryStats implements Parcelable {
|
||||
getStartClockTime(),
|
||||
whichBatteryScreenOffRealtime / 1000, whichBatteryScreenOffUptime / 1000,
|
||||
getEstimatedBatteryCapacity(),
|
||||
getMinLearnedBatteryCapacity(), getMaxLearnedBatteryCapacity(),
|
||||
getLearnedBatteryCapacity(),
|
||||
getMinLearnedBatteryCapacity(),
|
||||
getMaxLearnedBatteryCapacity(),
|
||||
screenDozeTime / 1000);
|
||||
|
||||
|
||||
@@ -4688,22 +4695,31 @@ public abstract class BatteryStats implements Parcelable {
|
||||
pw.println(sb.toString());
|
||||
}
|
||||
|
||||
final int lastLearnedBatteryCapacity = getLearnedBatteryCapacity();
|
||||
if (lastLearnedBatteryCapacity > 0) {
|
||||
sb.setLength(0);
|
||||
sb.append(prefix);
|
||||
sb.append(" Last learned battery capacity: ");
|
||||
sb.append(BatteryStatsHelper.makemAh(lastLearnedBatteryCapacity / 1000));
|
||||
sb.append(" mAh");
|
||||
pw.println(sb.toString());
|
||||
}
|
||||
final int minLearnedBatteryCapacity = getMinLearnedBatteryCapacity();
|
||||
if (minLearnedBatteryCapacity > 0) {
|
||||
sb.setLength(0);
|
||||
sb.append(prefix);
|
||||
sb.append(" Min learned battery capacity: ");
|
||||
sb.append(BatteryStatsHelper.makemAh(minLearnedBatteryCapacity / 1000));
|
||||
sb.append(" mAh");
|
||||
sb.append(" Min learned battery capacity: ");
|
||||
sb.append(BatteryStatsHelper.makemAh(minLearnedBatteryCapacity / 1000));
|
||||
sb.append(" mAh");
|
||||
pw.println(sb.toString());
|
||||
}
|
||||
final int maxLearnedBatteryCapacity = getMaxLearnedBatteryCapacity();
|
||||
if (maxLearnedBatteryCapacity > 0) {
|
||||
sb.setLength(0);
|
||||
sb.append(prefix);
|
||||
sb.append(" Max learned battery capacity: ");
|
||||
sb.append(BatteryStatsHelper.makemAh(maxLearnedBatteryCapacity / 1000));
|
||||
sb.append(" mAh");
|
||||
sb.append(" Max learned battery capacity: ");
|
||||
sb.append(BatteryStatsHelper.makemAh(maxLearnedBatteryCapacity / 1000));
|
||||
sb.append(" mAh");
|
||||
pw.println(sb.toString());
|
||||
}
|
||||
|
||||
|
||||
@@ -28,21 +28,26 @@ import java.util.List;
|
||||
* Estimates the battery discharge amounts.
|
||||
*/
|
||||
public class BatteryChargeCalculator extends PowerCalculator {
|
||||
private final double mBatteryCapacity;
|
||||
|
||||
public BatteryChargeCalculator(PowerProfile powerProfile) {
|
||||
mBatteryCapacity = powerProfile.getBatteryCapacity();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats,
|
||||
long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
|
||||
final double dischargedPowerLowerBoundMah =
|
||||
batteryStats.getLowDischargeAmountSinceCharge() * mBatteryCapacity / 100;
|
||||
final double dischargedPowerUpperBoundMah =
|
||||
batteryStats.getHighDischargeAmountSinceCharge() * mBatteryCapacity / 100;
|
||||
builder.setDischargePercentage(
|
||||
batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED))
|
||||
batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED));
|
||||
|
||||
int batteryCapacityMah = batteryStats.getLearnedBatteryCapacity() / 1000;
|
||||
if (batteryCapacityMah <= 0) {
|
||||
batteryCapacityMah = batteryStats.getMinLearnedBatteryCapacity() / 1000;
|
||||
if (batteryCapacityMah <= 0) {
|
||||
batteryCapacityMah = batteryStats.getEstimatedBatteryCapacity();
|
||||
}
|
||||
}
|
||||
final double dischargedPowerLowerBoundMah =
|
||||
batteryStats.getLowDischargeAmountSinceCharge() * batteryCapacityMah / 100.0;
|
||||
final double dischargedPowerUpperBoundMah =
|
||||
batteryStats.getHighDischargeAmountSinceCharge() * batteryCapacityMah / 100.0;
|
||||
builder.setDischargePercentage(
|
||||
batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED))
|
||||
.setDischargedPowerRange(dischargedPowerLowerBoundMah,
|
||||
dischargedPowerUpperBoundMah);
|
||||
|
||||
|
||||
@@ -161,7 +161,7 @@ public class BatteryStatsImpl extends BatteryStats {
|
||||
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
|
||||
|
||||
// Current on-disk Parcel version
|
||||
static final int VERSION = 198;
|
||||
static final int VERSION = 199;
|
||||
|
||||
// The maximum number of names wakelocks we will keep track of
|
||||
// per uid; once the limit is reached, we batch the remaining wakelocks
|
||||
@@ -1056,6 +1056,7 @@ public class BatteryStatsImpl extends BatteryStats {
|
||||
private int mBatteryVoltageMv = -1;
|
||||
private int mEstimatedBatteryCapacityMah = -1;
|
||||
|
||||
private int mLastLearnedBatteryCapacityUah = -1;
|
||||
private int mMinLearnedBatteryCapacityUah = -1;
|
||||
private int mMaxLearnedBatteryCapacityUah = -1;
|
||||
|
||||
@@ -1141,6 +1142,11 @@ public class BatteryStatsImpl extends BatteryStats {
|
||||
return mEstimatedBatteryCapacityMah;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLearnedBatteryCapacity() {
|
||||
return mLastLearnedBatteryCapacityUah;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMinLearnedBatteryCapacity() {
|
||||
return mMinLearnedBatteryCapacityUah;
|
||||
@@ -11199,6 +11205,7 @@ public class BatteryStatsImpl extends BatteryStats {
|
||||
} else {
|
||||
mEstimatedBatteryCapacityMah = -1;
|
||||
}
|
||||
mLastLearnedBatteryCapacityUah = -1;
|
||||
mMinLearnedBatteryCapacityUah = -1;
|
||||
mMaxLearnedBatteryCapacityUah = -1;
|
||||
mInteractiveTimer.reset(false, elapsedRealtimeUs);
|
||||
@@ -13799,6 +13806,7 @@ public class BatteryStatsImpl extends BatteryStats {
|
||||
mRecordingHistory = DEBUG;
|
||||
}
|
||||
|
||||
mLastLearnedBatteryCapacityUah = chargeFullUah;
|
||||
if (mMinLearnedBatteryCapacityUah == -1) {
|
||||
mMinLearnedBatteryCapacityUah = chargeFullUah;
|
||||
} else {
|
||||
@@ -15066,6 +15074,7 @@ public class BatteryStatsImpl extends BatteryStats {
|
||||
mDischargeCurrentLevel = in.readInt();
|
||||
mCurrentBatteryLevel = in.readInt();
|
||||
mEstimatedBatteryCapacityMah = in.readInt();
|
||||
mLastLearnedBatteryCapacityUah = in.readInt();
|
||||
mMinLearnedBatteryCapacityUah = in.readInt();
|
||||
mMaxLearnedBatteryCapacityUah = in.readInt();
|
||||
mLowDischargeAmountSinceCharge = in.readInt();
|
||||
@@ -15570,6 +15579,7 @@ public class BatteryStatsImpl extends BatteryStats {
|
||||
out.writeInt(mDischargeCurrentLevel);
|
||||
out.writeInt(mCurrentBatteryLevel);
|
||||
out.writeInt(mEstimatedBatteryCapacityMah);
|
||||
out.writeInt(mLastLearnedBatteryCapacityUah);
|
||||
out.writeInt(mMinLearnedBatteryCapacityUah);
|
||||
out.writeInt(mMaxLearnedBatteryCapacityUah);
|
||||
out.writeInt(getLowDischargeAmountSinceCharge());
|
||||
@@ -16071,6 +16081,7 @@ public class BatteryStatsImpl extends BatteryStats {
|
||||
mRealtimeStartUs = in.readLong();
|
||||
mOnBattery = in.readInt() != 0;
|
||||
mEstimatedBatteryCapacityMah = in.readInt();
|
||||
mLastLearnedBatteryCapacityUah = in.readInt();
|
||||
mMinLearnedBatteryCapacityUah = in.readInt();
|
||||
mMaxLearnedBatteryCapacityUah = in.readInt();
|
||||
mOnBatteryInternal = false; // we are no longer really running.
|
||||
@@ -16310,6 +16321,7 @@ public class BatteryStatsImpl extends BatteryStats {
|
||||
out.writeLong(mRealtimeStartUs);
|
||||
out.writeInt(mOnBattery ? 1 : 0);
|
||||
out.writeInt(mEstimatedBatteryCapacityMah);
|
||||
out.writeInt(mLastLearnedBatteryCapacityUah);
|
||||
out.writeInt(mMinLearnedBatteryCapacityUah);
|
||||
out.writeInt(mMaxLearnedBatteryCapacityUah);
|
||||
mOnBatteryTimeBase.writeToParcel(out, uSecUptime, uSecRealtime);
|
||||
|
||||
@@ -54,7 +54,7 @@ public class BatteryUsageStatsProvider {
|
||||
mPowerCalculators = new ArrayList<>();
|
||||
|
||||
// Power calculators are applied in the order of registration
|
||||
mPowerCalculators.add(new BatteryChargeCalculator(mPowerProfile));
|
||||
mPowerCalculators.add(new BatteryChargeCalculator());
|
||||
mPowerCalculators.add(new CpuPowerCalculator(mPowerProfile));
|
||||
mPowerCalculators.add(new MemoryPowerCalculator(mPowerProfile));
|
||||
mPowerCalculators.add(new WakelockPowerCalculator(mPowerProfile));
|
||||
|
||||
@@ -36,18 +36,12 @@ public class BatteryChargeCalculatorTest {
|
||||
|
||||
@Rule
|
||||
public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule()
|
||||
.setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 4000.0);
|
||||
.setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 1234.0); // Should be ignored
|
||||
|
||||
@Test
|
||||
public void testDischargeTotals() {
|
||||
BatteryChargeCalculator calculator =
|
||||
new BatteryChargeCalculator(mStatsRule.getPowerProfile());
|
||||
|
||||
final BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats();
|
||||
|
||||
mStatsRule.setTime(1000, 1000);
|
||||
batteryStats.resetAllStatsCmdLocked();
|
||||
batteryStats.setNoAutoReset(true);
|
||||
batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100,
|
||||
/* plugType */ 0, 90, 72, 3700, 3_600_000, 4_000_000, 0,
|
||||
1_000_000, 1_000_000, 1_000_000);
|
||||
@@ -58,6 +52,7 @@ public class BatteryChargeCalculatorTest {
|
||||
/* plugType */ 0, 80, 72, 3700, 2_400_000, 4_000_000, 0,
|
||||
2_000_000, 2_000_000, 2_000_000);
|
||||
|
||||
BatteryChargeCalculator calculator = new BatteryChargeCalculator();
|
||||
BatteryUsageStats batteryUsageStats = mStatsRule.apply(calculator);
|
||||
|
||||
assertThat(batteryUsageStats.getConsumedPower())
|
||||
|
||||
Reference in New Issue
Block a user