Home | History | Annotate | Download | only in os
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.internal.os;
     17 
     18 import android.util.ArrayMap;
     19 
     20 import java.util.Map;
     21 
     22 /**
     23  * Container for Resource Power Manager states and their data.
     24  * Values can be populated by the BatteryStatsService.fillLowPowerStats jni function.
     25  */
     26 public final class RpmStats {
     27     public Map<String, PowerStatePlatformSleepState> mPlatformLowPowerStats = new ArrayMap<>();
     28     public Map<String, PowerStateSubsystem> mSubsystemLowPowerStats = new ArrayMap<>();
     29 
     30     /**
     31      * Finds the PowerStatePlatformSleepState with the given name (creating it if it doesn't exist),
     32      * updates its timeMs and count, and returns it.
     33      */
     34     @SuppressWarnings("unused")
     35     public PowerStatePlatformSleepState getAndUpdatePlatformState(
     36             String name, long timeMs, int count) {
     37 
     38         PowerStatePlatformSleepState e = mPlatformLowPowerStats.get(name);
     39         if (e == null) {
     40             e = new PowerStatePlatformSleepState();
     41             mPlatformLowPowerStats.put(name, e);
     42         }
     43         e.mTimeMs = timeMs;
     44         e.mCount = count;
     45         return e;
     46     }
     47 
     48     /**
     49      * Returns the PowerStateSubsystem with the given name (creating it if it doesn't exist).
     50      */
     51     public PowerStateSubsystem getSubsystem(String name) {
     52         PowerStateSubsystem e = mSubsystemLowPowerStats.get(name);
     53         if (e == null) {
     54             e = new PowerStateSubsystem();
     55             mSubsystemLowPowerStats.put(name, e);
     56         }
     57         return e;
     58     }
     59 
     60     /** Represents a subsystem state or a platform voter. */
     61     public static class PowerStateElement {
     62         public long mTimeMs; // totalTimeInMsecVotedForSinceBoot
     63         public int mCount; // totalNumberOfTimesVotedSinceBoot
     64 
     65         private PowerStateElement(long timeMs, int count) {
     66             this.mTimeMs = timeMs;
     67             this.mCount = count;
     68         }
     69     }
     70 
     71     /** Represents a PowerStatePlatformSleepState, per hardware/interfaces/power/1.0/types.hal */
     72     public static class PowerStatePlatformSleepState {
     73         public long mTimeMs; // residencyInMsecSinceBoot
     74         public int mCount; // totalTransitions
     75         public Map<String, PowerStateElement> mVoters = new ArrayMap<>(); // voters for this platform-level sleep state
     76 
     77         /**
     78          * Updates (creating if necessary) the voter with the given name, with the given timeMs and
     79          * count.
     80          */
     81         @SuppressWarnings("unused")
     82         public void putVoter(String name, long timeMs, int count) {
     83             PowerStateElement e = mVoters.get(name);
     84             if (e == null) {
     85                 mVoters.put(name, new PowerStateElement(timeMs, count));
     86             } else {
     87                 e.mTimeMs = timeMs;
     88                 e.mCount = count;
     89             }
     90         }
     91     }
     92 
     93     /** Represents a PowerStateSubsystem, per hardware/interfaces/power/1.1/types.hal */
     94     public static class PowerStateSubsystem {
     95         public Map<String, PowerStateElement> mStates = new ArrayMap<>(); // sleep states supported by this susbsystem
     96 
     97         /**
     98          * Updates (creating if necessary) the subsystem state with the given name, with the given
     99          * timeMs and count.
    100          */
    101         @SuppressWarnings("unused")
    102         public void putState(String name, long timeMs, int count) {
    103             PowerStateElement e = mStates.get(name);
    104             if (e == null) {
    105                 mStates.put(name, new PowerStateElement(timeMs, count));
    106             } else {
    107                 e.mTimeMs = timeMs;
    108                 e.mCount = count;
    109             }
    110         }
    111     }
    112 }
    113