1 /*
2  * Copyright (C) 2024 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 com.android.server.power.stats;
18 
19 import android.annotation.NonNull;
20 import android.os.PersistableBundle;
21 
22 import com.android.internal.os.PowerStats;
23 
24 public class WifiPowerStatsLayout extends PowerStatsLayout {
25     private static final String TAG = "WifiPowerStatsLayout";
26     private static final int UNSPECIFIED = -1;
27     private static final String EXTRA_POWER_REPORTING_SUPPORTED = "prs";
28     private static final String EXTRA_DEVICE_RX_TIME_POSITION = "dt-rx";
29     private static final String EXTRA_DEVICE_TX_TIME_POSITION = "dt-tx";
30     private static final String EXTRA_DEVICE_SCAN_TIME_POSITION = "dt-scan";
31     private static final String EXTRA_DEVICE_BASIC_SCAN_TIME_POSITION = "dt-basic-scan";
32     private static final String EXTRA_DEVICE_BATCHED_SCAN_TIME_POSITION = "dt-batch-scan";
33     private static final String EXTRA_DEVICE_IDLE_TIME_POSITION = "dt-idle";
34     private static final String EXTRA_DEVICE_ACTIVE_TIME_POSITION = "dt-on";
35     private static final String EXTRA_UID_RX_BYTES_POSITION = "urxb";
36     private static final String EXTRA_UID_TX_BYTES_POSITION = "utxb";
37     private static final String EXTRA_UID_RX_PACKETS_POSITION = "urxp";
38     private static final String EXTRA_UID_TX_PACKETS_POSITION = "utxp";
39     private static final String EXTRA_UID_SCAN_TIME_POSITION = "ut-scan";
40     private static final String EXTRA_UID_BATCH_SCAN_TIME_POSITION = "ut-bscan";
41 
42     private boolean mPowerReportingSupported;
43     private int mDeviceRxTimePosition;
44     private int mDeviceTxTimePosition;
45     private int mDeviceIdleTimePosition;
46     private int mDeviceScanTimePosition;
47     private int mDeviceBasicScanTimePosition;
48     private int mDeviceBatchedScanTimePosition;
49     private int mDeviceActiveTimePosition;
50     private int mUidRxBytesPosition;
51     private int mUidTxBytesPosition;
52     private int mUidRxPacketsPosition;
53     private int mUidTxPacketsPosition;
54     private int mUidScanTimePosition;
55     private int mUidBatchScanTimePosition;
56 
WifiPowerStatsLayout()57     WifiPowerStatsLayout() {
58     }
59 
WifiPowerStatsLayout(@onNull PowerStats.Descriptor descriptor)60     WifiPowerStatsLayout(@NonNull PowerStats.Descriptor descriptor) {
61         super(descriptor);
62     }
63 
addDeviceWifiActivity(boolean powerReportingSupported)64     void addDeviceWifiActivity(boolean powerReportingSupported) {
65         mPowerReportingSupported = powerReportingSupported;
66         if (mPowerReportingSupported) {
67             mDeviceActiveTimePosition = UNSPECIFIED;
68             mDeviceRxTimePosition = addDeviceSection(1, "rx");
69             mDeviceTxTimePosition = addDeviceSection(1, "tx");
70             mDeviceIdleTimePosition = addDeviceSection(1, "idle");
71             mDeviceScanTimePosition = addDeviceSection(1, "scan");
72         } else {
73             mDeviceActiveTimePosition = addDeviceSection(1, "rx-tx");
74             mDeviceRxTimePosition = UNSPECIFIED;
75             mDeviceTxTimePosition = UNSPECIFIED;
76             mDeviceIdleTimePosition = UNSPECIFIED;
77             mDeviceScanTimePosition = UNSPECIFIED;
78         }
79         mDeviceBasicScanTimePosition = addDeviceSection(1, "basic-scan", FLAG_OPTIONAL);
80         mDeviceBatchedScanTimePosition = addDeviceSection(1, "batched-scan", FLAG_OPTIONAL);
81     }
82 
addUidNetworkStats()83     void addUidNetworkStats() {
84         mUidRxPacketsPosition = addUidSection(1, "rx-pkts");
85         mUidRxBytesPosition = addUidSection(1, "rx-B");
86         mUidTxPacketsPosition = addUidSection(1, "tx-pkts");
87         mUidTxBytesPosition = addUidSection(1, "tx-B");
88         mUidScanTimePosition = addUidSection(1, "scan", FLAG_OPTIONAL);
89         mUidBatchScanTimePosition = addUidSection(1, "batched-scan", FLAG_OPTIONAL);
90     }
91 
isPowerReportingSupported()92     public boolean isPowerReportingSupported() {
93         return mPowerReportingSupported;
94     }
95 
setDeviceRxTime(long[] stats, long durationMillis)96     public void setDeviceRxTime(long[] stats, long durationMillis) {
97         stats[mDeviceRxTimePosition] = durationMillis;
98     }
99 
getDeviceRxTime(long[] stats)100     public long getDeviceRxTime(long[] stats) {
101         return stats[mDeviceRxTimePosition];
102     }
103 
setDeviceTxTime(long[] stats, long durationMillis)104     public void setDeviceTxTime(long[] stats, long durationMillis) {
105         stats[mDeviceTxTimePosition] = durationMillis;
106     }
107 
getDeviceTxTime(long[] stats)108     public long getDeviceTxTime(long[] stats) {
109         return stats[mDeviceTxTimePosition];
110     }
111 
setDeviceScanTime(long[] stats, long durationMillis)112     public void setDeviceScanTime(long[] stats, long durationMillis) {
113         stats[mDeviceScanTimePosition] = durationMillis;
114     }
115 
getDeviceScanTime(long[] stats)116     public long getDeviceScanTime(long[] stats) {
117         return stats[mDeviceScanTimePosition];
118     }
119 
setDeviceBasicScanTime(long[] stats, long durationMillis)120     public void setDeviceBasicScanTime(long[] stats, long durationMillis) {
121         stats[mDeviceBasicScanTimePosition] = durationMillis;
122     }
123 
getDeviceBasicScanTime(long[] stats)124     public long getDeviceBasicScanTime(long[] stats) {
125         return stats[mDeviceBasicScanTimePosition];
126     }
127 
setDeviceBatchedScanTime(long[] stats, long durationMillis)128     public void setDeviceBatchedScanTime(long[] stats, long durationMillis) {
129         stats[mDeviceBatchedScanTimePosition] = durationMillis;
130     }
131 
getDeviceBatchedScanTime(long[] stats)132     public long getDeviceBatchedScanTime(long[] stats) {
133         return stats[mDeviceBatchedScanTimePosition];
134     }
135 
setDeviceIdleTime(long[] stats, long durationMillis)136     public void setDeviceIdleTime(long[] stats, long durationMillis) {
137         stats[mDeviceIdleTimePosition] = durationMillis;
138     }
139 
getDeviceIdleTime(long[] stats)140     public long getDeviceIdleTime(long[] stats) {
141         return stats[mDeviceIdleTimePosition];
142     }
143 
setDeviceActiveTime(long[] stats, long durationMillis)144     public void setDeviceActiveTime(long[] stats, long durationMillis) {
145         stats[mDeviceActiveTimePosition] = durationMillis;
146     }
147 
getDeviceActiveTime(long[] stats)148     public long getDeviceActiveTime(long[] stats) {
149         return stats[mDeviceActiveTimePosition];
150     }
151 
setUidRxBytes(long[] stats, long count)152     public void setUidRxBytes(long[] stats, long count) {
153         stats[mUidRxBytesPosition] = count;
154     }
155 
getUidRxBytes(long[] stats)156     public long getUidRxBytes(long[] stats) {
157         return stats[mUidRxBytesPosition];
158     }
159 
setUidTxBytes(long[] stats, long count)160     public void setUidTxBytes(long[] stats, long count) {
161         stats[mUidTxBytesPosition] = count;
162     }
163 
getUidTxBytes(long[] stats)164     public long getUidTxBytes(long[] stats) {
165         return stats[mUidTxBytesPosition];
166     }
167 
setUidRxPackets(long[] stats, long count)168     public void setUidRxPackets(long[] stats, long count) {
169         stats[mUidRxPacketsPosition] = count;
170     }
171 
getUidRxPackets(long[] stats)172     public long getUidRxPackets(long[] stats) {
173         return stats[mUidRxPacketsPosition];
174     }
175 
setUidTxPackets(long[] stats, long count)176     public void setUidTxPackets(long[] stats, long count) {
177         stats[mUidTxPacketsPosition] = count;
178     }
179 
getUidTxPackets(long[] stats)180     public long getUidTxPackets(long[] stats) {
181         return stats[mUidTxPacketsPosition];
182     }
183 
setUidScanTime(long[] stats, long count)184     public void setUidScanTime(long[] stats, long count) {
185         stats[mUidScanTimePosition] = count;
186     }
187 
getUidScanTime(long[] stats)188     public long getUidScanTime(long[] stats) {
189         return stats[mUidScanTimePosition];
190     }
191 
setUidBatchScanTime(long[] stats, long count)192     public void setUidBatchScanTime(long[] stats, long count) {
193         stats[mUidBatchScanTimePosition] = count;
194     }
195 
getUidBatchedScanTime(long[] stats)196     public long getUidBatchedScanTime(long[] stats) {
197         return stats[mUidBatchScanTimePosition];
198     }
199 
200     /**
201      * Copies the elements of the stats array layout into <code>extras</code>
202      */
toExtras(PersistableBundle extras)203     public void toExtras(PersistableBundle extras) {
204         super.toExtras(extras);
205         extras.putBoolean(EXTRA_POWER_REPORTING_SUPPORTED, mPowerReportingSupported);
206         extras.putInt(EXTRA_DEVICE_RX_TIME_POSITION, mDeviceRxTimePosition);
207         extras.putInt(EXTRA_DEVICE_TX_TIME_POSITION, mDeviceTxTimePosition);
208         extras.putInt(EXTRA_DEVICE_SCAN_TIME_POSITION, mDeviceScanTimePosition);
209         extras.putInt(EXTRA_DEVICE_BASIC_SCAN_TIME_POSITION, mDeviceBasicScanTimePosition);
210         extras.putInt(EXTRA_DEVICE_BATCHED_SCAN_TIME_POSITION, mDeviceBatchedScanTimePosition);
211         extras.putInt(EXTRA_DEVICE_IDLE_TIME_POSITION, mDeviceIdleTimePosition);
212         extras.putInt(EXTRA_DEVICE_ACTIVE_TIME_POSITION, mDeviceActiveTimePosition);
213         extras.putInt(EXTRA_UID_RX_BYTES_POSITION, mUidRxBytesPosition);
214         extras.putInt(EXTRA_UID_TX_BYTES_POSITION, mUidTxBytesPosition);
215         extras.putInt(EXTRA_UID_RX_PACKETS_POSITION, mUidRxPacketsPosition);
216         extras.putInt(EXTRA_UID_TX_PACKETS_POSITION, mUidTxPacketsPosition);
217         extras.putInt(EXTRA_UID_SCAN_TIME_POSITION, mUidScanTimePosition);
218         extras.putInt(EXTRA_UID_BATCH_SCAN_TIME_POSITION, mUidBatchScanTimePosition);
219     }
220 
221     /**
222      * Retrieves elements of the stats array layout from <code>extras</code>
223      */
fromExtras(PersistableBundle extras)224     public void fromExtras(PersistableBundle extras) {
225         super.fromExtras(extras);
226         mPowerReportingSupported = extras.getBoolean(EXTRA_POWER_REPORTING_SUPPORTED);
227         mDeviceRxTimePosition = extras.getInt(EXTRA_DEVICE_RX_TIME_POSITION);
228         mDeviceTxTimePosition = extras.getInt(EXTRA_DEVICE_TX_TIME_POSITION);
229         mDeviceScanTimePosition = extras.getInt(EXTRA_DEVICE_SCAN_TIME_POSITION);
230         mDeviceBasicScanTimePosition = extras.getInt(EXTRA_DEVICE_BASIC_SCAN_TIME_POSITION);
231         mDeviceBatchedScanTimePosition = extras.getInt(EXTRA_DEVICE_BATCHED_SCAN_TIME_POSITION);
232         mDeviceIdleTimePosition = extras.getInt(EXTRA_DEVICE_IDLE_TIME_POSITION);
233         mDeviceActiveTimePosition = extras.getInt(EXTRA_DEVICE_ACTIVE_TIME_POSITION);
234         mUidRxBytesPosition = extras.getInt(EXTRA_UID_RX_BYTES_POSITION);
235         mUidTxBytesPosition = extras.getInt(EXTRA_UID_TX_BYTES_POSITION);
236         mUidRxPacketsPosition = extras.getInt(EXTRA_UID_RX_PACKETS_POSITION);
237         mUidTxPacketsPosition = extras.getInt(EXTRA_UID_TX_PACKETS_POSITION);
238         mUidScanTimePosition = extras.getInt(EXTRA_UID_SCAN_TIME_POSITION);
239         mUidBatchScanTimePosition = extras.getInt(EXTRA_UID_BATCH_SCAN_TIME_POSITION);
240     }
241 }
242