Utilize Measured Energy data in PowerStatsViewer

Display measured energy adjusted screen power alongside the currently
reported screen power. Also report measured ambient display power to the
Ambient display drain.

Test: manual ("mp :PowerStatsViewer", will show adjusted screen power on PowerStatsHal2.0 enabled devices with display rails)
Bug: 172361024
Change-Id: Ia77d0eacff03b9bf671110ecf9719b121c6fe2c0
This commit is contained in:
Michael Wachenschwanz
2020-11-20 02:29:33 -08:00
parent d23a7c4f03
commit 7b327a68a4

View File

@@ -17,6 +17,7 @@
package com.android.frameworks.core.powerstatsviewer;
import android.content.Context;
import android.os.BatteryStats;
import android.os.Process;
import com.android.internal.os.BatterySipper;
@@ -32,6 +33,15 @@ public class PowerStatsData {
private static final String[] PACKAGES_SYSTEM = {PACKAGE_MEDIA_PROVIDER,
PACKAGE_CALENDAR_PROVIDER, PACKAGE_SYSTEMUI};
// Temporary placeholder voltage for converting energy to charge
// TODO: remove this when b/173765509 is resolved
private static final double MOCK_NOMINAL_VOLTAGE = 3.7;
// Unit conversion:
// mAh = uWs * (1/1000)(milli/micro) * (1/Voltage) * (1/3600)(hours/second)
private static final double UJ_2_MAH =
(1.0 / 1000) * (1.0 / MOCK_NOMINAL_VOLTAGE) * (1.0 / 3600);
enum EntryType {
POWER,
DURATION,
@@ -50,6 +60,7 @@ public class PowerStatsData {
public PowerStatsData(Context context, BatteryStatsHelper batteryStatsHelper,
String powerConsumerId) {
List<BatterySipper> usageList = batteryStatsHelper.getUsageList();
BatteryStats batteryStats = batteryStatsHelper.getStats();
double totalPowerMah = 0;
double totalSmearedPowerMah = 0;
@@ -125,6 +136,8 @@ public class PowerStatsData {
totalVideoTimeMs += sipper.videoTimeMs;
}
long totalScreenMeasuredEnergyUJ = batteryStats.getScreenOnEnergy();
if (requestedPowerConsumer == null) {
mPowerConsumerInfo = null;
return;
@@ -135,10 +148,18 @@ public class PowerStatsData {
addEntry("Total power", EntryType.POWER,
requestedPowerConsumer.totalSmearedPowerMah, totalSmearedPowerMah);
maybeAddMeasuredEnergyEntry(requestedPowerConsumer.drainType, batteryStats);
addEntry("... excluding system", EntryType.POWER,
requestedPowerConsumer.totalSmearedPowerMah, totalPowerExcludeSystemMah);
addEntry("Screen, smeared", EntryType.POWER,
requestedPowerConsumer.screenPowerMah, totalScreenPower);
if (totalScreenMeasuredEnergyUJ != BatteryStats.ENERGY_DATA_UNAVAILABLE) {
final double measuredCharge = UJ_2_MAH * totalScreenMeasuredEnergyUJ;
final double ratio = measuredCharge / totalScreenPower;
addEntry("Screen, smeared (PowerStatsHal adjusted)", EntryType.POWER,
requestedPowerConsumer.screenPowerMah * ratio, measuredCharge);
}
addEntry("Other, smeared", EntryType.POWER,
requestedPowerConsumer.proportionalSmearMah, totalProportionalSmearMah);
addEntry("Excluding smeared", EntryType.POWER,
@@ -218,6 +239,28 @@ public class PowerStatsData {
mEntries.add(entry);
}
private void maybeAddMeasuredEnergyEntry(BatterySipper.DrainType drainType,
BatteryStats batteryStats) {
switch (drainType) {
case AMBIENT_DISPLAY:
final long totalDozeMeasuredEnergyUJ = batteryStats.getScreenDozeEnergy();
if (totalDozeMeasuredEnergyUJ != BatteryStats.ENERGY_DATA_UNAVAILABLE) {
final double measuredCharge = UJ_2_MAH * totalDozeMeasuredEnergyUJ;
addEntry("Measured ambient display power", EntryType.POWER, measuredCharge,
measuredCharge);
}
break;
case SCREEN:
final long totalScreenMeasuredEnergyUJ = batteryStats.getScreenOnEnergy();
if (totalScreenMeasuredEnergyUJ != BatteryStats.ENERGY_DATA_UNAVAILABLE) {
final double measuredCharge = UJ_2_MAH * totalScreenMeasuredEnergyUJ;
addEntry("Measured screen power", EntryType.POWER, measuredCharge,
measuredCharge);
}
break;
}
}
public PowerConsumerInfoHelper.PowerConsumerInfo getPowerConsumerInfo() {
return mPowerConsumerInfo;
}