Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b327a68 authored by Michael Wachenschwanz's avatar Michael Wachenschwanz
Browse files

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
parent d23a7c4f
Loading
Loading
Loading
Loading
+43 −0
Original line number Diff line number Diff line
@@ -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;
    }