1 /*
2  * Copyright (C) 2014 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 
17 package android.net.wifi;
18 
19 import android.os.Parcel;
20 import android.os.Parcelable;
21 
22 import java.util.Arrays;
23 
24 /**
25  * Record of energy and activity information from controller and
26  * underlying wifi stack state. Timestamp the record with elapsed
27  * real-time.
28  * @hide
29  */
30 public final class WifiActivityEnergyInfo implements Parcelable {
31     /**
32      * @hide
33      */
34     public long mTimestamp;
35 
36     /**
37      * @hide
38      */
39     public int mStackState;
40 
41     /**
42      * @hide
43      */
44     public long mControllerTxTimeMs;
45 
46     /**
47      * @hide
48      */
49     public long[] mControllerTxTimePerLevelMs;
50 
51     /**
52      * @hide
53      */
54     public long mControllerRxTimeMs;
55 
56     /**
57      * @hide
58      */
59     public long mControllerIdleTimeMs;
60 
61     /**
62      * @hide
63      */
64     public long mControllerEnergyUsed;
65 
66     public static final int STACK_STATE_INVALID = 0;
67     public static final int STACK_STATE_STATE_ACTIVE = 1;
68     public static final int STACK_STATE_STATE_SCANNING = 2;
69     public static final int STACK_STATE_STATE_IDLE = 3;
70 
WifiActivityEnergyInfo(long timestamp, int stackState, long txTime, long[] txTimePerLevel, long rxTime, long idleTime, long energyUsed)71     public WifiActivityEnergyInfo(long timestamp, int stackState,
72                                   long txTime, long[] txTimePerLevel, long rxTime, long idleTime,
73                                   long energyUsed) {
74         mTimestamp = timestamp;
75         mStackState = stackState;
76         mControllerTxTimeMs = txTime;
77         mControllerTxTimePerLevelMs = txTimePerLevel;
78         mControllerRxTimeMs = rxTime;
79         mControllerIdleTimeMs = idleTime;
80         mControllerEnergyUsed = energyUsed;
81     }
82 
83     @Override
toString()84     public String toString() {
85         return "WifiActivityEnergyInfo{"
86             + " timestamp=" + mTimestamp
87             + " mStackState=" + mStackState
88             + " mControllerTxTimeMs=" + mControllerTxTimeMs
89             + " mControllerTxTimePerLevelMs=" + Arrays.toString(mControllerTxTimePerLevelMs)
90             + " mControllerRxTimeMs=" + mControllerRxTimeMs
91             + " mControllerIdleTimeMs=" + mControllerIdleTimeMs
92             + " mControllerEnergyUsed=" + mControllerEnergyUsed
93             + " }";
94     }
95 
96     public static final Parcelable.Creator<WifiActivityEnergyInfo> CREATOR =
97             new Parcelable.Creator<WifiActivityEnergyInfo>() {
98         public WifiActivityEnergyInfo createFromParcel(Parcel in) {
99             long timestamp = in.readLong();
100             int stackState = in.readInt();
101             long txTime = in.readLong();
102             long[] txTimePerLevel = in.createLongArray();
103             long rxTime = in.readLong();
104             long idleTime = in.readLong();
105             long energyUsed = in.readLong();
106             return new WifiActivityEnergyInfo(timestamp, stackState,
107                     txTime, txTimePerLevel, rxTime, idleTime, energyUsed);
108         }
109         public WifiActivityEnergyInfo[] newArray(int size) {
110             return new WifiActivityEnergyInfo[size];
111         }
112     };
113 
writeToParcel(Parcel out, int flags)114     public void writeToParcel(Parcel out, int flags) {
115         out.writeLong(mTimestamp);
116         out.writeInt(mStackState);
117         out.writeLong(mControllerTxTimeMs);
118         out.writeLongArray(mControllerTxTimePerLevelMs);
119         out.writeLong(mControllerRxTimeMs);
120         out.writeLong(mControllerIdleTimeMs);
121         out.writeLong(mControllerEnergyUsed);
122     }
123 
describeContents()124     public int describeContents() {
125         return 0;
126     }
127 
128     /**
129      * @return bt stack reported state
130      */
getStackState()131     public int getStackState() {
132         return mStackState;
133     }
134 
135     /**
136      * @return tx time in ms
137      */
getControllerTxTimeMillis()138     public long getControllerTxTimeMillis() {
139         return mControllerTxTimeMs;
140     }
141 
142     /**
143      * @return tx time at power level provided in ms
144      */
getControllerTxTimeMillisAtLevel(int level)145     public long getControllerTxTimeMillisAtLevel(int level) {
146         if (level < mControllerTxTimePerLevelMs.length) {
147             return mControllerTxTimePerLevelMs[level];
148         }
149         return 0;
150     }
151 
152     /**
153      * @return rx time in ms
154      */
getControllerRxTimeMillis()155     public long getControllerRxTimeMillis() {
156         return mControllerRxTimeMs;
157     }
158 
159     /**
160      * @return idle time in ms
161      */
getControllerIdleTimeMillis()162     public long getControllerIdleTimeMillis() {
163         return mControllerIdleTimeMs;
164     }
165 
166     /**
167      * product of current(mA), voltage(V) and time(ms)
168      * @return energy used
169      */
getControllerEnergyUsed()170     public long getControllerEnergyUsed() {
171         return mControllerEnergyUsed;
172     }
173     /**
174      * @return timestamp(wall clock) of record creation
175      */
getTimeStamp()176     public long getTimeStamp() {
177         return mTimestamp;
178     }
179 
180     /**
181      * @return if the record is valid
182      */
isValid()183     public boolean isValid() {
184         return ((mControllerTxTimeMs >=0) &&
185                 (mControllerRxTimeMs >=0) &&
186                 (mControllerIdleTimeMs >=0));
187     }
188 }
189