Update to new version of PowerStats HAL 2.0

Bug: 178048034
Test: atest FrameworksServicesTests:PowerStatsServiceTest
Change-Id: I714d2037a3576a3f6f89211d64ccf88cefa51abf
This commit is contained in:
Mat Bevilacqua
2021-01-20 17:45:20 -08:00
parent 752b1e59c9
commit 6058dc2190
10 changed files with 447 additions and 407 deletions

View File

@@ -53,12 +53,12 @@ message IncidentReportResidencyProto {
/**
* EnergyConsumer (model) data is exposed by the PowerStats HAL. This data
* represents modeled energy consumption estimates and is provided per
* subsystem. The default subsystems are defined in EnergyConsumerId.aidl.
* subsystem. The default subsystems are defined in EnergyConsumerType.aidl.
* Energy model estimates will be logged to incident reports in addition to
* the raw energy meter data.
*/
message PowerStatsServiceModelProto {
repeated EnergyConsumerIdProto energy_consumer_id = 1;
repeated EnergyConsumerProto energy_consumer = 1;
repeated EnergyConsumerResultProto energy_consumer_result = 2;
}
@@ -68,13 +68,13 @@ message PowerStatsServiceModelProto {
* This raw energy meter data will be logged to incident reports.
*/
message PowerStatsServiceMeterProto {
repeated ChannelInfoProto channel_info = 1;
repeated ChannelProto channel = 1;
repeated EnergyMeasurementProto energy_measurement = 2;
}
/**
* A PowerEntity is defined as a platform subsystem, peripheral, or power domain
* that impacts the total device power consumption. PowerEntityInfo is
* that impacts the total device power consumption. PowerEntity is
* information related to each power entity. Each PowerEntity may reside in one
* of multiple states. It may also transition from one state to another.
* StateResidency is defined as an accumulation of time that a PowerEntity
@@ -83,44 +83,44 @@ message PowerStatsServiceMeterProto {
* entered.
*/
message PowerStatsServiceResidencyProto {
repeated PowerEntityInfoProto power_entity_info = 1;
repeated PowerEntityProto power_entity = 1;
repeated StateResidencyResultProto state_residency_result = 2;
}
/**
* Information about the possible states for a particular PowerEntity.
*/
message StateInfoProto {
message StateProto {
/**
* Unique (for a given PowerEntityInfo) ID of this StateInfo
* Unique (for a given PowerEntity) ID of this State
*/
optional int32 state_id = 1;
optional int32 id = 1;
/**
* Unique (for a given PowerEntityInfo) name of the state. Vendor/device specific.
* Unique (for a given PowerEntity) name of the state. Vendor/device specific.
* Opaque to framework
*/
optional string state_name = 2;
optional string name = 2;
}
/**
* A PowerEntity is defined as a platform subsystem, peripheral, or power domain
* that impacts the total device power consumption. PowerEntityInfo is
* that impacts the total device power consumption. PowerEntity is
* information about a PowerEntity. It includes an array of information about
* each possible state of the PowerEntity.
*/
message PowerEntityInfoProto {
message PowerEntityProto {
/**
* Unique ID of this PowerEntityInfo
* Unique ID of this PowerEntity
*/
optional int32 power_entity_id = 1;
optional int32 id = 1;
/**
* Unique name of the PowerEntity. Vendor/device specific. Opaque to framework
*/
optional string power_entity_name = 2;
optional string name = 2;
/**
* List of states that the PowerEntity may reside in
*/
repeated StateInfoProto states = 3;
repeated StateProto states = 3;
}
/**
@@ -133,7 +133,7 @@ message StateResidencyProto {
/**
* ID of the state associated with this residency
*/
optional int32 state_id = 1;
optional int32 id = 1;
/**
* Total time in milliseconds that the corresponding PowerEntity resided
* in this state since boot
@@ -152,13 +152,13 @@ message StateResidencyProto {
/**
* A StateResidencyResult is an array of StateResidencies for a particular
* PowerEntity. The StateResidencyResult can be matched to its corresponding
* PowerEntityInfo through the power_entity_id field.
* PowerEntity through the id field.
*/
message StateResidencyResultProto {
/**
* ID of the PowerEntity associated with this result
*/
optional int32 power_entity_id = 1;
optional int32 id = 1;
/**
* Residency for each state in the PowerEntity's state space
*/
@@ -166,23 +166,39 @@ message StateResidencyResultProto {
}
/**
* Energy consumer ID:
* Energy consumer:
* A list of default subsystems for which energy consumption estimates
* may be provided (hardware dependent).
*/
message EnergyConsumerIdProto {
/** Unique index identifying the energy consumer. */
optional int32 energy_consumer_id = 1;
message EnergyConsumerProto {
/** Unique ID of this EnergyConsumer */
optional int32 id = 1;
/**
* For a group of EnergyConsumers of the same logical type, sorting by
* ordinal should be give their physical order. No other meaning is
* carried by it.
*/
optional int32 ordinal = 2;
/** Type of this EnergyConsumer */
optional int32 type = 3;
/**
* Unique name of this EnergyConsumer. Vendor/device specific. Opaque
* to framework
*/
optional string name = 4;
}
/**
* Energy consumer result:
* An estimate of energy consumption since boot for the subsystem identified
* by the unique energy_consumer_id.
* by the unique id.
*/
message EnergyConsumerResultProto {
/** Unique index identifying the energy consumer. */
optional int32 energy_consumer_id = 1;
optional int32 id = 1;
/** Time since device boot(CLOCK_BOOTTIME) in milli-seconds */
optional int64 timestamp_ms = 2;
@@ -195,15 +211,15 @@ message EnergyConsumerResultProto {
* Channel information:
* Reports information related to the energy meter channels being monitored.
*/
message ChannelInfoProto {
message ChannelProto {
/**
* Index corresponding to the energy meter channel. This index matches
* the index returned in ChannelInfo.
* the index returned in Channel.
*/
optional int32 channel_id = 1;
optional int32 id = 1;
/** Name of the energy meter channel */
optional string channel_name = 2;
optional string name = 2;
}
/**
@@ -213,13 +229,17 @@ message ChannelInfoProto {
message EnergyMeasurementProto {
/**
* Index corresponding to the energy meter channel. This index matches
* the index returned in ChannelInfo.
* the index returned in Channel.
*/
optional int32 channel_id = 1;
optional int32 id = 1;
/** Time since device boot(CLOCK_BOOTTIME) in milli-seconds */
optional int64 timestamp_ms = 2;
/** Accumulated energy since device boot in microwatt-seconds (uWs) */
optional int64 energy_uws = 3;
/** Duration in milliseconds that energy has been accumulated */
optional int64 duration_ms = 4;
}

View File

@@ -16,7 +16,7 @@
package android.power;
import android.hardware.power.stats.EnergyConsumerId;
//import android.hardware.power.stats.EnergyConsumerId;
import android.hardware.power.stats.EnergyConsumerResult;
import java.util.concurrent.CompletableFuture;
@@ -38,5 +38,5 @@ public abstract class PowerStatsInternal {
* consumer results for all listed {@link EnergyConsumerId}.
*/
public abstract CompletableFuture<EnergyConsumerResult[]> getEnergyConsumedAsync(
@EnergyConsumerId int[] energyConsumerIds);
/*@EnergyConsumerId*/ int[] energyConsumerIds);
}

View File

@@ -22,7 +22,6 @@ import android.annotation.Nullable;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.hardware.power.stats.EnergyConsumerId;
import android.hardware.power.stats.EnergyConsumerResult;
import android.net.wifi.WifiManager;
import android.os.BatteryStats;
@@ -750,7 +749,8 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
for (int i = 0; i < size; i++) {
final EnergyConsumerResult consumer = results[i];
final int subsystem;
final int subsystem = 0;
/*
switch (consumer.energyConsumerId) {
case EnergyConsumerId.DISPLAY:
subsystem = MeasuredEnergyArray.SUBSYSTEM_DISPLAY;
@@ -758,6 +758,7 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
default:
continue;
}
*/
subsystems[i] = subsystem;
energyUJ[i] = consumer.energyUWs;
}

View File

@@ -16,10 +16,10 @@
package com.android.server.powerstats;
import android.hardware.power.stats.ChannelInfo;
import android.hardware.power.stats.Channel;
import android.hardware.power.stats.EnergyMeasurement;
import android.hardware.power.stats.IPowerStats;
import android.hardware.power.stats.PowerEntityInfo;
import android.hardware.power.stats.PowerEntity;
import android.hardware.power.stats.StateResidencyResult;
import android.os.Binder;
import android.os.IBinder;
@@ -51,7 +51,7 @@ public final class PowerStatsHALWrapper {
*
* @return List of information on each PowerEntity.
*/
android.hardware.power.stats.PowerEntityInfo[] getPowerEntityInfo();
android.hardware.power.stats.PowerEntity[] getPowerEntityInfo();
/**
* Reports the accumulated state residency for each requested PowerEntity.
@@ -66,22 +66,22 @@ public final class PowerStatsHALWrapper {
* @param powerEntityIds List of IDs of PowerEntities for which data is requested. Passing
* an empty list will return state residency for all available
* PowerEntities. ID of each PowerEntity is contained in
* PowerEntityInfo.
* PowerEntity.
*
* @return StateResidency since boot for each requested PowerEntity
*/
android.hardware.power.stats.StateResidencyResult[] getStateResidency(int[] powerEntityIds);
/**
* Returns the energy consumer IDs for all available energy consumers (power models) on the
* Returns the energy consumer info for all available energy consumers (power models) on the
* device. Examples of subsystems for which energy consumer results (power models) may be
* available are GPS, display, wifi, etc. The default list of energy consumers can be
* found in the PowerStats HAL definition (EnergyConsumerId.aidl). The availability of
* found in the PowerStats HAL definition (EnergyConsumerType.aidl). The availability of
* energy consumer IDs is hardware dependent.
*
* @return List of EnergyConsumerIds all available energy consumers.
* @return List of EnergyConsumers all available energy consumers.
*/
int[] getEnergyConsumerInfo();
android.hardware.power.stats.EnergyConsumer[] getEnergyConsumerInfo();
/**
* Returns the energy consumer result for all available energy consumers (power models).
@@ -102,10 +102,10 @@ public final class PowerStatsHALWrapper {
/**
* Returns channel info for all available energy meters.
*
* @return List of ChannelInfo objects containing channel info for all available energy
* @return List of Channel objects containing channel info for all available energy
* meters.
*/
android.hardware.power.stats.ChannelInfo[] getEnergyMeterInfo();
android.hardware.power.stats.Channel[] getEnergyMeterInfo();
/**
* Returns energy measurements for all available energy meters. Available channels can be
@@ -152,18 +152,18 @@ public final class PowerStatsHALWrapper {
}
@Override
public android.hardware.power.stats.PowerEntityInfo[] getPowerEntityInfo() {
android.hardware.power.stats.PowerEntityInfo[] powerEntityInfoHAL = null;
public android.hardware.power.stats.PowerEntity[] getPowerEntityInfo() {
android.hardware.power.stats.PowerEntity[] powerEntityHAL = null;
if (sVintfPowerStats != null) {
try {
powerEntityInfoHAL = sVintfPowerStats.get().getPowerEntityInfo();
powerEntityHAL = sVintfPowerStats.get().getPowerEntityInfo();
} catch (RemoteException e) {
if (DEBUG) Slog.d(TAG, "Failed to get power entity info from PowerStats HAL");
}
}
return powerEntityInfoHAL;
return powerEntityHAL;
}
@Override
@@ -184,12 +184,12 @@ public final class PowerStatsHALWrapper {
}
@Override
public int[] getEnergyConsumerInfo() {
int[] energyConsumerInfoHAL = null;
public android.hardware.power.stats.EnergyConsumer[] getEnergyConsumerInfo() {
android.hardware.power.stats.EnergyConsumer[] energyConsumerHAL = null;
if (sVintfPowerStats != null) {
try {
energyConsumerInfoHAL = sVintfPowerStats.get().getEnergyConsumerInfo();
energyConsumerHAL = sVintfPowerStats.get().getEnergyConsumerInfo();
} catch (RemoteException e) {
if (DEBUG) {
Slog.d(TAG, "Failed to get energy consumer info from PowerStats HAL");
@@ -197,7 +197,7 @@ public final class PowerStatsHALWrapper {
}
}
return energyConsumerInfoHAL;
return energyConsumerHAL;
}
@Override
@@ -220,8 +220,8 @@ public final class PowerStatsHALWrapper {
}
@Override
public android.hardware.power.stats.ChannelInfo[] getEnergyMeterInfo() {
android.hardware.power.stats.ChannelInfo[] energyMeterInfoHAL = null;
public android.hardware.power.stats.Channel[] getEnergyMeterInfo() {
android.hardware.power.stats.Channel[] energyMeterInfoHAL = null;
if (sVintfPowerStats != null) {
try {
@@ -267,9 +267,9 @@ public final class PowerStatsHALWrapper {
// PowerStatsHAL 1.0 native functions exposed by JNI layer.
private static native boolean nativeInit();
private static native PowerEntityInfo[] nativeGetPowerEntityInfo();
private static native PowerEntity[] nativeGetPowerEntityInfo();
private static native StateResidencyResult[] nativeGetStateResidency(int[] powerEntityIds);
private static native ChannelInfo[] nativeGetEnergyMeterInfo();
private static native Channel[] nativeGetEnergyMeterInfo();
private static native EnergyMeasurement[] nativeReadEnergyMeters(int[] channelIds);
public PowerStatsHAL10WrapperImpl() {
@@ -282,7 +282,7 @@ public final class PowerStatsHALWrapper {
}
@Override
public android.hardware.power.stats.PowerEntityInfo[] getPowerEntityInfo() {
public android.hardware.power.stats.PowerEntity[] getPowerEntityInfo() {
return nativeGetPowerEntityInfo();
}
@@ -293,7 +293,7 @@ public final class PowerStatsHALWrapper {
}
@Override
public int[] getEnergyConsumerInfo() {
public android.hardware.power.stats.EnergyConsumer[] getEnergyConsumerInfo() {
if (DEBUG) Slog.d(TAG, "Energy consumer info is not supported");
return null;
}
@@ -306,7 +306,7 @@ public final class PowerStatsHALWrapper {
}
@Override
public android.hardware.power.stats.ChannelInfo[] getEnergyMeterInfo() {
public android.hardware.power.stats.Channel[] getEnergyMeterInfo() {
return nativeGetEnergyMeterInfo();
}

View File

@@ -17,10 +17,11 @@
package com.android.server.powerstats;
import android.content.Context;
import android.hardware.power.stats.ChannelInfo;
import android.hardware.power.stats.Channel;
import android.hardware.power.stats.EnergyConsumer;
import android.hardware.power.stats.EnergyConsumerResult;
import android.hardware.power.stats.EnergyMeasurement;
import android.hardware.power.stats.PowerEntityInfo;
import android.hardware.power.stats.PowerEntity;
import android.hardware.power.stats.StateResidencyResult;
import android.os.Handler;
import android.os.Looper;
@@ -30,11 +31,11 @@ import android.util.proto.ProtoInputStream;
import android.util.proto.ProtoOutputStream;
import com.android.server.powerstats.PowerStatsHALWrapper.IPowerStatsHALWrapper;
import com.android.server.powerstats.ProtoStreamUtils.ChannelInfoUtils;
import com.android.server.powerstats.ProtoStreamUtils.EnergyConsumerIdUtils;
import com.android.server.powerstats.ProtoStreamUtils.ChannelUtils;
import com.android.server.powerstats.ProtoStreamUtils.EnergyConsumerResultUtils;
import com.android.server.powerstats.ProtoStreamUtils.EnergyConsumerUtils;
import com.android.server.powerstats.ProtoStreamUtils.EnergyMeasurementUtils;
import com.android.server.powerstats.ProtoStreamUtils.PowerEntityInfoUtils;
import com.android.server.powerstats.ProtoStreamUtils.PowerEntityUtils;
import com.android.server.powerstats.ProtoStreamUtils.StateResidencyResultUtils;
import java.io.ByteArrayInputStream;
@@ -106,9 +107,9 @@ public final class PowerStatsLogger extends Handler {
final ProtoOutputStream pos = new ProtoOutputStream(fd);
try {
ChannelInfo[] channelInfo = mPowerStatsHALWrapper.getEnergyMeterInfo();
ChannelInfoUtils.packProtoMessage(channelInfo, pos);
if (DEBUG) ChannelInfoUtils.print(channelInfo);
Channel[] channel = mPowerStatsHALWrapper.getEnergyMeterInfo();
ChannelUtils.packProtoMessage(channel, pos);
if (DEBUG) ChannelUtils.print(channel);
mPowerStatsMeterStorage.read(new PowerStatsDataStorage.DataElementReadCallback() {
@Override
@@ -147,9 +148,9 @@ public final class PowerStatsLogger extends Handler {
final ProtoOutputStream pos = new ProtoOutputStream(fd);
try {
int[] energyConsumerId = mPowerStatsHALWrapper.getEnergyConsumerInfo();
EnergyConsumerIdUtils.packProtoMessage(energyConsumerId, pos);
if (DEBUG) EnergyConsumerIdUtils.print(energyConsumerId);
EnergyConsumer[] energyConsumer = mPowerStatsHALWrapper.getEnergyConsumerInfo();
EnergyConsumerUtils.packProtoMessage(energyConsumer, pos);
if (DEBUG) EnergyConsumerUtils.print(energyConsumer);
mPowerStatsModelStorage.read(new PowerStatsDataStorage.DataElementReadCallback() {
@Override
@@ -188,9 +189,9 @@ public final class PowerStatsLogger extends Handler {
final ProtoOutputStream pos = new ProtoOutputStream(fd);
try {
PowerEntityInfo[] powerEntityInfo = mPowerStatsHALWrapper.getPowerEntityInfo();
PowerEntityInfoUtils.packProtoMessage(powerEntityInfo, pos);
if (DEBUG) PowerEntityInfoUtils.print(powerEntityInfo);
PowerEntity[] powerEntity = mPowerStatsHALWrapper.getPowerEntityInfo();
PowerEntityUtils.packProtoMessage(powerEntity, pos);
if (DEBUG) PowerEntityUtils.print(powerEntity);
mPowerStatsResidencyStorage.read(new PowerStatsDataStorage.DataElementReadCallback() {
@Override

View File

@@ -18,9 +18,10 @@ package com.android.server.powerstats;
import android.annotation.Nullable;
import android.content.Context;
import android.hardware.power.stats.ChannelInfo;
import android.hardware.power.stats.Channel;
import android.hardware.power.stats.EnergyConsumer;
import android.hardware.power.stats.EnergyConsumerResult;
import android.hardware.power.stats.PowerEntityInfo;
import android.hardware.power.stats.PowerEntity;
import android.os.Binder;
import android.os.Environment;
import android.os.Handler;
@@ -34,9 +35,9 @@ import com.android.internal.util.DumpUtils;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.SystemService;
import com.android.server.powerstats.PowerStatsHALWrapper.IPowerStatsHALWrapper;
import com.android.server.powerstats.ProtoStreamUtils.ChannelInfoUtils;
import com.android.server.powerstats.ProtoStreamUtils.EnergyConsumerIdUtils;
import com.android.server.powerstats.ProtoStreamUtils.PowerEntityInfoUtils;
import com.android.server.powerstats.ProtoStreamUtils.ChannelUtils;
import com.android.server.powerstats.ProtoStreamUtils.EnergyConsumerUtils;
import com.android.server.powerstats.ProtoStreamUtils.PowerEntityUtils;
import java.io.File;
import java.io.FileDescriptor;
@@ -133,17 +134,17 @@ public class PowerStatsService extends SystemService {
mPowerStatsLogger.writeResidencyDataToFile(fd);
}
} else if (args.length == 0) {
pw.println("PowerStatsService dumpsys: available PowerEntityInfos");
PowerEntityInfo[] powerEntityInfo = getPowerStatsHal().getPowerEntityInfo();
PowerEntityInfoUtils.dumpsys(powerEntityInfo, pw);
pw.println("PowerStatsService dumpsys: available PowerEntities");
PowerEntity[] powerEntity = getPowerStatsHal().getPowerEntityInfo();
PowerEntityUtils.dumpsys(powerEntity, pw);
pw.println("PowerStatsService dumpsys: available ChannelInfos");
ChannelInfo[] channelInfo = getPowerStatsHal().getEnergyMeterInfo();
ChannelInfoUtils.dumpsys(channelInfo, pw);
pw.println("PowerStatsService dumpsys: available Channels");
Channel[] channel = getPowerStatsHal().getEnergyMeterInfo();
ChannelUtils.dumpsys(channel, pw);
pw.println("PowerStatsService dumpsys: available EnergyConsumerIds");
int[] energyConsumerId = getPowerStatsHal().getEnergyConsumerInfo();
EnergyConsumerIdUtils.dumpsys(energyConsumerId, pw);
pw.println("PowerStatsService dumpsys: available EnergyConsumers");
EnergyConsumer[] energyConsumer = getPowerStatsHal().getEnergyConsumerInfo();
EnergyConsumerUtils.dumpsys(energyConsumer, pw);
}
}
}

View File

@@ -16,11 +16,12 @@
package com.android.server.powerstats;
import android.hardware.power.stats.ChannelInfo;
import android.hardware.power.stats.Channel;
import android.hardware.power.stats.EnergyConsumer;
import android.hardware.power.stats.EnergyConsumerResult;
import android.hardware.power.stats.EnergyMeasurement;
import android.hardware.power.stats.PowerEntityInfo;
import android.hardware.power.stats.StateInfo;
import android.hardware.power.stats.PowerEntity;
import android.hardware.power.stats.State;
import android.hardware.power.stats.StateResidency;
import android.hardware.power.stats.StateResidencyResult;
import android.util.Slog;
@@ -46,55 +47,54 @@ import java.util.List;
public class ProtoStreamUtils {
private static final String TAG = ProtoStreamUtils.class.getSimpleName();
static class PowerEntityInfoUtils {
public static void packProtoMessage(PowerEntityInfo[] powerEntityInfo,
static class PowerEntityUtils {
public static void packProtoMessage(PowerEntity[] powerEntity,
ProtoOutputStream pos) {
if (powerEntityInfo == null) return;
if (powerEntity == null) return;
for (int i = 0; i < powerEntityInfo.length; i++) {
long peiToken = pos.start(PowerStatsServiceResidencyProto.POWER_ENTITY_INFO);
pos.write(PowerEntityInfoProto.POWER_ENTITY_ID, powerEntityInfo[i].powerEntityId);
pos.write(PowerEntityInfoProto.POWER_ENTITY_NAME,
powerEntityInfo[i].powerEntityName);
if (powerEntityInfo[i].states != null) {
final int statesLength = powerEntityInfo[i].states.length;
for (int i = 0; i < powerEntity.length; i++) {
long peToken = pos.start(PowerStatsServiceResidencyProto.POWER_ENTITY);
pos.write(PowerEntityProto.ID, powerEntity[i].id);
pos.write(PowerEntityProto.NAME, powerEntity[i].name);
if (powerEntity[i].states != null) {
final int statesLength = powerEntity[i].states.length;
for (int j = 0; j < statesLength; j++) {
final StateInfo state = powerEntityInfo[i].states[j];
long siToken = pos.start(PowerEntityInfoProto.STATES);
pos.write(StateInfoProto.STATE_ID, state.stateId);
pos.write(StateInfoProto.STATE_NAME, state.stateName);
pos.end(siToken);
final State state = powerEntity[i].states[j];
long stateToken = pos.start(PowerEntityProto.STATES);
pos.write(StateProto.ID, state.id);
pos.write(StateProto.NAME, state.name);
pos.end(stateToken);
}
}
pos.end(peiToken);
pos.end(peToken);
}
}
public static void print(PowerEntityInfo[] powerEntityInfo) {
if (powerEntityInfo == null) return;
public static void print(PowerEntity[] powerEntity) {
if (powerEntity == null) return;
for (int i = 0; i < powerEntityInfo.length; i++) {
Slog.d(TAG, "PowerEntityId: " + powerEntityInfo[i].powerEntityId
+ ", PowerEntityName: " + powerEntityInfo[i].powerEntityName);
if (powerEntityInfo[i].states != null) {
for (int j = 0; j < powerEntityInfo[i].states.length; j++) {
Slog.d(TAG, " StateId: " + powerEntityInfo[i].states[j].stateId
+ ", StateName: " + powerEntityInfo[i].states[j].stateName);
for (int i = 0; i < powerEntity.length; i++) {
Slog.d(TAG, "powerEntityId: " + powerEntity[i].id
+ ", powerEntityName: " + powerEntity[i].name);
if (powerEntity[i].states != null) {
for (int j = 0; j < powerEntity[i].states.length; j++) {
Slog.d(TAG, " StateId: " + powerEntity[i].states[j].id
+ ", StateName: " + powerEntity[i].states[j].name);
}
}
}
}
public static void dumpsys(PowerEntityInfo[] powerEntityInfo, PrintWriter pw) {
if (powerEntityInfo == null) return;
public static void dumpsys(PowerEntity[] powerEntity, PrintWriter pw) {
if (powerEntity == null) return;
for (int i = 0; i < powerEntityInfo.length; i++) {
pw.println("PowerEntityId: " + powerEntityInfo[i].powerEntityId
+ ", PowerEntityName: " + powerEntityInfo[i].powerEntityName);
if (powerEntityInfo[i].states != null) {
for (int j = 0; j < powerEntityInfo[i].states.length; j++) {
pw.println(" StateId: " + powerEntityInfo[i].states[j].stateId
+ ", StateName: " + powerEntityInfo[i].states[j].stateName);
for (int i = 0; i < powerEntity.length; i++) {
pw.println("PowerEntityId: " + powerEntity[i].id
+ ", PowerEntityName: " + powerEntity[i].name);
if (powerEntity[i].states != null) {
for (int j = 0; j < powerEntity[i].states.length; j++) {
pw.println(" StateId: " + powerEntity[i].states[j].id
+ ", StateName: " + powerEntity[i].states[j].name);
}
}
}
@@ -115,13 +115,13 @@ public class ProtoStreamUtils {
for (int i = 0; i < stateResidencyResult.length; i++) {
final int stateLength = stateResidencyResult[i].stateResidencyData.length;
long srrToken = pos.start(PowerStatsServiceResidencyProto.STATE_RESIDENCY_RESULT);
pos.write(StateResidencyResultProto.POWER_ENTITY_ID,
stateResidencyResult[i].powerEntityId);
pos.write(StateResidencyResultProto.ID,
stateResidencyResult[i].id);
for (int j = 0; j < stateLength; j++) {
final StateResidency stateResidencyData =
stateResidencyResult[i].stateResidencyData[j];
long srdToken = pos.start(StateResidencyResultProto.STATE_RESIDENCY_DATA);
pos.write(StateResidencyProto.STATE_ID, stateResidencyData.stateId);
pos.write(StateResidencyProto.ID, stateResidencyData.id);
pos.write(StateResidencyProto.TOTAL_TIME_IN_STATE_MS,
stateResidencyData.totalTimeInStateMs);
pos.write(StateResidencyProto.TOTAL_STATE_ENTRY_COUNT,
@@ -170,9 +170,8 @@ public class ProtoStreamUtils {
while (true) {
try {
switch (pis.nextField()) {
case (int) StateResidencyResultProto.POWER_ENTITY_ID:
stateResidencyResult.powerEntityId =
pis.readInt(StateResidencyResultProto.POWER_ENTITY_ID);
case (int) StateResidencyResultProto.ID:
stateResidencyResult.id = pis.readInt(StateResidencyResultProto.ID);
break;
case (int) StateResidencyResultProto.STATE_RESIDENCY_DATA:
@@ -205,8 +204,8 @@ public class ProtoStreamUtils {
while (true) {
try {
switch (pis.nextField()) {
case (int) StateResidencyProto.STATE_ID:
stateResidency.stateId = pis.readInt(StateResidencyProto.STATE_ID);
case (int) StateResidencyProto.ID:
stateResidency.id = pis.readInt(StateResidencyProto.ID);
break;
case (int) StateResidencyProto.TOTAL_TIME_IN_STATE_MS:
@@ -244,10 +243,10 @@ public class ProtoStreamUtils {
if (stateResidencyResult == null) return;
for (int i = 0; i < stateResidencyResult.length; i++) {
Slog.d(TAG, "PowerEntityId: " + stateResidencyResult[i].powerEntityId);
Slog.d(TAG, "PowerEntityId: " + stateResidencyResult[i].id);
for (int j = 0; j < stateResidencyResult[i].stateResidencyData.length; j++) {
Slog.d(TAG, " StateId: "
+ stateResidencyResult[i].stateResidencyData[j].stateId
+ stateResidencyResult[i].stateResidencyData[j].id
+ ", TotalTimeInStateMs: "
+ stateResidencyResult[i].stateResidencyData[j].totalTimeInStateMs
+ ", TotalStateEntryCount: "
@@ -259,33 +258,33 @@ public class ProtoStreamUtils {
}
}
static class ChannelInfoUtils {
public static void packProtoMessage(ChannelInfo[] channelInfo, ProtoOutputStream pos) {
if (channelInfo == null) return;
static class ChannelUtils {
public static void packProtoMessage(Channel[] channel, ProtoOutputStream pos) {
if (channel == null) return;
for (int i = 0; i < channelInfo.length; i++) {
long token = pos.start(PowerStatsServiceMeterProto.CHANNEL_INFO);
pos.write(ChannelInfoProto.CHANNEL_ID, channelInfo[i].channelId);
pos.write(ChannelInfoProto.CHANNEL_NAME, channelInfo[i].channelName);
for (int i = 0; i < channel.length; i++) {
long token = pos.start(PowerStatsServiceMeterProto.CHANNEL);
pos.write(ChannelProto.ID, channel[i].id);
pos.write(ChannelProto.NAME, channel[i].name);
pos.end(token);
}
}
public static void print(ChannelInfo[] channelInfo) {
if (channelInfo == null) return;
public static void print(Channel[] channel) {
if (channel == null) return;
for (int i = 0; i < channelInfo.length; i++) {
Slog.d(TAG, "ChannelId: " + channelInfo[i].channelId
+ ", ChannelName: " + channelInfo[i].channelName);
for (int i = 0; i < channel.length; i++) {
Slog.d(TAG, "ChannelId: " + channel[i].id
+ ", ChannelName: " + channel[i].name);
}
}
public static void dumpsys(ChannelInfo[] channelInfo, PrintWriter pw) {
if (channelInfo == null) return;
public static void dumpsys(Channel[] channel, PrintWriter pw) {
if (channel == null) return;
for (int i = 0; i < channelInfo.length; i++) {
pw.println("ChannelId: " + channelInfo[i].channelId
+ ", ChannelName: " + channelInfo[i].channelName);
for (int i = 0; i < channel.length; i++) {
pw.println("ChannelId: " + channel[i].id
+ ", ChannelName: " + channel[i].name);
}
}
}
@@ -303,8 +302,9 @@ public class ProtoStreamUtils {
for (int i = 0; i < energyMeasurement.length; i++) {
long token = pos.start(PowerStatsServiceMeterProto.ENERGY_MEASUREMENT);
pos.write(EnergyMeasurementProto.CHANNEL_ID, energyMeasurement[i].channelId);
pos.write(EnergyMeasurementProto.ID, energyMeasurement[i].id);
pos.write(EnergyMeasurementProto.TIMESTAMP_MS, energyMeasurement[i].timestampMs);
pos.write(EnergyMeasurementProto.DURATION_MS, energyMeasurement[i].durationMs);
pos.write(EnergyMeasurementProto.ENERGY_UWS, energyMeasurement[i].energyUWs);
pos.end(token);
}
@@ -344,9 +344,9 @@ public class ProtoStreamUtils {
while (true) {
try {
switch (pis.nextField()) {
case (int) EnergyMeasurementProto.CHANNEL_ID:
energyMeasurement.channelId =
pis.readInt(EnergyMeasurementProto.CHANNEL_ID);
case (int) EnergyMeasurementProto.ID:
energyMeasurement.id =
pis.readInt(EnergyMeasurementProto.ID);
break;
case (int) EnergyMeasurementProto.TIMESTAMP_MS:
@@ -354,6 +354,11 @@ public class ProtoStreamUtils {
pis.readLong(EnergyMeasurementProto.TIMESTAMP_MS);
break;
case (int) EnergyMeasurementProto.DURATION_MS:
energyMeasurement.durationMs =
pis.readLong(EnergyMeasurementProto.DURATION_MS);
break;
case (int) EnergyMeasurementProto.ENERGY_UWS:
energyMeasurement.energyUWs =
pis.readLong(EnergyMeasurementProto.ENERGY_UWS);
@@ -378,37 +383,48 @@ public class ProtoStreamUtils {
if (energyMeasurement == null) return;
for (int i = 0; i < energyMeasurement.length; i++) {
Slog.d(TAG, "ChannelId: " + energyMeasurement[i].channelId
Slog.d(TAG, "ChannelId: " + energyMeasurement[i].id
+ ", Timestamp (ms): " + energyMeasurement[i].timestampMs
+ ", Duration (ms): " + energyMeasurement[i].durationMs
+ ", Energy (uWs): " + energyMeasurement[i].energyUWs);
}
}
}
static class EnergyConsumerIdUtils {
public static void packProtoMessage(int[] energyConsumerId, ProtoOutputStream pos) {
if (energyConsumerId == null) return;
static class EnergyConsumerUtils {
public static void packProtoMessage(EnergyConsumer[] energyConsumer,
ProtoOutputStream pos) {
if (energyConsumer == null) return;
for (int i = 0; i < energyConsumerId.length; i++) {
long token = pos.start(PowerStatsServiceModelProto.ENERGY_CONSUMER_ID);
pos.write(EnergyConsumerIdProto.ENERGY_CONSUMER_ID, energyConsumerId[i]);
for (int i = 0; i < energyConsumer.length; i++) {
long token = pos.start(PowerStatsServiceModelProto.ENERGY_CONSUMER);
pos.write(EnergyConsumerProto.ID, energyConsumer[i].id);
pos.write(EnergyConsumerProto.ORDINAL, energyConsumer[i].ordinal);
pos.write(EnergyConsumerProto.TYPE, energyConsumer[i].type);
pos.write(EnergyConsumerProto.NAME, energyConsumer[i].name);
pos.end(token);
}
}
public static void print(int[] energyConsumerId) {
if (energyConsumerId == null) return;
public static void print(EnergyConsumer[] energyConsumer) {
if (energyConsumer == null) return;
for (int i = 0; i < energyConsumerId.length; i++) {
Slog.d(TAG, "EnergyConsumerId: " + energyConsumerId[i]);
for (int i = 0; i < energyConsumer.length; i++) {
Slog.d(TAG, "EnergyConsumerId: " + energyConsumer[i].id
+ ", Ordinal: " + energyConsumer[i].ordinal
+ ", Type: " + energyConsumer[i].type
+ ", Name: " + energyConsumer[i].name);
}
}
public static void dumpsys(int[] energyConsumerId, PrintWriter pw) {
if (energyConsumerId == null) return;
public static void dumpsys(EnergyConsumer[] energyConsumer, PrintWriter pw) {
if (energyConsumer == null) return;
for (int i = 0; i < energyConsumerId.length; i++) {
pw.println("EnergyConsumerId: " + energyConsumerId[i]);
for (int i = 0; i < energyConsumer.length; i++) {
pw.println("EnergyConsumerId: " + energyConsumer[i].id
+ ", Ordinal: " + energyConsumer[i].ordinal
+ ", Type: " + energyConsumer[i].type
+ ", Name: " + energyConsumer[i].name);
}
}
}
@@ -426,8 +442,7 @@ public class ProtoStreamUtils {
for (int i = 0; i < energyConsumerResult.length; i++) {
long token = pos.start(PowerStatsServiceModelProto.ENERGY_CONSUMER_RESULT);
pos.write(EnergyConsumerResultProto.ENERGY_CONSUMER_ID,
energyConsumerResult[i].energyConsumerId);
pos.write(EnergyConsumerResultProto.ID, energyConsumerResult[i].id);
pos.write(EnergyConsumerResultProto.TIMESTAMP_MS,
energyConsumerResult[i].timestampMs);
pos.write(EnergyConsumerResultProto.ENERGY_UWS, energyConsumerResult[i].energyUWs);
@@ -469,9 +484,8 @@ public class ProtoStreamUtils {
while (true) {
try {
switch (pis.nextField()) {
case (int) EnergyConsumerResultProto.ENERGY_CONSUMER_ID:
energyConsumerResult.energyConsumerId =
pis.readInt(EnergyConsumerResultProto.ENERGY_CONSUMER_ID);
case (int) EnergyConsumerResultProto.ID:
energyConsumerResult.id = pis.readInt(EnergyConsumerResultProto.ID);
break;
case (int) EnergyConsumerResultProto.TIMESTAMP_MS:
@@ -503,7 +517,7 @@ public class ProtoStreamUtils {
if (energyConsumerResult == null) return;
for (int i = 0; i < energyConsumerResult.length; i++) {
Slog.d(TAG, "EnergyConsumerId: " + energyConsumerResult[i].energyConsumerId
Slog.d(TAG, "EnergyConsumerId: " + energyConsumerResult[i].id
+ ", Timestamp (ms): " + energyConsumerResult[i].timestampMs
+ ", Energy (uWs): " + energyConsumerResult[i].energyUWs);
}

View File

@@ -28,37 +28,37 @@ using android::hardware::power::stats::V1_0::EnergyData;
using android::hardware::power::stats::V1_0::RailInfo;
using android::hardware::power::stats::V1_0::Status;
// ChannelInfo
static jclass class_CI;
static jmethodID method_CI_init;
static jfieldID field_CI_channelId;
static jfieldID field_CI_channelName;
// Channel
static jclass class_C;
static jmethodID method_C_init;
static jfieldID field_C_id;
static jfieldID field_C_name;
// EnergyMeasurement
static jclass class_EM;
static jmethodID method_EM_init;
static jfieldID field_EM_channelId;
static jfieldID field_EM_id;
static jfieldID field_EM_timestampMs;
static jfieldID field_EM_durationMs;
static jfieldID field_EM_energyUWs;
// StateInfo
static jclass class_SI;
static jmethodID method_SI_init;
static jfieldID field_SI_stateId;
static jfieldID field_SI_stateName;
// State
static jclass class_S;
static jmethodID method_S_init;
static jfieldID field_S_id;
static jfieldID field_S_name;
// PowerEntityInfo
static jclass class_PEI;
static jmethodID method_PEI_init;
static jfieldID field_PEI_powerEntityId;
static jfieldID field_PEI_powerEntityName;
static jfieldID field_PEI_states;
// PowerEntity
static jclass class_PE;
static jmethodID method_PE_init;
static jfieldID field_PE_id;
static jfieldID field_PE_name;
static jfieldID field_PE_states;
// StateResidency
static jclass class_SR;
static jmethodID method_SR_init;
static jfieldID field_SR_stateId;
static jfieldID field_SR_id;
static jfieldID field_SR_totalTimeInStateMs;
static jfieldID field_SR_totalStateEntryCount;
static jfieldID field_SR_lastEntryTimestampMs;
@@ -66,7 +66,7 @@ static jfieldID field_SR_lastEntryTimestampMs;
// StateResidencyResult
static jclass class_SRR;
static jmethodID method_SRR_init;
static jfieldID field_SRR_powerEntityId;
static jfieldID field_SRR_id;
static jfieldID field_SRR_stateResidencyData;
namespace android {
@@ -134,24 +134,21 @@ static jobjectArray nativeGetPowerEntityInfo(JNIEnv *env, jclass clazz) {
return nullptr;
}
jobjectArray powerEntityInfoArray = nullptr;
jobjectArray powerEntityArray = nullptr;
Return<void> ret = gPowerStatsHalV1_0_ptr->getPowerEntityInfo(
[&env, &powerEntityInfoArray](auto infos, auto status) {
[&env, &powerEntityArray](auto infos, auto status) {
if (status != Status::SUCCESS) {
ALOGE("Error getting power entity info");
} else {
powerEntityInfoArray = env->NewObjectArray(infos.size(), class_PEI, nullptr);
powerEntityArray = env->NewObjectArray(infos.size(), class_PE, nullptr);
for (int i = 0; i < infos.size(); i++) {
jstring powerEntityName =
env->NewStringUTF(infos[i].powerEntityName.c_str());
jobject powerEntityInfo = env->NewObject(class_PEI, method_PEI_init);
env->SetIntField(powerEntityInfo, field_PEI_powerEntityId,
infos[i].powerEntityId);
env->SetObjectField(powerEntityInfo, field_PEI_powerEntityName,
powerEntityName);
env->SetObjectArrayElement(powerEntityInfoArray, i, powerEntityInfo);
env->DeleteLocalRef(powerEntityName);
env->DeleteLocalRef(powerEntityInfo);
jstring name = env->NewStringUTF(infos[i].powerEntityName.c_str());
jobject powerEntity = env->NewObject(class_PE, method_PE_init);
env->SetIntField(powerEntity, field_PE_id, infos[i].powerEntityId);
env->SetObjectField(powerEntity, field_PE_name, name);
env->SetObjectArrayElement(powerEntityArray, i, powerEntity);
env->DeleteLocalRef(name);
env->DeleteLocalRef(powerEntity);
}
}
});
@@ -159,47 +156,44 @@ static jobjectArray nativeGetPowerEntityInfo(JNIEnv *env, jclass clazz) {
return nullptr;
}
ret = gPowerStatsHalV1_0_ptr->getPowerEntityStateInfo(
{}, [&env, &powerEntityInfoArray](auto infos, auto status) {
if (status != Status::SUCCESS) {
ALOGE("Error getting power entity state info");
} else {
for (int i = 0; i < infos.size(); i++) {
jobjectArray stateInfoArray =
env->NewObjectArray(infos[i].states.size(), class_SI, nullptr);
for (int j = 0; j < infos[i].states.size(); j++) {
jstring powerEntityStateName = env->NewStringUTF(
infos[i].states[j].powerEntityStateName.c_str());
jobject stateInfo = env->NewObject(class_SI, method_SI_init);
env->SetIntField(stateInfo, field_SI_stateId,
infos[i].states[j].powerEntityStateId);
env->SetObjectField(stateInfo, field_SI_stateName,
powerEntityStateName);
env->SetObjectArrayElement(stateInfoArray, j, stateInfo);
env->DeleteLocalRef(powerEntityStateName);
env->DeleteLocalRef(stateInfo);
}
ret = gPowerStatsHalV1_0_ptr
->getPowerEntityStateInfo({}, [&env, &powerEntityArray](auto infos, auto status) {
if (status != Status::SUCCESS) {
ALOGE("Error getting power entity state info");
} else {
for (int i = 0; i < infos.size(); i++) {
jobjectArray stateArray =
env->NewObjectArray(infos[i].states.size(), class_S, nullptr);
for (int j = 0; j < infos[i].states.size(); j++) {
jstring name = env->NewStringUTF(
infos[i].states[j].powerEntityStateName.c_str());
jobject state = env->NewObject(class_S, method_S_init);
env->SetIntField(state, field_S_id,
infos[i].states[j].powerEntityStateId);
env->SetObjectField(state, field_S_name, name);
env->SetObjectArrayElement(stateArray, j, state);
env->DeleteLocalRef(name);
env->DeleteLocalRef(state);
}
for (int j = 0; j < env->GetArrayLength(powerEntityInfoArray); j++) {
jobject powerEntityInfo =
env->GetObjectArrayElement(powerEntityInfoArray, j);
if (env->GetIntField(powerEntityInfo, field_PEI_powerEntityId) ==
infos[i].powerEntityId) {
env->SetObjectField(powerEntityInfo, field_PEI_states,
stateInfoArray);
env->SetObjectArrayElement(powerEntityInfoArray, j,
powerEntityInfo);
break;
}
}
}
}
});
for (int j = 0; j < env->GetArrayLength(powerEntityArray); j++) {
jobject powerEntity =
env->GetObjectArrayElement(powerEntityArray, j);
if (env->GetIntField(powerEntity, field_PE_id) ==
infos[i].powerEntityId) {
env->SetObjectField(powerEntity, field_PE_states, stateArray);
env->SetObjectArrayElement(powerEntityArray, j, powerEntity);
break;
}
}
}
}
});
if (!checkResult(ret, __func__)) {
return nullptr;
}
return powerEntityInfoArray;
return powerEntityArray;
}
static jobjectArray nativeGetStateResidency(JNIEnv *env, jclass clazz, jintArray powerEntityIds) {
@@ -233,7 +227,7 @@ static jobjectArray nativeGetStateResidency(JNIEnv *env, jclass clazz, jintArray
nullptr);
for (int j = 0; j < results[i].stateResidencyData.size(); j++) {
jobject stateResidency = env->NewObject(class_SR, method_SR_init);
env->SetIntField(stateResidency, field_SR_stateId,
env->SetIntField(stateResidency, field_SR_id,
results[i].stateResidencyData[j].powerEntityStateId);
env->SetLongField(stateResidency, field_SR_totalTimeInStateMs,
results[i].stateResidencyData[j].totalTimeInStateMs);
@@ -249,7 +243,7 @@ static jobjectArray nativeGetStateResidency(JNIEnv *env, jclass clazz, jintArray
env->DeleteLocalRef(stateResidency);
}
jobject stateResidencyResult = env->NewObject(class_SRR, method_SRR_init);
env->SetIntField(stateResidencyResult, field_SRR_powerEntityId,
env->SetIntField(stateResidencyResult, field_SRR_id,
results[i].powerEntityId);
env->SetObjectField(stateResidencyResult, field_SRR_stateResidencyData,
stateResidencyArray);
@@ -274,21 +268,21 @@ static jobjectArray nativeGetEnergyMeterInfo(JNIEnv *env, jclass clazz) {
return nullptr;
}
jobjectArray channelInfoArray = nullptr;
Return<void> ret = gPowerStatsHalV1_0_ptr->getRailInfo(
[&env, &channelInfoArray](auto railInfo, auto status) {
jobjectArray channelArray = nullptr;
Return<void> ret =
gPowerStatsHalV1_0_ptr->getRailInfo([&env, &channelArray](auto railInfo, auto status) {
if (status != Status::SUCCESS) {
ALOGW("Error getting rail info");
} else {
channelInfoArray = env->NewObjectArray(railInfo.size(), class_CI, nullptr);
channelArray = env->NewObjectArray(railInfo.size(), class_C, nullptr);
for (int i = 0; i < railInfo.size(); i++) {
jstring channelName = env->NewStringUTF(railInfo[i].railName.c_str());
jobject channelInfo = env->NewObject(class_CI, method_CI_init);
env->SetIntField(channelInfo, field_CI_channelId, railInfo[i].index);
env->SetObjectField(channelInfo, field_CI_channelName, channelName);
env->SetObjectArrayElement(channelInfoArray, i, channelInfo);
env->DeleteLocalRef(channelName);
env->DeleteLocalRef(channelInfo);
jstring name = env->NewStringUTF(railInfo[i].railName.c_str());
jobject channel = env->NewObject(class_C, method_C_init);
env->SetIntField(channel, field_C_id, railInfo[i].index);
env->SetObjectField(channel, field_C_name, name);
env->SetObjectArrayElement(channelArray, i, channel);
env->DeleteLocalRef(name);
env->DeleteLocalRef(channel);
}
}
});
@@ -298,7 +292,7 @@ static jobjectArray nativeGetEnergyMeterInfo(JNIEnv *env, jclass clazz) {
return nullptr;
}
return channelInfoArray;
return channelArray;
}
static jobjectArray nativeReadEnergyMeters(JNIEnv *env, jclass clazz, jintArray channelIds) {
@@ -331,8 +325,7 @@ static jobjectArray nativeReadEnergyMeters(JNIEnv *env, jclass clazz, jintArray
for (int i = 0; i < energyData.size(); i++) {
jobject energyMeasurement =
env->NewObject(class_EM, method_EM_init);
env->SetIntField(energyMeasurement,
field_EM_channelId,
env->SetIntField(energyMeasurement, field_EM_id,
energyData[i].index);
env->SetLongField(energyMeasurement,
field_EM_timestampMs,
@@ -360,43 +353,42 @@ static jobjectArray nativeReadEnergyMeters(JNIEnv *env, jclass clazz, jintArray
static jboolean nativeInit(JNIEnv *env, jclass clazz) {
std::lock_guard<std::mutex> lock(gPowerStatsHalMutex);
// ChannelInfo
jclass temp = env->FindClass("android/hardware/power/stats/ChannelInfo");
class_CI = (jclass)env->NewGlobalRef(temp);
method_CI_init = env->GetMethodID(class_CI, "<init>", "()V");
field_CI_channelId = env->GetFieldID(class_CI, "channelId", "I");
field_CI_channelName = env->GetFieldID(class_CI, "channelName", "Ljava/lang/String;");
// Channel
jclass temp = env->FindClass("android/hardware/power/stats/Channel");
class_C = (jclass)env->NewGlobalRef(temp);
method_C_init = env->GetMethodID(class_C, "<init>", "()V");
field_C_id = env->GetFieldID(class_C, "id", "I");
field_C_name = env->GetFieldID(class_C, "name", "Ljava/lang/String;");
// EnergyMeasurement
temp = env->FindClass("android/hardware/power/stats/EnergyMeasurement");
class_EM = (jclass)env->NewGlobalRef(temp);
method_EM_init = env->GetMethodID(class_EM, "<init>", "()V");
field_EM_channelId = env->GetFieldID(class_EM, "channelId", "I");
field_EM_id = env->GetFieldID(class_EM, "id", "I");
field_EM_timestampMs = env->GetFieldID(class_EM, "timestampMs", "J");
field_EM_durationMs = env->GetFieldID(class_EM, "durationMs", "J");
field_EM_energyUWs = env->GetFieldID(class_EM, "energyUWs", "J");
// StateInfo
temp = env->FindClass("android/hardware/power/stats/StateInfo");
class_SI = (jclass)env->NewGlobalRef(temp);
method_SI_init = env->GetMethodID(class_SI, "<init>", "()V");
field_SI_stateId = env->GetFieldID(class_SI, "stateId", "I");
field_SI_stateName = env->GetFieldID(class_SI, "stateName", "Ljava/lang/String;");
// State
temp = env->FindClass("android/hardware/power/stats/State");
class_S = (jclass)env->NewGlobalRef(temp);
method_S_init = env->GetMethodID(class_S, "<init>", "()V");
field_S_id = env->GetFieldID(class_S, "id", "I");
field_S_name = env->GetFieldID(class_S, "name", "Ljava/lang/String;");
// PowerEntityInfo
temp = env->FindClass("android/hardware/power/stats/PowerEntityInfo");
class_PEI = (jclass)env->NewGlobalRef(temp);
method_PEI_init = env->GetMethodID(class_PEI, "<init>", "()V");
field_PEI_powerEntityId = env->GetFieldID(class_PEI, "powerEntityId", "I");
field_PEI_powerEntityName = env->GetFieldID(class_PEI, "powerEntityName", "Ljava/lang/String;");
field_PEI_states =
env->GetFieldID(class_PEI, "states", "[Landroid/hardware/power/stats/StateInfo;");
// PowerEntity
temp = env->FindClass("android/hardware/power/stats/PowerEntity");
class_PE = (jclass)env->NewGlobalRef(temp);
method_PE_init = env->GetMethodID(class_PE, "<init>", "()V");
field_PE_id = env->GetFieldID(class_PE, "id", "I");
field_PE_name = env->GetFieldID(class_PE, "name", "Ljava/lang/String;");
field_PE_states = env->GetFieldID(class_PE, "states", "[Landroid/hardware/power/stats/State;");
// StateResidency
temp = env->FindClass("android/hardware/power/stats/StateResidency");
class_SR = (jclass)env->NewGlobalRef(temp);
method_SR_init = env->GetMethodID(class_SR, "<init>", "()V");
field_SR_stateId = env->GetFieldID(class_SR, "stateId", "I");
field_SR_id = env->GetFieldID(class_SR, "id", "I");
field_SR_totalTimeInStateMs = env->GetFieldID(class_SR, "totalTimeInStateMs", "J");
field_SR_totalStateEntryCount = env->GetFieldID(class_SR, "totalStateEntryCount", "J");
field_SR_lastEntryTimestampMs = env->GetFieldID(class_SR, "lastEntryTimestampMs", "J");
@@ -405,7 +397,7 @@ static jboolean nativeInit(JNIEnv *env, jclass clazz) {
temp = env->FindClass("android/hardware/power/stats/StateResidencyResult");
class_SRR = (jclass)env->NewGlobalRef(temp);
method_SRR_init = env->GetMethodID(class_SRR, "<init>", "()V");
field_SRR_powerEntityId = env->GetFieldID(class_SRR, "powerEntityId", "I");
field_SRR_id = env->GetFieldID(class_SRR, "id", "I");
field_SRR_stateResidencyData =
env->GetFieldID(class_SRR, "stateResidencyData",
"[Landroid/hardware/power/stats/StateResidency;");
@@ -420,11 +412,11 @@ static jboolean nativeInit(JNIEnv *env, jclass clazz) {
static const JNINativeMethod method_table[] = {
{"nativeInit", "()Z", (void *)nativeInit},
{"nativeGetPowerEntityInfo", "()[Landroid/hardware/power/stats/PowerEntityInfo;",
{"nativeGetPowerEntityInfo", "()[Landroid/hardware/power/stats/PowerEntity;",
(void *)nativeGetPowerEntityInfo},
{"nativeGetStateResidency", "([I)[Landroid/hardware/power/stats/StateResidencyResult;",
(void *)nativeGetStateResidency},
{"nativeGetEnergyMeterInfo", "()[Landroid/hardware/power/stats/ChannelInfo;",
{"nativeGetEnergyMeterInfo", "()[Landroid/hardware/power/stats/Channel;",
(void *)nativeGetEnergyMeterInfo},
{"nativeReadEnergyMeters", "([I)[Landroid/hardware/power/stats/EnergyMeasurement;",
(void *)nativeReadEnergyMeters},

View File

@@ -20,11 +20,12 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import android.content.Context;
import android.hardware.power.stats.ChannelInfo;
import android.hardware.power.stats.Channel;
import android.hardware.power.stats.EnergyConsumer;
import android.hardware.power.stats.EnergyConsumerResult;
import android.hardware.power.stats.EnergyMeasurement;
import android.hardware.power.stats.PowerEntityInfo;
import android.hardware.power.stats.StateInfo;
import android.hardware.power.stats.PowerEntity;
import android.hardware.power.stats.State;
import android.hardware.power.stats.StateResidency;
import android.hardware.power.stats.StateResidencyResult;
@@ -32,11 +33,11 @@ import androidx.test.InstrumentationRegistry;
import com.android.server.SystemService;
import com.android.server.powerstats.PowerStatsHALWrapper.IPowerStatsHALWrapper;
import com.android.server.powerstats.nano.PowerEntityInfoProto;
import com.android.server.powerstats.nano.PowerEntityProto;
import com.android.server.powerstats.nano.PowerStatsServiceMeterProto;
import com.android.server.powerstats.nano.PowerStatsServiceModelProto;
import com.android.server.powerstats.nano.PowerStatsServiceResidencyProto;
import com.android.server.powerstats.nano.StateInfoProto;
import com.android.server.powerstats.nano.StateProto;
import com.android.server.powerstats.nano.StateResidencyProto;
import com.android.server.powerstats.nano.StateResidencyResultProto;
@@ -68,6 +69,7 @@ public class PowerStatsServiceTest {
private static final String CHANNEL_NAME = "channelname";
private static final String POWER_ENTITY_NAME = "powerentityinfo";
private static final String STATE_NAME = "stateinfo";
private static final String ENERGY_CONSUMER_NAME = "energyconsumer";
private static final int ENERGY_METER_COUNT = 8;
private static final int ENERGY_CONSUMER_COUNT = 2;
private static final int POWER_ENTITY_COUNT = 3;
@@ -142,20 +144,20 @@ public class PowerStatsServiceTest {
public static final class TestPowerStatsHALWrapper implements IPowerStatsHALWrapper {
@Override
public PowerEntityInfo[] getPowerEntityInfo() {
PowerEntityInfo[] powerEntityInfoList = new PowerEntityInfo[POWER_ENTITY_COUNT];
for (int i = 0; i < powerEntityInfoList.length; i++) {
powerEntityInfoList[i] = new PowerEntityInfo();
powerEntityInfoList[i].powerEntityId = i;
powerEntityInfoList[i].powerEntityName = new String(POWER_ENTITY_NAME + i);
powerEntityInfoList[i].states = new StateInfo[STATE_INFO_COUNT];
for (int j = 0; j < powerEntityInfoList[i].states.length; j++) {
powerEntityInfoList[i].states[j] = new StateInfo();
powerEntityInfoList[i].states[j].stateId = j;
powerEntityInfoList[i].states[j].stateName = new String(STATE_NAME + j);
public PowerEntity[] getPowerEntityInfo() {
PowerEntity[] powerEntityList = new PowerEntity[POWER_ENTITY_COUNT];
for (int i = 0; i < powerEntityList.length; i++) {
powerEntityList[i] = new PowerEntity();
powerEntityList[i].id = i;
powerEntityList[i].name = new String(POWER_ENTITY_NAME + i);
powerEntityList[i].states = new State[STATE_INFO_COUNT];
for (int j = 0; j < powerEntityList[i].states.length; j++) {
powerEntityList[i].states[j] = new State();
powerEntityList[i].states[j].id = j;
powerEntityList[i].states[j].name = new String(STATE_NAME + j);
}
}
return powerEntityInfoList;
return powerEntityList;
}
@Override
@@ -164,12 +166,12 @@ public class PowerStatsServiceTest {
new StateResidencyResult[POWER_ENTITY_COUNT];
for (int i = 0; i < stateResidencyResultList.length; i++) {
stateResidencyResultList[i] = new StateResidencyResult();
stateResidencyResultList[i].powerEntityId = i;
stateResidencyResultList[i].id = i;
stateResidencyResultList[i].stateResidencyData =
new StateResidency[STATE_RESIDENCY_COUNT];
for (int j = 0; j < stateResidencyResultList[i].stateResidencyData.length; j++) {
stateResidencyResultList[i].stateResidencyData[j] = new StateResidency();
stateResidencyResultList[i].stateResidencyData[j].stateId = j;
stateResidencyResultList[i].stateResidencyData[j].id = j;
stateResidencyResultList[i].stateResidencyData[j].totalTimeInStateMs = j;
stateResidencyResultList[i].stateResidencyData[j].totalStateEntryCount = j;
stateResidencyResultList[i].stateResidencyData[j].lastEntryTimestampMs = j;
@@ -180,12 +182,16 @@ public class PowerStatsServiceTest {
}
@Override
public int[] getEnergyConsumerInfo() {
int[] energyConsumerInfoList = new int[ENERGY_CONSUMER_COUNT];
for (int i = 0; i < energyConsumerInfoList.length; i++) {
energyConsumerInfoList[i] = i;
public EnergyConsumer[] getEnergyConsumerInfo() {
EnergyConsumer[] energyConsumerList = new EnergyConsumer[ENERGY_CONSUMER_COUNT];
for (int i = 0; i < energyConsumerList.length; i++) {
energyConsumerList[i] = new EnergyConsumer();
energyConsumerList[i].id = i;
energyConsumerList[i].ordinal = i;
energyConsumerList[i].type = (byte) i;
energyConsumerList[i].name = new String(ENERGY_CONSUMER_NAME + i);
}
return energyConsumerInfoList;
return energyConsumerList;
}
@Override
@@ -194,7 +200,7 @@ public class PowerStatsServiceTest {
new EnergyConsumerResult[ENERGY_CONSUMER_COUNT];
for (int i = 0; i < energyConsumedList.length; i++) {
energyConsumedList[i] = new EnergyConsumerResult();
energyConsumedList[i].energyConsumerId = i;
energyConsumedList[i].id = i;
energyConsumedList[i].timestampMs = i;
energyConsumedList[i].energyUWs = i;
}
@@ -202,14 +208,14 @@ public class PowerStatsServiceTest {
}
@Override
public ChannelInfo[] getEnergyMeterInfo() {
ChannelInfo[] energyMeterInfoList = new ChannelInfo[ENERGY_METER_COUNT];
for (int i = 0; i < energyMeterInfoList.length; i++) {
energyMeterInfoList[i] = new ChannelInfo();
energyMeterInfoList[i].channelId = i;
energyMeterInfoList[i].channelName = new String(CHANNEL_NAME + i);
public Channel[] getEnergyMeterInfo() {
Channel[] energyMeterList = new Channel[ENERGY_METER_COUNT];
for (int i = 0; i < energyMeterList.length; i++) {
energyMeterList[i] = new Channel();
energyMeterList[i].id = i;
energyMeterList[i].name = new String(CHANNEL_NAME + i);
}
return energyMeterInfoList;
return energyMeterList;
}
@Override
@@ -217,8 +223,9 @@ public class PowerStatsServiceTest {
EnergyMeasurement[] energyMeasurementList = new EnergyMeasurement[ENERGY_METER_COUNT];
for (int i = 0; i < energyMeasurementList.length; i++) {
energyMeasurementList[i] = new EnergyMeasurement();
energyMeasurementList[i].channelId = i;
energyMeasurementList[i].id = i;
energyMeasurementList[i].timestampMs = i;
energyMeasurementList[i].durationMs = i;
energyMeasurementList[i].energyUWs = i;
}
return energyMeasurementList;
@@ -260,18 +267,19 @@ public class PowerStatsServiceTest {
// Parse the incident data into a PowerStatsServiceMeterProto object.
PowerStatsServiceMeterProto pssProto = PowerStatsServiceMeterProto.parseFrom(fileContent);
// Validate the channelInfo array matches what was written to on-device storage.
assertTrue(pssProto.channelInfo.length == ENERGY_METER_COUNT);
for (int i = 0; i < pssProto.channelInfo.length; i++) {
assertTrue(pssProto.channelInfo[i].channelId == i);
assertTrue(pssProto.channelInfo[i].channelName.equals(CHANNEL_NAME + i));
// Validate the channel array matches what was written to on-device storage.
assertTrue(pssProto.channel.length == ENERGY_METER_COUNT);
for (int i = 0; i < pssProto.channel.length; i++) {
assertTrue(pssProto.channel[i].id == i);
assertTrue(pssProto.channel[i].name.equals(CHANNEL_NAME + i));
}
// Validate the energyMeasurement array matches what was written to on-device storage.
assertTrue(pssProto.energyMeasurement.length == ENERGY_METER_COUNT);
for (int i = 0; i < pssProto.energyMeasurement.length; i++) {
assertTrue(pssProto.energyMeasurement[i].channelId == i);
assertTrue(pssProto.energyMeasurement[i].id == i);
assertTrue(pssProto.energyMeasurement[i].timestampMs == i);
assertTrue(pssProto.energyMeasurement[i].durationMs == i);
assertTrue(pssProto.energyMeasurement[i].energyUws == i);
}
}
@@ -301,16 +309,16 @@ public class PowerStatsServiceTest {
// Parse the incident data into a PowerStatsServiceModelProto object.
PowerStatsServiceModelProto pssProto = PowerStatsServiceModelProto.parseFrom(fileContent);
// Validate the energyConsumerId array matches what was written to on-device storage.
assertTrue(pssProto.energyConsumerId.length == ENERGY_CONSUMER_COUNT);
for (int i = 0; i < pssProto.energyConsumerId.length; i++) {
assertTrue(pssProto.energyConsumerId[i].energyConsumerId == i);
// Validate the energyConsumer array matches what was written to on-device storage.
assertTrue(pssProto.energyConsumer.length == ENERGY_CONSUMER_COUNT);
for (int i = 0; i < pssProto.energyConsumer.length; i++) {
assertTrue(pssProto.energyConsumer[i].id == i);
}
// Validate the energyConsumerResult array matches what was written to on-device storage.
assertTrue(pssProto.energyConsumerResult.length == ENERGY_CONSUMER_COUNT);
for (int i = 0; i < pssProto.energyConsumerResult.length; i++) {
assertTrue(pssProto.energyConsumerResult[i].energyConsumerId == i);
assertTrue(pssProto.energyConsumerResult[i].id == i);
assertTrue(pssProto.energyConsumerResult[i].timestampMs == i);
assertTrue(pssProto.energyConsumerResult[i].energyUws == i);
}
@@ -342,16 +350,16 @@ public class PowerStatsServiceTest {
PowerStatsServiceResidencyProto pssProto =
PowerStatsServiceResidencyProto.parseFrom(fileContent);
// Validate the powerEntityInfo array matches what was written to on-device storage.
assertTrue(pssProto.powerEntityInfo.length == POWER_ENTITY_COUNT);
for (int i = 0; i < pssProto.powerEntityInfo.length; i++) {
PowerEntityInfoProto powerEntityInfo = pssProto.powerEntityInfo[i];
assertTrue(powerEntityInfo.powerEntityId == i);
assertTrue(powerEntityInfo.powerEntityName.equals(POWER_ENTITY_NAME + i));
for (int j = 0; j < powerEntityInfo.states.length; j++) {
StateInfoProto stateInfo = powerEntityInfo.states[j];
assertTrue(stateInfo.stateId == j);
assertTrue(stateInfo.stateName.equals(STATE_NAME + j));
// Validate the powerEntity array matches what was written to on-device storage.
assertTrue(pssProto.powerEntity.length == POWER_ENTITY_COUNT);
for (int i = 0; i < pssProto.powerEntity.length; i++) {
PowerEntityProto powerEntity = pssProto.powerEntity[i];
assertTrue(powerEntity.id == i);
assertTrue(powerEntity.name.equals(POWER_ENTITY_NAME + i));
for (int j = 0; j < powerEntity.states.length; j++) {
StateProto state = powerEntity.states[j];
assertTrue(state.id == j);
assertTrue(state.name.equals(STATE_NAME + j));
}
}
@@ -359,11 +367,11 @@ public class PowerStatsServiceTest {
assertTrue(pssProto.stateResidencyResult.length == POWER_ENTITY_COUNT);
for (int i = 0; i < pssProto.stateResidencyResult.length; i++) {
StateResidencyResultProto stateResidencyResult = pssProto.stateResidencyResult[i];
assertTrue(stateResidencyResult.powerEntityId == i);
assertTrue(stateResidencyResult.id == i);
assertTrue(stateResidencyResult.stateResidencyData.length == STATE_RESIDENCY_COUNT);
for (int j = 0; j < stateResidencyResult.stateResidencyData.length; j++) {
StateResidencyProto stateResidency = stateResidencyResult.stateResidencyData[j];
assertTrue(stateResidency.stateId == j);
assertTrue(stateResidency.id == j);
assertTrue(stateResidency.totalTimeInStateMs == j);
assertTrue(stateResidency.totalStateEntryCount == j);
assertTrue(stateResidency.lastEntryTimestampMs == j);
@@ -400,12 +408,12 @@ public class PowerStatsServiceTest {
// Parse the incident data into a PowerStatsServiceMeterProto object.
PowerStatsServiceMeterProto pssProto = PowerStatsServiceMeterProto.parseFrom(fileContent);
// Valid channelInfo data is written to the incident report in the call to
// Valid channel data is written to the incident report in the call to
// mPowerStatsLogger.writeMeterDataToFile().
assertTrue(pssProto.channelInfo.length == ENERGY_METER_COUNT);
for (int i = 0; i < pssProto.channelInfo.length; i++) {
assertTrue(pssProto.channelInfo[i].channelId == i);
assertTrue(pssProto.channelInfo[i].channelName.equals(CHANNEL_NAME + i));
assertTrue(pssProto.channel.length == ENERGY_METER_COUNT);
for (int i = 0; i < pssProto.channel.length; i++) {
assertTrue(pssProto.channel[i].id == i);
assertTrue(pssProto.channel[i].name.equals(CHANNEL_NAME + i));
}
// No energyMeasurements should be written to the incident report since it
@@ -442,11 +450,11 @@ public class PowerStatsServiceTest {
// Parse the incident data into a PowerStatsServiceModelProto object.
PowerStatsServiceModelProto pssProto = PowerStatsServiceModelProto.parseFrom(fileContent);
// Valid energyConsumerId data is written to the incident report in the call to
// Valid energyConsumer data is written to the incident report in the call to
// mPowerStatsLogger.writeModelDataToFile().
assertTrue(pssProto.energyConsumerId.length == ENERGY_CONSUMER_COUNT);
for (int i = 0; i < pssProto.energyConsumerId.length; i++) {
assertTrue(pssProto.energyConsumerId[i].energyConsumerId == i);
assertTrue(pssProto.energyConsumer.length == ENERGY_CONSUMER_COUNT);
for (int i = 0; i < pssProto.energyConsumer.length; i++) {
assertTrue(pssProto.energyConsumer[i].id == i);
}
// No energyConsumerResults should be written to the incident report since it
@@ -484,17 +492,17 @@ public class PowerStatsServiceTest {
PowerStatsServiceResidencyProto pssProto =
PowerStatsServiceResidencyProto.parseFrom(fileContent);
// Valid powerEntityInfo data is written to the incident report in the call to
// Valid powerEntity data is written to the incident report in the call to
// mPowerStatsLogger.writeResidencyDataToFile().
assertTrue(pssProto.powerEntityInfo.length == POWER_ENTITY_COUNT);
for (int i = 0; i < pssProto.powerEntityInfo.length; i++) {
PowerEntityInfoProto powerEntityInfo = pssProto.powerEntityInfo[i];
assertTrue(powerEntityInfo.powerEntityId == i);
assertTrue(powerEntityInfo.powerEntityName.equals(POWER_ENTITY_NAME + i));
for (int j = 0; j < powerEntityInfo.states.length; j++) {
StateInfoProto stateInfo = powerEntityInfo.states[j];
assertTrue(stateInfo.stateId == j);
assertTrue(stateInfo.stateName.equals(STATE_NAME + j));
assertTrue(pssProto.powerEntity.length == POWER_ENTITY_COUNT);
for (int i = 0; i < pssProto.powerEntity.length; i++) {
PowerEntityProto powerEntity = pssProto.powerEntity[i];
assertTrue(powerEntity.id == i);
assertTrue(powerEntity.name.equals(POWER_ENTITY_NAME + i));
for (int j = 0; j < powerEntity.states.length; j++) {
StateProto state = powerEntity.states[j];
assertTrue(state.id == j);
assertTrue(state.name.equals(STATE_NAME + j));
}
}
@@ -533,12 +541,12 @@ public class PowerStatsServiceTest {
// Parse the incident data into a PowerStatsServiceMeterProto object.
PowerStatsServiceMeterProto pssProto = PowerStatsServiceMeterProto.parseFrom(fileContent);
// Valid channelInfo data is written to the incident report in the call to
// Valid channel data is written to the incident report in the call to
// mPowerStatsLogger.writeMeterDataToFile().
assertTrue(pssProto.channelInfo.length == ENERGY_METER_COUNT);
for (int i = 0; i < pssProto.channelInfo.length; i++) {
assertTrue(pssProto.channelInfo[i].channelId == i);
assertTrue(pssProto.channelInfo[i].channelName.equals(CHANNEL_NAME + i));
assertTrue(pssProto.channel.length == ENERGY_METER_COUNT);
for (int i = 0; i < pssProto.channel.length; i++) {
assertTrue(pssProto.channel[i].id == i);
assertTrue(pssProto.channel[i].name.equals(CHANNEL_NAME + i));
}
// No energyMeasurements should be written to the incident report since the
@@ -576,11 +584,11 @@ public class PowerStatsServiceTest {
// Parse the incident data into a PowerStatsServiceModelProto object.
PowerStatsServiceModelProto pssProto = PowerStatsServiceModelProto.parseFrom(fileContent);
// Valid energyConsumerId data is written to the incident report in the call to
// Valid energyConsumer data is written to the incident report in the call to
// mPowerStatsLogger.writeModelDataToFile().
assertTrue(pssProto.energyConsumerId.length == ENERGY_CONSUMER_COUNT);
for (int i = 0; i < pssProto.energyConsumerId.length; i++) {
assertTrue(pssProto.energyConsumerId[i].energyConsumerId == i);
assertTrue(pssProto.energyConsumer.length == ENERGY_CONSUMER_COUNT);
for (int i = 0; i < pssProto.energyConsumer.length; i++) {
assertTrue(pssProto.energyConsumer[i].id == i);
}
// No energyConsumerResults should be written to the incident report since the
@@ -619,17 +627,17 @@ public class PowerStatsServiceTest {
PowerStatsServiceResidencyProto pssProto =
PowerStatsServiceResidencyProto.parseFrom(fileContent);
// Valid powerEntityInfo data is written to the incident report in the call to
// Valid powerEntity data is written to the incident report in the call to
// mPowerStatsLogger.writeResidencyDataToFile().
assertTrue(pssProto.powerEntityInfo.length == POWER_ENTITY_COUNT);
for (int i = 0; i < pssProto.powerEntityInfo.length; i++) {
PowerEntityInfoProto powerEntityInfo = pssProto.powerEntityInfo[i];
assertTrue(powerEntityInfo.powerEntityId == i);
assertTrue(powerEntityInfo.powerEntityName.equals(POWER_ENTITY_NAME + i));
for (int j = 0; j < powerEntityInfo.states.length; j++) {
StateInfoProto stateInfo = powerEntityInfo.states[j];
assertTrue(stateInfo.stateId == j);
assertTrue(stateInfo.stateName.equals(STATE_NAME + j));
assertTrue(pssProto.powerEntity.length == POWER_ENTITY_COUNT);
for (int i = 0; i < pssProto.powerEntity.length; i++) {
PowerEntityProto powerEntity = pssProto.powerEntity[i];
assertTrue(powerEntity.id == i);
assertTrue(powerEntity.name.equals(POWER_ENTITY_NAME + i));
for (int j = 0; j < powerEntity.states.length; j++) {
StateProto state = powerEntity.states[j];
assertTrue(state.id == j);
assertTrue(state.name.equals(STATE_NAME + j));
}
}

View File

@@ -27,16 +27,16 @@ import java.io.IOException;
public class PowerStatsServiceProtoParser {
private static void printEnergyMeterInfo(PowerStatsServiceMeterProto proto) {
String csvHeader = new String();
for (int i = 0; i < proto.getChannelInfoCount(); i++) {
ChannelInfoProto energyMeterInfo = proto.getChannelInfo(i);
csvHeader += "Index,Timestamp," + energyMeterInfo.getChannelId()
+ "/" + energyMeterInfo.getChannelName() + ",";
for (int i = 0; i < proto.getChannelCount(); i++) {
ChannelProto energyMeterInfo = proto.getChannel(i);
csvHeader += "Index,Timestamp,Duration," + energyMeterInfo.getId()
+ "/" + energyMeterInfo.getName() + ",";
}
System.out.println(csvHeader);
}
private static void printEnergyMeasurements(PowerStatsServiceMeterProto proto) {
int energyMeterInfoCount = proto.getChannelInfoCount();
int energyMeterInfoCount = proto.getChannelCount();
if (energyMeterInfoCount > 0) {
int energyMeasurementCount = proto.getEnergyMeasurementCount();
@@ -47,8 +47,9 @@ public class PowerStatsServiceProtoParser {
for (int j = 0; j < energyMeterInfoCount; j++) {
EnergyMeasurementProto energyMeasurement =
proto.getEnergyMeasurement(i * energyMeterInfoCount + j);
csvRow += energyMeasurement.getChannelId() + ","
csvRow += energyMeasurement.getId() + ","
+ energyMeasurement.getTimestampMs() + ","
+ energyMeasurement.getDurationMs() + ","
+ energyMeasurement.getEnergyUws() + ",";
}
System.out.println(csvRow);
@@ -58,47 +59,49 @@ public class PowerStatsServiceProtoParser {
}
}
private static void printEnergyConsumerId(PowerStatsServiceModelProto proto) {
private static void printEnergyConsumer(PowerStatsServiceModelProto proto) {
String csvHeader = new String();
for (int i = 0; i < proto.getEnergyConsumerIdCount(); i++) {
EnergyConsumerIdProto energyConsumerId = proto.getEnergyConsumerId(i);
csvHeader += "Index,Timestamp," + energyConsumerId.getEnergyConsumerId() + ",";
for (int i = 0; i < proto.getEnergyConsumerCount(); i++) {
EnergyConsumerProto energyConsumer = proto.getEnergyConsumer(i);
csvHeader += "Index,Timestamp," + energyConsumer.getId() + "/"
+ energyConsumer.getOrdinal() + "/"
+ energyConsumer.getType() + "/"
+ energyConsumer.getName() + ",";
}
System.out.println(csvHeader);
}
private static void printEnergyConsumerResults(PowerStatsServiceModelProto proto) {
int energyConsumerIdCount = proto.getEnergyConsumerIdCount();
int energyConsumerCount = proto.getEnergyConsumerCount();
if (energyConsumerIdCount > 0) {
if (energyConsumerCount > 0) {
int energyConsumerResultCount = proto.getEnergyConsumerResultCount();
int energyConsumerResultSetCount = energyConsumerResultCount / energyConsumerIdCount;
int energyConsumerResultSetCount = energyConsumerResultCount / energyConsumerCount;
for (int i = 0; i < energyConsumerResultSetCount; i++) {
String csvRow = new String();
for (int j = 0; j < energyConsumerIdCount; j++) {
for (int j = 0; j < energyConsumerCount; j++) {
EnergyConsumerResultProto energyConsumerResult =
proto.getEnergyConsumerResult(i * energyConsumerIdCount + j);
csvRow += energyConsumerResult.getEnergyConsumerId() + ","
proto.getEnergyConsumerResult(i * energyConsumerCount + j);
csvRow += energyConsumerResult.getId() + ","
+ energyConsumerResult.getTimestampMs() + ","
+ energyConsumerResult.getEnergyUws() + ",";
}
System.out.println(csvRow);
}
} else {
System.out.println("Error: energyConsumerIdCount is zero");
System.out.println("Error: energyConsumerCount is zero");
}
}
private static void printPowerEntityInfo(PowerStatsServiceResidencyProto proto) {
String csvHeader = new String();
for (int i = 0; i < proto.getPowerEntityInfoCount(); i++) {
PowerEntityInfoProto powerEntityInfo = proto.getPowerEntityInfo(i);
csvHeader += powerEntityInfo.getPowerEntityId() + ","
+ powerEntityInfo.getPowerEntityName() + ",";
for (int j = 0; j < powerEntityInfo.getStatesCount(); j++) {
StateInfoProto stateInfo = powerEntityInfo.getStates(j);
csvHeader += stateInfo.getStateId() + "," + stateInfo.getStateName() + ",";
for (int i = 0; i < proto.getPowerEntityCount(); i++) {
PowerEntityProto powerEntity = proto.getPowerEntity(i);
csvHeader += powerEntity.getId() + "," + powerEntity.getName() + ",";
for (int j = 0; j < powerEntity.getStatesCount(); j++) {
StateProto state = powerEntity.getStates(j);
csvHeader += state.getId() + "," + state.getName() + ",";
}
}
System.out.println(csvHeader);
@@ -109,11 +112,11 @@ public class PowerStatsServiceProtoParser {
String csvRow = new String();
StateResidencyResultProto stateResidencyResult = proto.getStateResidencyResult(i);
csvRow += stateResidencyResult.getPowerEntityId() + ",";
csvRow += stateResidencyResult.getId() + ",";
for (int j = 0; j < stateResidencyResult.getStateResidencyDataCount(); j++) {
StateResidencyProto stateResidency = stateResidencyResult.getStateResidencyData(j);
csvRow += stateResidency.getStateId() + ","
csvRow += stateResidency.getId() + ","
+ stateResidency.getTotalTimeInStateMs() + ","
+ stateResidency.getTotalStateEntryCount() + ","
+ stateResidency.getLastEntryTimestampMs() + ",";
@@ -142,7 +145,7 @@ public class PowerStatsServiceProtoParser {
if (irModelProto.hasIncidentReport()) {
PowerStatsServiceModelProto pssModelProto = irModelProto.getIncidentReport();
printEnergyConsumerId(pssModelProto);
printEnergyConsumer(pssModelProto);
printEnergyConsumerResults(pssModelProto);
} else {
System.out.println("Model incident report not found. Exiting.");