diff options
author | Mat Bevilacqua <matbev@google.com> | 2021-01-20 17:45:20 -0800 |
---|---|---|
committer | Mat Bevilacqua <matbev@google.com> | 2021-01-25 17:09:05 -0800 |
commit | 6058dc21902ed557c2711405abdeb16bada3ab32 (patch) | |
tree | eafff875bdea0491296e0298e2acc63f1b4e992e | |
parent | 752b1e59c99f00c4f30e826fcbbd6f6dca8fe892 (diff) |
Update to new version of PowerStats HAL 2.0
Bug: 178048034
Test: atest FrameworksServicesTests:PowerStatsServiceTest
Change-Id: I714d2037a3576a3f6f89211d64ccf88cefa51abf
10 files changed, 451 insertions, 411 deletions
diff --git a/core/proto/android/server/powerstatsservice.proto b/core/proto/android/server/powerstatsservice.proto index 30c427433639..ec9bc112c6fb 100644 --- a/core/proto/android/server/powerstatsservice.proto +++ b/core/proto/android/server/powerstatsservice.proto @@ -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; + } diff --git a/services/core/java/android/power/PowerStatsInternal.java b/services/core/java/android/power/PowerStatsInternal.java index 9c908c386efd..753b5b314bc9 100644 --- a/services/core/java/android/power/PowerStatsInternal.java +++ b/services/core/java/android/power/PowerStatsInternal.java @@ -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); } diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java index a3fac0510f20..666695e228e0 100644 --- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java +++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java @@ -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; } diff --git a/services/core/java/com/android/server/powerstats/PowerStatsHALWrapper.java b/services/core/java/com/android/server/powerstats/PowerStatsHALWrapper.java index 79c039291f57..3e39b4bbe1d0 100644 --- a/services/core/java/com/android/server/powerstats/PowerStatsHALWrapper.java +++ b/services/core/java/com/android/server/powerstats/PowerStatsHALWrapper.java @@ -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(); } diff --git a/services/core/java/com/android/server/powerstats/PowerStatsLogger.java b/services/core/java/com/android/server/powerstats/PowerStatsLogger.java index 9ee34298a145..78a227ee170e 100644 --- a/services/core/java/com/android/server/powerstats/PowerStatsLogger.java +++ b/services/core/java/com/android/server/powerstats/PowerStatsLogger.java @@ -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 diff --git a/services/core/java/com/android/server/powerstats/PowerStatsService.java b/services/core/java/com/android/server/powerstats/PowerStatsService.java index 64bddcdd8fe1..b7e991cbea89 100644 --- a/services/core/java/com/android/server/powerstats/PowerStatsService.java +++ b/services/core/java/com/android/server/powerstats/PowerStatsService.java @@ -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); } } } diff --git a/services/core/java/com/android/server/powerstats/ProtoStreamUtils.java b/services/core/java/com/android/server/powerstats/ProtoStreamUtils.java index ab9b3e0c41cd..e71b962baef7 100644 --- a/services/core/java/com/android/server/powerstats/ProtoStreamUtils.java +++ b/services/core/java/com/android/server/powerstats/ProtoStreamUtils.java @@ -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; - - 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; + if (powerEntity == null) return; + + 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; - - for (int i = 0; i < energyConsumerId.length; i++) { - long token = pos.start(PowerStatsServiceModelProto.ENERGY_CONSUMER_ID); - pos.write(EnergyConsumerIdProto.ENERGY_CONSUMER_ID, energyConsumerId[i]); + static class EnergyConsumerUtils { + public static void packProtoMessage(EnergyConsumer[] energyConsumer, + ProtoOutputStream pos) { + if (energyConsumer == null) return; + + 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); } diff --git a/services/core/jni/com_android_server_powerstats_PowerStatsService.cpp b/services/core/jni/com_android_server_powerstats_PowerStatsService.cpp index f5b851f7aea5..ec2549c5991c 100644 --- a/services/core/jni/com_android_server_powerstats_PowerStatsService.cpp +++ b/services/core/jni/com_android_server_powerstats_PowerStatsService.cpp @@ -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); - } - - 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; - } - } - } - } - }); + 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(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;"); - - // 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;"); + // 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;"); + + // 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}, diff --git a/services/tests/servicestests/src/com/android/server/powerstats/PowerStatsServiceTest.java b/services/tests/servicestests/src/com/android/server/powerstats/PowerStatsServiceTest.java index a5039fb5fecd..b6ae8555b02e 100644 --- a/services/tests/servicestests/src/com/android/server/powerstats/PowerStatsServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/powerstats/PowerStatsServiceTest.java @@ -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)); } } diff --git a/tools/powerstats/PowerStatsServiceProtoParser.java b/tools/powerstats/PowerStatsServiceProtoParser.java index 97a2a402b537..e4135b5584e4 100644 --- a/tools/powerstats/PowerStatsServiceProtoParser.java +++ b/tools/powerstats/PowerStatsServiceProtoParser.java @@ -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."); |