blob: 041b66c4337d56ec681deb7d78057b256c61e5c2 [file] [log] [blame]
/*
* Copyright 2021 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.cts;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.SystemClock;
import android.uwb.AngleMeasurement;
import android.uwb.AngleOfArrivalMeasurement;
import android.uwb.DistanceMeasurement;
import android.uwb.RangingMeasurement;
import android.uwb.RangingReport;
import android.uwb.UwbAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
public class UwbTestUtils {
private UwbTestUtils() {}
public static boolean isUwbSupported(Context context) {
PackageManager packageManager = context.getPackageManager();
return packageManager.hasSystemFeature(PackageManager.FEATURE_UWB);
}
public static AngleMeasurement getAngleMeasurement() {
return new AngleMeasurement(
getDoubleInRange(-Math.PI, Math.PI),
getDoubleInRange(0, Math.PI),
getDoubleInRange(0, 1));
}
public static AngleOfArrivalMeasurement getAngleOfArrivalMeasurement() {
return new AngleOfArrivalMeasurement.Builder(getAngleMeasurement())
.setAltitude(getAngleMeasurement())
.build();
}
public static DistanceMeasurement getDistanceMeasurement() {
return new DistanceMeasurement.Builder()
.setMeters(getDoubleInRange(0, 100))
.setErrorMeters(getDoubleInRange(0, 10))
.setConfidenceLevel(getDoubleInRange(0, 1))
.build();
}
public static RangingMeasurement getRangingMeasurement() {
return getRangingMeasurement(getUwbAddress(false));
}
public static RangingMeasurement getRangingMeasurement(UwbAddress address) {
return new RangingMeasurement.Builder()
.setDistanceMeasurement(getDistanceMeasurement())
.setAngleOfArrivalMeasurement(getAngleOfArrivalMeasurement())
.setDestinationAngleOfArrivalMeasurement(getAngleOfArrivalMeasurement())
.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos())
.setRemoteDeviceAddress(address != null ? address : getUwbAddress(false))
.setStatus(RangingMeasurement.RANGING_STATUS_SUCCESS)
.setLineOfSight(RangingMeasurement.NLOS)
.setMeasurementFocus(RangingMeasurement.MEASUREMENT_FOCUS_RANGE)
.setRssiDbm(-85)
.build();
}
public static List<RangingMeasurement> getRangingMeasurements(int num) {
List<RangingMeasurement> result = new ArrayList<>();
for (int i = 0; i < num; i++) {
result.add(getRangingMeasurement());
}
return result;
}
public static RangingReport getRangingReports(int numMeasurements) {
RangingReport.Builder builder = new RangingReport.Builder();
for (int i = 0; i < numMeasurements; i++) {
builder.addMeasurement(getRangingMeasurement());
}
return builder.build();
}
private static double getDoubleInRange(double min, double max) {
return min + (max - min) * Math.random();
}
public static UwbAddress getUwbAddress(boolean isShortAddress) {
byte[] addressBytes = new byte[isShortAddress ? UwbAddress.SHORT_ADDRESS_BYTE_LENGTH :
UwbAddress.EXTENDED_ADDRESS_BYTE_LENGTH];
for (int i = 0; i < addressBytes.length; i++) {
addressBytes[i] = (byte) getDoubleInRange(1, 255);
}
return UwbAddress.fromBytes(addressBytes);
}
public static Executor getExecutor() {
return new Executor() {
@Override
public void execute(Runnable command) {
command.run();
}
};
}
}