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

Commit a6a24806 authored by Siddharth Ray's avatar Siddharth Ray
Browse files

Telephony power metrics

Modem power metrics is added to Telephony metrics

BUG:72383800

Test: Manual
Change-Id: I951276a41d9b94a740576fe8898f1a74a9088b6d
parent 1db1dd66
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -44,6 +44,9 @@ message TelephonyLog {

  // The end time of this log
  optional Time end_time = 7;

  // Modem power stats
  optional ModemPowerStats modem_power_stats = 8;
}

// The time information
@@ -1434,3 +1437,35 @@ message SmsSession {
  // Indicating some sms session events are dropped
  optional bool events_dropped = 4;
}

// Power stats for modem
message ModemPowerStats {

  // Duration of log (ms). This is the duration of time device is
  // on battery and modem power stats are collected.
  optional int64 logging_duration_ms = 1;

  // Energy consumed by modem (mAh)
  optional double energy_consumed_mah = 2;

  // Number of packets sent (tx)
  optional int64 num_packets_tx = 3;

  // Amount of time kernel is active because of cellular data (ms)
  optional int64 cellular_kernel_active_time_ms = 4;

  // Amount of time spent in very poor rx signal level (ms)
  optional int64 time_in_very_poor_rx_signal_level_ms = 5;

  // Amount of time modem is in sleep (ms)
  optional int64 sleep_time_ms = 6;

  // Amount of time modem is in idle (ms)
  optional int64 idle_time_ms = 7;

  // Amount of time modem is in rx (ms)
  optional int64 rx_time_ms = 8;

  // Amount of time modem is in tx (ms)
  repeated int64 tx_time_ms = 9;
}
+81 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.internal.telephony.metrics;

import android.os.BatteryStats;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.connectivity.CellularBatteryStats;
import android.text.format.DateUtils;

import com.android.internal.app.IBatteryStats;
import com.android.internal.telephony.nano.TelephonyProto.ModemPowerStats;

/**
 * ModemPowerMetrics holds the modem power metrics and converts them to ModemPowerStats proto buf.
 * This proto buf is included in the Telephony proto buf.
 */
public class ModemPowerMetrics {

    /* BatteryStats API */
    private final IBatteryStats mBatteryStats;

    public ModemPowerMetrics() {
        mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService(
            BatteryStats.SERVICE_NAME));
    }

    /**
     * Build ModemPowerStats proto
     * @return ModemPowerStats
     */
    public ModemPowerStats buildProto() {
        ModemPowerStats m = new ModemPowerStats();
        CellularBatteryStats stats = getStats();
        if (stats != null) {
            m.loggingDurationMs = stats.getLoggingDurationMs();
            m.energyConsumedMah = stats.getEnergyConsumedMaMs()
                / ((double) DateUtils.HOUR_IN_MILLIS);
            m.numPacketsTx = stats.getNumPacketsTx();
            m.cellularKernelActiveTimeMs = stats.getKernelActiveTimeMs();
            if (stats.getTimeInRxSignalStrengthLevelMs() != null
                && stats.getTimeInRxSignalStrengthLevelMs().length > 0) {
                m.timeInVeryPoorRxSignalLevelMs = stats.getTimeInRxSignalStrengthLevelMs()[0];
            }
            m.sleepTimeMs = stats.getSleepTimeMs();
            m.idleTimeMs = stats.getIdleTimeMs();
            m.rxTimeMs = stats.getRxTimeMs();
            long[] t = stats.getTxTimeMs();
            m.txTimeMs = new long[t.length];
            for (int i = 0; i < t.length; i++) {
                m.txTimeMs[i] = t[i];
            }
        }
        return m;
    }

    /**
     * Get cellular stats from batterystats
     * @return CellularBatteryStats
     */
    private CellularBatteryStats getStats() {
        try {
            return mBatteryStats.getCellularBatteryStats();
        } catch (RemoteException e) {
        }
        return null;
    }
}
+20 −1
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.RilSetu
import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent.RilSetupDataCallResponse
        .RilDataCallFailCause;
import com.android.internal.telephony.nano.TelephonyProto.TelephonyLog;
import com.android.internal.telephony.nano.TelephonyProto.ModemPowerStats;
import com.android.internal.telephony.nano.TelephonyProto.TelephonyServiceState;
import com.android.internal.telephony.nano.TelephonyProto.TelephonySettings;
import com.android.internal.telephony.nano.TelephonyProto.TimeInterval;
@@ -412,6 +413,21 @@ public class TelephonyMetrics {
        }

        pw.decreaseIndent();
        pw.println("Modem power stats:");
        pw.increaseIndent();
        ModemPowerStats s = new ModemPowerMetrics().buildProto();
        pw.println("Power log duration (battery time) (ms): " + s.loggingDurationMs);
        pw.println("Energy consumed by modem (mAh): " + s.energyConsumedMah);
        pw.println("Number of packets sent (tx): " + s.numPacketsTx);
        pw.println("Amount of time kernel is active because of cellular data (ms): " +
            s.cellularKernelActiveTimeMs);
        pw.println("Amount of time spent in very poor rx signal level (ms): " +
            s.timeInVeryPoorRxSignalLevelMs);
        pw.println("Amount of time modem is in sleep (ms): " + s.sleepTimeMs);
        pw.println("Amount of time modem is in idle (ms): " + s.idleTimeMs);
        pw.println("Amount of time modem is in rx (ms): " + s.rxTimeMs);
        pw.println("Amount of time modem is in tx (ms): " + Arrays.toString(s.txTimeMs));
        pw.decreaseIndent();
    }

    /**
@@ -505,6 +521,9 @@ public class TelephonyMetrics {
            histogramProto.bucketCounters = rilHistogram.getBucketCounters();
        }

        // Build modem power metrics
        log.modemPowerStats = new ModemPowerMetrics().buildProto();

        // Log the starting system time
        log.startTime = new TelephonyProto.Time();
        log.startTime.systemTimestampMillis = mStartSystemTimeMs;