/* * Copyright (C) 2019 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.os; import android.util.ArrayMap; import android.util.Slog; import java.util.Map; /** Rail Stats Power Monitoring Class */ public final class RailStats { private static final String TAG = "RailStats"; private static final String WIFI_SUBSYSTEM = "wifi"; private static final String CELLULAR_SUBSYSTEM = "cellular"; private Map mRailInfoData = new ArrayMap<>(); private long mCellularTotalEnergyUseduWs = 0; private long mWifiTotalEnergyUseduWs = 0; private boolean mRailStatsAvailability = true; /** Updates the rail data map of all power monitor rails being monitored * Function is called from native side * @param index * @param railName * @param subSystemName * @param timestampSinceBootMs * @param energyUsedSinceBootuWs */ public void updateRailData(long index, String railName, String subSystemName, long timestampSinceBootMs, long energyUsedSinceBootuWs) { if (!(subSystemName.equals(WIFI_SUBSYSTEM) || subSystemName.equals(CELLULAR_SUBSYSTEM))) { return; } RailInfoData node = mRailInfoData.get(index); if (node == null) { mRailInfoData.put(index, new RailInfoData(index, railName, subSystemName, timestampSinceBootMs, energyUsedSinceBootuWs)); if (subSystemName.equals(WIFI_SUBSYSTEM)) { mWifiTotalEnergyUseduWs += energyUsedSinceBootuWs; return; } if (subSystemName.equals(CELLULAR_SUBSYSTEM)) { mCellularTotalEnergyUseduWs += energyUsedSinceBootuWs; } return; } long timeSinceLastLogMs = timestampSinceBootMs - node.timestampSinceBootMs; long energyUsedSinceLastLoguWs = energyUsedSinceBootuWs - node.energyUsedSinceBootuWs; if (timeSinceLastLogMs < 0 || energyUsedSinceLastLoguWs < 0) { energyUsedSinceLastLoguWs = node.energyUsedSinceBootuWs; } node.timestampSinceBootMs = timestampSinceBootMs; node.energyUsedSinceBootuWs = energyUsedSinceBootuWs; if (subSystemName.equals(WIFI_SUBSYSTEM)) { mWifiTotalEnergyUseduWs += energyUsedSinceLastLoguWs; return; } if (subSystemName.equals(CELLULAR_SUBSYSTEM)) { mCellularTotalEnergyUseduWs += energyUsedSinceLastLoguWs; } } /** resets the cellular total energy used aspect. */ public void resetCellularTotalEnergyUsed() { mCellularTotalEnergyUseduWs = 0; } /** resets the wifi total energy used aspect. */ public void resetWifiTotalEnergyUsed() { mWifiTotalEnergyUseduWs = 0; } public long getCellularTotalEnergyUseduWs() { return mCellularTotalEnergyUseduWs; } public long getWifiTotalEnergyUseduWs() { return mWifiTotalEnergyUseduWs; } /** reset the total energy subsystems * */ public void reset() { mCellularTotalEnergyUseduWs = 0; mWifiTotalEnergyUseduWs = 0; } public RailStats getRailStats() { return this; } public void setRailStatsAvailability(boolean railStatsAvailability) { mRailStatsAvailability = railStatsAvailability; } public boolean isRailStatsAvailable() { return mRailStatsAvailability; } /** Container class to contain rail data information */ public static class RailInfoData { private static final String TAG = "RailInfoData"; public long index; public String railName; public String subSystemName; public long timestampSinceBootMs; public long energyUsedSinceBootuWs; private RailInfoData(long index, String railName, String subSystemName, long timestampSinceBootMs, long energyUsedSinceBoot) { this.index = index; this.railName = railName; this.subSystemName = subSystemName; this.timestampSinceBootMs = timestampSinceBootMs; this.energyUsedSinceBootuWs = energyUsedSinceBoot; } /** print the rail data * */ public void printData() { Slog.d(TAG, "Index = " + index); Slog.d(TAG, "RailName = " + railName); Slog.d(TAG, "SubSystemName = " + subSystemName); Slog.d(TAG, "TimestampSinceBootMs = " + timestampSinceBootMs); Slog.d(TAG, "EnergyUsedSinceBootuWs = " + energyUsedSinceBootuWs); } } }