317 lines
12 KiB
Java
317 lines
12 KiB
Java
![]() |
/*
|
||
|
* Copyright (C) 2023 The Android Open Source Project
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
package android.uwb;
|
||
|
|
||
|
import android.annotation.ElapsedRealtimeLong;
|
||
|
import android.annotation.IntRange;
|
||
|
import android.annotation.NonNull;
|
||
|
import android.annotation.Nullable;
|
||
|
import android.annotation.SystemApi;
|
||
|
import android.os.Parcel;
|
||
|
import android.os.Parcelable;
|
||
|
import android.uwb.UwbManager.AdapterStateCallback.State;
|
||
|
|
||
|
import java.util.Objects;
|
||
|
|
||
|
/**
|
||
|
* Record of energy and activity information from controller and
|
||
|
* underlying Uwb stack state. Timestamp the record with elapsed
|
||
|
* real-time.
|
||
|
* @hide
|
||
|
*/
|
||
|
@SystemApi
|
||
|
public final class UwbActivityEnergyInfo implements Parcelable {
|
||
|
private final long mTimeSinceBootMillis;
|
||
|
private final @State int mStackState;
|
||
|
private final long mControllerTxDurationMillis;
|
||
|
private final long mControllerRxDurationMillis;
|
||
|
private final long mControllerIdleDurationMillis;
|
||
|
private final long mControllerWakeCount;
|
||
|
|
||
|
private UwbActivityEnergyInfo(
|
||
|
@ElapsedRealtimeLong long timeSinceBootMillis,
|
||
|
@State int stackState,
|
||
|
@IntRange(from = 0) long txDurationMillis,
|
||
|
@IntRange(from = 0) long rxDurationMillis,
|
||
|
@IntRange(from = 0) long idleDurationMillis,
|
||
|
@IntRange(from = 0) long wakeCount) {
|
||
|
mTimeSinceBootMillis = timeSinceBootMillis;
|
||
|
mStackState = stackState;
|
||
|
mControllerTxDurationMillis = txDurationMillis;
|
||
|
mControllerRxDurationMillis = rxDurationMillis;
|
||
|
mControllerIdleDurationMillis = idleDurationMillis;
|
||
|
mControllerWakeCount = wakeCount;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @hide
|
||
|
*/
|
||
|
@Override
|
||
|
public boolean equals(@Nullable Object obj) {
|
||
|
if (this == obj) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
if (obj instanceof UwbActivityEnergyInfo) {
|
||
|
UwbActivityEnergyInfo other = (UwbActivityEnergyInfo) obj;
|
||
|
return mTimeSinceBootMillis == other.getTimeSinceBootMillis()
|
||
|
&& mStackState == other.getStackState()
|
||
|
&& mControllerTxDurationMillis == other.getControllerTxDurationMillis()
|
||
|
&& mControllerRxDurationMillis == other.getControllerRxDurationMillis()
|
||
|
&& mControllerIdleDurationMillis == other.getControllerIdleDurationMillis()
|
||
|
&& mControllerWakeCount == other.getControllerWakeCount();
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @hide
|
||
|
*/
|
||
|
@Override
|
||
|
public int hashCode() {
|
||
|
return Objects.hash(mTimeSinceBootMillis, mStackState, mControllerTxDurationMillis,
|
||
|
mControllerRxDurationMillis, mControllerIdleDurationMillis, mControllerWakeCount);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public String toString() {
|
||
|
return "UwbActivityEnergyInfo{"
|
||
|
+ " mTimeSinceBootMillis=" + mTimeSinceBootMillis
|
||
|
+ " mStackState=" + mStackState
|
||
|
+ " mControllerTxDurationMillis=" + mControllerTxDurationMillis
|
||
|
+ " mControllerRxDurationMillis=" + mControllerRxDurationMillis
|
||
|
+ " mControllerIdleDurationMillis=" + mControllerIdleDurationMillis
|
||
|
+ " mControllerWakeCount=" + mControllerWakeCount
|
||
|
+ " }";
|
||
|
}
|
||
|
|
||
|
public static final @NonNull Creator<UwbActivityEnergyInfo> CREATOR =
|
||
|
new Creator<UwbActivityEnergyInfo>() {
|
||
|
@Override
|
||
|
public UwbActivityEnergyInfo createFromParcel(Parcel in) {
|
||
|
Builder builder = new Builder();
|
||
|
builder.setTimeSinceBootMillis(in.readLong());
|
||
|
builder.setStackState(in.readInt());
|
||
|
builder.setControllerTxDurationMillis(in.readLong());
|
||
|
builder.setControllerRxDurationMillis(in.readLong());
|
||
|
builder.setControllerIdleDurationMillis(in.readLong());
|
||
|
builder.setControllerWakeCount(in.readLong());
|
||
|
return builder.build();
|
||
|
}
|
||
|
@Override
|
||
|
public UwbActivityEnergyInfo[] newArray(int size) {
|
||
|
return new UwbActivityEnergyInfo[size];
|
||
|
}
|
||
|
};
|
||
|
|
||
|
@Override
|
||
|
public void writeToParcel(@NonNull Parcel out, int flags) {
|
||
|
out.writeLong(mTimeSinceBootMillis);
|
||
|
out.writeInt(mStackState);
|
||
|
out.writeLong(mControllerTxDurationMillis);
|
||
|
out.writeLong(mControllerRxDurationMillis);
|
||
|
out.writeLong(mControllerIdleDurationMillis);
|
||
|
out.writeLong(mControllerWakeCount);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public int describeContents() {
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/** Get the timestamp (elapsed real time milliseconds since boot) of record creation. */
|
||
|
@ElapsedRealtimeLong
|
||
|
public long getTimeSinceBootMillis() {
|
||
|
return mTimeSinceBootMillis;
|
||
|
}
|
||
|
|
||
|
/** Get the Uwb stack reported state. */
|
||
|
@State
|
||
|
public int getStackState() {
|
||
|
return mStackState;
|
||
|
}
|
||
|
|
||
|
/** Get the Uwb transmission duration, in milliseconds. */
|
||
|
@IntRange(from = 0)
|
||
|
public long getControllerTxDurationMillis() {
|
||
|
return mControllerTxDurationMillis;
|
||
|
}
|
||
|
|
||
|
/** Get the Uwb receive duration, in milliseconds. */
|
||
|
@IntRange(from = 0)
|
||
|
public long getControllerRxDurationMillis() {
|
||
|
return mControllerRxDurationMillis;
|
||
|
}
|
||
|
|
||
|
/** Get the Uwb idle duration, in milliseconds. */
|
||
|
@IntRange(from = 0)
|
||
|
public long getControllerIdleDurationMillis() {
|
||
|
return mControllerIdleDurationMillis;
|
||
|
}
|
||
|
|
||
|
/** Get the Uwb wakeup count. */
|
||
|
@IntRange(from = 0)
|
||
|
public long getControllerWakeCount() {
|
||
|
return mControllerWakeCount;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Builder for a {@link UwbActivityEnergyInfo} object.
|
||
|
*/
|
||
|
public static final class Builder {
|
||
|
private long mTimeSinceBootMillis = -1L;
|
||
|
private int mStackState = -1;
|
||
|
private long mControllerTxDurationMillis = -1L;
|
||
|
private long mControllerRxDurationMillis = -1L;
|
||
|
private long mControllerIdleDurationMillis = -1L;
|
||
|
private long mControllerWakeCount = -1L;
|
||
|
|
||
|
/**
|
||
|
* Set the timestamp (elapsed real time milliseconds since boot) of record creation.
|
||
|
*
|
||
|
* @param timeSinceBootMillis the elapsed real time since boot, in milliseconds
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setTimeSinceBootMillis(@ElapsedRealtimeLong long timeSinceBootMillis) {
|
||
|
if (timeSinceBootMillis < 0) {
|
||
|
throw new IllegalArgumentException("timeSinceBootMillis must be >= 0");
|
||
|
}
|
||
|
mTimeSinceBootMillis = timeSinceBootMillis;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the Uwb stack reported state.
|
||
|
*
|
||
|
* @param stackState Uwb stack reported state
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setStackState(@State int stackState) {
|
||
|
if (stackState != UwbManager.AdapterStateCallback.STATE_DISABLED
|
||
|
&& stackState != UwbManager.AdapterStateCallback.STATE_ENABLED_INACTIVE
|
||
|
&& stackState != UwbManager.AdapterStateCallback.STATE_ENABLED_ACTIVE) {
|
||
|
throw new IllegalArgumentException("invalid UWB stack state");
|
||
|
}
|
||
|
mStackState = stackState;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the Uwb transmission duration, in milliseconds.
|
||
|
*
|
||
|
* @param txDurationMillis cumulative milliseconds of active transmission
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setControllerTxDurationMillis(@IntRange(from = 0) long txDurationMillis) {
|
||
|
if (txDurationMillis < 0) {
|
||
|
throw new IllegalArgumentException("txDurationMillis must be >= 0");
|
||
|
}
|
||
|
mControllerTxDurationMillis = txDurationMillis;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the Uwb receive duration, in milliseconds.
|
||
|
*
|
||
|
* @param rxDurationMillis cumulative milliseconds of active receive
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setControllerRxDurationMillis(@IntRange(from = 0) long rxDurationMillis) {
|
||
|
if (rxDurationMillis < 0) {
|
||
|
throw new IllegalArgumentException("rxDurationMillis must be >= 0");
|
||
|
}
|
||
|
mControllerRxDurationMillis = rxDurationMillis;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the Uwb idle duration, in milliseconds.
|
||
|
*
|
||
|
* @param idleDurationMillis cumulative milliseconds when radio is awake but not
|
||
|
* transmitting or receiving
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setControllerIdleDurationMillis(
|
||
|
@IntRange(from = 0) long idleDurationMillis) {
|
||
|
if (idleDurationMillis < 0) {
|
||
|
throw new IllegalArgumentException("idleDurationMillis must be >= 0");
|
||
|
}
|
||
|
mControllerIdleDurationMillis = idleDurationMillis;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the Uwb wakeup count.
|
||
|
*
|
||
|
* @param wakeCount cumulative number of wakeup count for the radio
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setControllerWakeCount(@IntRange(from = 0) long wakeCount) {
|
||
|
if (wakeCount < 0) {
|
||
|
throw new IllegalArgumentException("wakeCount must be >= 0");
|
||
|
}
|
||
|
mControllerWakeCount = wakeCount;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Build the {@link UwbActivityEnergyInfo} object
|
||
|
*
|
||
|
* @throws IllegalStateException if timeSinceBootMillis, stackState, txDurationMillis,
|
||
|
* rxDurationMillis, idleDurationMillis or wakeCount
|
||
|
* is invalid
|
||
|
*/
|
||
|
@NonNull
|
||
|
public UwbActivityEnergyInfo build() {
|
||
|
if (mTimeSinceBootMillis < 0) {
|
||
|
throw new IllegalStateException(
|
||
|
"timeSinceBootMillis must be >= 0: " + mTimeSinceBootMillis);
|
||
|
}
|
||
|
|
||
|
if (mStackState != UwbManager.AdapterStateCallback.STATE_DISABLED
|
||
|
&& mStackState != UwbManager.AdapterStateCallback.STATE_ENABLED_INACTIVE
|
||
|
&& mStackState != UwbManager.AdapterStateCallback.STATE_ENABLED_ACTIVE) {
|
||
|
throw new IllegalStateException("invalid UWB stack state");
|
||
|
}
|
||
|
|
||
|
if (mControllerTxDurationMillis < 0) {
|
||
|
throw new IllegalStateException(
|
||
|
"txDurationMillis must be >= 0: " + mControllerTxDurationMillis);
|
||
|
}
|
||
|
|
||
|
if (mControllerRxDurationMillis < 0) {
|
||
|
throw new IllegalStateException(
|
||
|
"rxDurationMillis must be >= 0: " + mControllerRxDurationMillis);
|
||
|
}
|
||
|
|
||
|
if (mControllerIdleDurationMillis < 0) {
|
||
|
throw new IllegalStateException(
|
||
|
"idleDurationMillis must be >= 0: " + mControllerIdleDurationMillis);
|
||
|
}
|
||
|
|
||
|
if (mControllerWakeCount < 0) {
|
||
|
throw new IllegalStateException(
|
||
|
"wakeCount must be >= 0: " + mControllerWakeCount);
|
||
|
}
|
||
|
|
||
|
return new UwbActivityEnergyInfo(mTimeSinceBootMillis, mStackState,
|
||
|
mControllerTxDurationMillis, mControllerRxDurationMillis,
|
||
|
mControllerIdleDurationMillis, mControllerWakeCount);
|
||
|
}
|
||
|
}
|
||
|
}
|