blob: efd3ab51284b96eeec1dc678ceabbb4ccc7f0f40 [file] [log] [blame]
package com.android.internal.os;
import android.os.BatteryStats;
import android.util.Log;
import android.util.LongSparseArray;
public class MemoryPowerCalculator extends PowerCalculator {
public static final String TAG = "MemoryPowerCalculator";
private static final boolean DEBUG = BatteryStatsHelper.DEBUG;
private final double[] powerAverages;
public MemoryPowerCalculator(PowerProfile profile) {
int numBuckets = profile.getNumElements(PowerProfile.POWER_MEMORY);
powerAverages = new double[numBuckets];
for (int i = 0; i < numBuckets; i++) {
powerAverages[i] = profile.getAveragePower(PowerProfile.POWER_MEMORY, i);
if (powerAverages[i] == 0 && DEBUG) {
Log.d(TAG, "Problem with PowerProfile. Received 0 value in MemoryPowerCalculator");
}
}
}
@Override
public void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
long rawUptimeUs, int statsType) {}
@Override
public void calculateRemaining(BatterySipper app, BatteryStats stats, long rawRealtimeUs,
long rawUptimeUs, int statsType) {
double totalMah = 0;
long totalTimeMs = 0;
LongSparseArray<? extends BatteryStats.Timer> timers = stats.getKernelMemoryStats();
for (int i = 0; i < timers.size() && i < powerAverages.length; i++) {
double mAatRail = powerAverages[(int) timers.keyAt(i)];
long timeMs = timers.valueAt(i).getTotalTimeLocked(rawRealtimeUs, statsType);
double mAm = (mAatRail * timeMs) / (1000*60);
if(DEBUG) {
Log.d(TAG, "Calculating mAh for bucket " + timers.keyAt(i) + " while unplugged");
Log.d(TAG, "Converted power profile number from "
+ powerAverages[(int) timers.keyAt(i)] + " into " + mAatRail);
Log.d(TAG, "Calculated mAm " + mAm);
}
totalMah += mAm/60;
totalTimeMs += timeMs;
}
app.usagePowerMah = totalMah;
app.usageTimeMs = totalTimeMs;
if (DEBUG) {
Log.d(TAG, String.format("Calculated total mAh for memory %f while unplugged %d ",
totalMah, totalTimeMs));
}
}
}