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

Commit 48709c65 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Utilize specific info provided by the Modem HAL" into tm-dev

parents 86175963 adfc51a5
Loading
Loading
Loading
Loading
+117 −60
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ import android.os.connectivity.GpsBatteryStats;
import android.os.connectivity.WifiActivityEnergyInfo;
import android.os.connectivity.WifiBatteryStats;
import android.provider.Settings;
import android.telephony.AccessNetworkConstants;
import android.telephony.Annotation.NetworkType;
import android.telephony.CellSignalStrength;
import android.telephony.CellSignalStrengthLte;
@@ -6830,6 +6831,27 @@ public class BatteryStatsImpl extends BatteryStats {
        }
    }
    @RadioAccessTechnology
    private static int mapRadioAccessNetworkTypeToRadioAccessTechnology(
            @AccessNetworkConstants.RadioAccessNetworkType int dataType) {
        switch (dataType) {
            case AccessNetworkConstants.AccessNetworkType.NGRAN:
                return RADIO_ACCESS_TECHNOLOGY_NR;
            case AccessNetworkConstants.AccessNetworkType.EUTRAN:
                return RADIO_ACCESS_TECHNOLOGY_LTE;
            case AccessNetworkConstants.AccessNetworkType.UNKNOWN: //fallthrough
            case AccessNetworkConstants.AccessNetworkType.GERAN: //fallthrough
            case AccessNetworkConstants.AccessNetworkType.UTRAN: //fallthrough
            case AccessNetworkConstants.AccessNetworkType.CDMA2000: //fallthrough
            case AccessNetworkConstants.AccessNetworkType.IWLAN:
                return RADIO_ACCESS_TECHNOLOGY_OTHER;
            default:
                Slog.w(TAG,
                        "Unhandled RadioAccessNetworkType (" + dataType + "), mapping to OTHER");
                return RADIO_ACCESS_TECHNOLOGY_OTHER;
        }
    }
    @GuardedBy("this")
    public void noteWifiOnLocked() {
        noteWifiOnLocked(mClock.elapsedRealtime(), mClock.uptimeMillis());
@@ -13721,66 +13743,7 @@ public class BatteryStatsImpl extends BatteryStats {
                    mTmpRailStats.resetCellularTotalEnergyUsed();
                }
                // Proportionally smear Rx and Tx times across each RAt
                final int levelCount = CellSignalStrength.getNumSignalStrengthLevels();
                long[] perSignalStrengthActiveTimeMs = new long[levelCount];
                long totalActiveTimeMs = 0;
                for (int rat = 0; rat < RADIO_ACCESS_TECHNOLOGY_COUNT; rat++) {
                    final RadioAccessTechnologyBatteryStats ratStats = mPerRatBatteryStats[rat];
                    if (ratStats == null) continue;
                    final int freqCount = ratStats.getFrequencyRangeCount();
                    for (int freq = 0; freq < freqCount; freq++) {
                        for (int level = 0; level < levelCount; level++) {
                            final long durationMs = ratStats.getTimeSinceMark(freq, level,
                                    elapsedRealtimeMs);
                            perSignalStrengthActiveTimeMs[level] += durationMs;
                            totalActiveTimeMs += durationMs;
                        }
                    }
                }
                if (totalActiveTimeMs != 0) {
                    // Smear the provided Tx/Rx durations across each RAT, frequency, and signal
                    // strength.
                    for (int rat = 0; rat < RADIO_ACCESS_TECHNOLOGY_COUNT; rat++) {
                        final RadioAccessTechnologyBatteryStats ratStats = mPerRatBatteryStats[rat];
                        if (ratStats == null) continue;
                        final int freqCount = ratStats.getFrequencyRangeCount();
                        for (int freq = 0; freq < freqCount; freq++) {
                            long frequencyDurationMs = 0;
                            for (int level = 0; level < levelCount; level++) {
                                final long durationMs = ratStats.getTimeSinceMark(freq, level,
                                        elapsedRealtimeMs);
                                final long totalLvlDurationMs =
                                        perSignalStrengthActiveTimeMs[level];
                                if (totalLvlDurationMs == 0) continue;
                                final long totalTxLvlDurations =
                                        deltaInfo.getTransmitDurationMillisAtPowerLevel(level);
                                // Smear HAL provided Tx power level duration based on active modem
                                // duration in a given state. (Add totalLvlDurationMs / 2 before
                                // the integer division with totalLvlDurationMs for rounding.)
                                final long proportionalTxDurationMs =
                                        (durationMs * totalTxLvlDurations
                                                + (totalLvlDurationMs / 2)) / totalLvlDurationMs;
                                ratStats.incrementTxDuration(freq, level, proportionalTxDurationMs);
                                frequencyDurationMs += durationMs;
                            }
                            final long totalRxDuration = deltaInfo.getReceiveTimeMillis();
                            // Smear HAL provided Rx power duration based on active modem
                            // duration in a given state.  (Add totalActiveTimeMs / 2 before the
                            // integer division with totalActiveTimeMs for rounding.)
                            final long proportionalRxDurationMs =
                                    (frequencyDurationMs * totalRxDuration + (totalActiveTimeMs
                                            / 2)) / totalActiveTimeMs;
                            ratStats.incrementRxDuration(freq, proportionalRxDurationMs);
                        }
                        ratStats.setMark(elapsedRealtimeMs);
                    }
                }
                incrementPerRatDataLocked(deltaInfo, elapsedRealtimeMs);
            }
            long totalAppRadioTimeUs = mMobileRadioActivePerAppTimer.getTimeSinceMarkLocked(
                    elapsedRealtimeMs * 1000);
@@ -13931,6 +13894,100 @@ public class BatteryStatsImpl extends BatteryStats {
        }
    }
    @GuardedBy("this")
    private void incrementPerRatDataLocked(ModemActivityInfo deltaInfo, long elapsedRealtimeMs) {
        final int infoSize = deltaInfo.getSpecificInfoLength();
        if (infoSize == 1 && deltaInfo.getSpecificInfoRat(0)
                == AccessNetworkConstants.AccessNetworkType.UNKNOWN
                && deltaInfo.getSpecificInfoFrequencyRange(0)
                == ServiceState.FREQUENCY_RANGE_UNKNOWN) {
            // Specific info data unavailable. Proportionally smear Rx and Tx times across each RAT.
            final int levelCount = CellSignalStrength.getNumSignalStrengthLevels();
            long[] perSignalStrengthActiveTimeMs = new long[levelCount];
            long totalActiveTimeMs = 0;
            for (int rat = 0; rat < RADIO_ACCESS_TECHNOLOGY_COUNT; rat++) {
                final RadioAccessTechnologyBatteryStats ratStats = mPerRatBatteryStats[rat];
                if (ratStats == null) continue;
                final int freqCount = ratStats.getFrequencyRangeCount();
                for (int freq = 0; freq < freqCount; freq++) {
                    for (int level = 0; level < levelCount; level++) {
                        final long durationMs = ratStats.getTimeSinceMark(freq, level,
                                elapsedRealtimeMs);
                        perSignalStrengthActiveTimeMs[level] += durationMs;
                        totalActiveTimeMs += durationMs;
                    }
                }
            }
            if (totalActiveTimeMs != 0) {
                // Smear the provided Tx/Rx durations across each RAT, frequency, and signal
                // strength.
                for (int rat = 0; rat < RADIO_ACCESS_TECHNOLOGY_COUNT; rat++) {
                    final RadioAccessTechnologyBatteryStats ratStats = mPerRatBatteryStats[rat];
                    if (ratStats == null) continue;
                    final int freqCount = ratStats.getFrequencyRangeCount();
                    for (int freq = 0; freq < freqCount; freq++) {
                        long frequencyDurationMs = 0;
                        for (int level = 0; level < levelCount; level++) {
                            final long durationMs = ratStats.getTimeSinceMark(freq, level,
                                    elapsedRealtimeMs);
                            final long totalLvlDurationMs =
                                    perSignalStrengthActiveTimeMs[level];
                            if (totalLvlDurationMs == 0) continue;
                            final long totalTxLvlDurations =
                                    deltaInfo.getTransmitDurationMillisAtPowerLevel(level);
                            // Smear HAL provided Tx power level duration based on active modem
                            // duration in a given state. (Add totalLvlDurationMs / 2 before
                            // the integer division with totalLvlDurationMs for rounding.)
                            final long proportionalTxDurationMs =
                                    (durationMs * totalTxLvlDurations
                                            + (totalLvlDurationMs / 2)) / totalLvlDurationMs;
                            ratStats.incrementTxDuration(freq, level, proportionalTxDurationMs);
                            frequencyDurationMs += durationMs;
                        }
                        final long totalRxDuration = deltaInfo.getReceiveTimeMillis();
                        // Smear HAL provided Rx power duration based on active modem
                        // duration in a given state.  (Add totalActiveTimeMs / 2 before the
                        // integer division with totalActiveTimeMs for rounding.)
                        final long proportionalRxDurationMs =
                                (frequencyDurationMs * totalRxDuration + (totalActiveTimeMs
                                        / 2)) / totalActiveTimeMs;
                        ratStats.incrementRxDuration(freq, proportionalRxDurationMs);
                    }
                }
            }
        } else {
            // Specific data available.
            for (int index = 0; index < infoSize; index++) {
                final int rat = deltaInfo.getSpecificInfoRat(index);
                final int freq = deltaInfo.getSpecificInfoFrequencyRange(index);
                // Map RadioAccessNetworkType to course grain RadioAccessTechnology.
                final int ratBucket = mapRadioAccessNetworkTypeToRadioAccessTechnology(rat);
                final RadioAccessTechnologyBatteryStats ratStats = getRatBatteryStatsLocked(
                        ratBucket);
                final long rxTimeMs = deltaInfo.getReceiveTimeMillis(rat, freq);
                final int[] txTimesMs = deltaInfo.getTransmitTimeMillis(rat, freq);
                ratStats.incrementRxDuration(freq, rxTimeMs);
                final int numTxLvl = txTimesMs.length;
                for (int lvl = 0; lvl < numTxLvl; lvl++) {
                    ratStats.incrementTxDuration(freq, lvl, txTimesMs[lvl]);
                }
            }
        }
        for (int rat = 0; rat < RADIO_ACCESS_TECHNOLOGY_COUNT; rat++) {
            final RadioAccessTechnologyBatteryStats ratStats = mPerRatBatteryStats[rat];
            if (ratStats == null) continue;
            ratStats.setMark(elapsedRealtimeMs);
        }
    }
    /**
     * Add modem tx power to history
     * Device is said to be in high cellular transmit power when it has spent most of the transmit
+338 −23

File changed.

Preview size limit exceeded, changes collapsed.

+2 −2
Original line number Diff line number Diff line
@@ -383,8 +383,6 @@ public final class ModemActivityInfo implements Parcelable {
     * activity.
     */
    public @NonNull ModemActivityInfo getDelta(@NonNull ModemActivityInfo other) {
        int[] txTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS];

        ActivityStatsTechSpecificInfo[] mDeltaSpecificInfo;
        mDeltaSpecificInfo = new ActivityStatsTechSpecificInfo[other.getSpecificInfoLength()];

@@ -399,6 +397,7 @@ public final class ModemActivityInfo implements Parcelable {
                        if (other.mActivityStatsTechSpecificInfo[i].getFrequencyRange()
                                == mActivityStatsTechSpecificInfo[j].getFrequencyRange()) {
                            int freq = mActivityStatsTechSpecificInfo[j].getFrequencyRange();
                            int[] txTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS];
                            for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
                                txTimeMs[lvl] =
                                        (int) (other.getTransmitDurationMillisAtPowerLevel(
@@ -416,6 +415,7 @@ public final class ModemActivityInfo implements Parcelable {
                                                        - getReceiveTimeMillis(rat, freq)));
                        }
                    } else {
                        int[] txTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS];
                        for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
                            txTimeMs[lvl] =
                                    (int) (other.getTransmitDurationMillisAtPowerLevel(lvl, rat)