blob: ff0083138b3046d5bef600a42432aaee9c0980c7 [file] [log] [blame]
/*
* 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<Long, RailInfoData> 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);
}
}
}