143 lines
6.8 KiB
Java
143 lines
6.8 KiB
Java
|
/*
|
||
|
* Copyright 2022 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 com.android.server.uwb;
|
||
|
|
||
|
import static com.android.server.uwb.data.UwbUciConstants.RANGING_MEASUREMENT_TYPE_TWO_WAY;
|
||
|
import static com.android.server.uwb.util.UwbUtil.convertFloatToQFormat;
|
||
|
import static com.android.server.uwb.util.UwbUtil.degreeToRadian;
|
||
|
|
||
|
import android.util.Pair;
|
||
|
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 com.android.server.uwb.data.UwbRangingData;
|
||
|
import com.android.server.uwb.data.UwbTwoWayMeasurement;
|
||
|
import com.android.server.uwb.params.TlvUtil;
|
||
|
|
||
|
import com.google.uwb.support.fira.FiraParams;
|
||
|
|
||
|
public class UwbTestUtils {
|
||
|
private static final long TEST_SEQ_COUNTER = 5;
|
||
|
private static final long TEST_SESSION_ID = 7;
|
||
|
private static final int TEST_RCR_INDICATION = 7;
|
||
|
private static final long TEST_CURR_RANGING_INTERVAL = 100;
|
||
|
private static final int TEST_RANGING_MEASURES_TYPE = RANGING_MEASUREMENT_TYPE_TWO_WAY;
|
||
|
private static final int TEST_MAC_ADDRESS_MODE = 1;
|
||
|
private static final byte[] TEST_MAC_ADDRESS = {0x1, 0x3};
|
||
|
private static final int TEST_STATUS = FiraParams.STATUS_CODE_OK;
|
||
|
private static final int TEST_LOS = 0;
|
||
|
private static final int TEST_DISTANCE = 101;
|
||
|
private static final float TEST_AOA_AZIMUTH = 67;
|
||
|
private static final int TEST_AOA_AZIMUTH_FOM = 50;
|
||
|
private static final float TEST_AOA_ELEVATION = 37;
|
||
|
private static final int TEST_AOA_ELEVATION_FOM = 90;
|
||
|
private static final float TEST_AOA_DEST_AZIMUTH = 67;
|
||
|
private static final int TEST_AOA_DEST_AZIMUTH_FOM = 50;
|
||
|
private static final float TEST_AOA_DEST_ELEVATION = 37;
|
||
|
private static final int TEST_AOA_DEST_ELEVATION_FOM = 90;
|
||
|
private static final int TEST_SLOT_IDX = 10;
|
||
|
|
||
|
private UwbTestUtils() {}
|
||
|
|
||
|
public static UwbRangingData generateRangingData(int rangingStatus) {
|
||
|
final int noOfRangingMeasures = 1;
|
||
|
final UwbTwoWayMeasurement[] uwbTwoWayMeasurements =
|
||
|
new UwbTwoWayMeasurement[noOfRangingMeasures];
|
||
|
uwbTwoWayMeasurements[0] = new UwbTwoWayMeasurement(TEST_MAC_ADDRESS, rangingStatus,
|
||
|
TEST_LOS, TEST_DISTANCE, convertFloatToQFormat(TEST_AOA_AZIMUTH, 9, 7),
|
||
|
TEST_AOA_AZIMUTH_FOM, convertFloatToQFormat(TEST_AOA_ELEVATION, 9, 7),
|
||
|
TEST_AOA_ELEVATION_FOM, convertFloatToQFormat(TEST_AOA_DEST_AZIMUTH, 9, 7),
|
||
|
TEST_AOA_DEST_AZIMUTH_FOM, convertFloatToQFormat(TEST_AOA_DEST_ELEVATION, 9, 7),
|
||
|
TEST_AOA_DEST_ELEVATION_FOM, TEST_SLOT_IDX);
|
||
|
return new UwbRangingData(TEST_SEQ_COUNTER, TEST_SESSION_ID,
|
||
|
TEST_RCR_INDICATION, TEST_CURR_RANGING_INTERVAL, TEST_RANGING_MEASURES_TYPE,
|
||
|
TEST_MAC_ADDRESS_MODE, noOfRangingMeasures, uwbTwoWayMeasurements);
|
||
|
}
|
||
|
|
||
|
// Helper method to generate a UwbRangingData instance and corresponding RangingMeasurement
|
||
|
public static Pair<UwbRangingData, RangingReport> generateRangingDataAndRangingReport(
|
||
|
boolean isAoaAzimuthEnabled, boolean isAoaElevationEnabled,
|
||
|
boolean isDestAoaAzimuthEnabled, boolean isDestAoaElevationEnabled,
|
||
|
long elapsedRealtimeNanos) {
|
||
|
UwbRangingData uwbRangingData = generateRangingData(TEST_STATUS);
|
||
|
|
||
|
AngleOfArrivalMeasurement aoaMeasurement = null;
|
||
|
AngleOfArrivalMeasurement aoaDestMeasurement = null;
|
||
|
if (isAoaAzimuthEnabled || isAoaElevationEnabled) {
|
||
|
AngleMeasurement aoaAzimuth = null;
|
||
|
AngleMeasurement aoaElevation = null;
|
||
|
if (isAoaAzimuthEnabled) {
|
||
|
aoaAzimuth =
|
||
|
new AngleMeasurement(
|
||
|
degreeToRadian(TEST_AOA_AZIMUTH), 0,
|
||
|
TEST_AOA_AZIMUTH_FOM / (double) 100);
|
||
|
}
|
||
|
if (isAoaElevationEnabled) {
|
||
|
aoaElevation =
|
||
|
new AngleMeasurement(
|
||
|
degreeToRadian(TEST_AOA_ELEVATION), 0,
|
||
|
TEST_AOA_ELEVATION_FOM / (double) 100);
|
||
|
}
|
||
|
aoaMeasurement = new AngleOfArrivalMeasurement.Builder(aoaAzimuth)
|
||
|
.setAltitude(aoaElevation)
|
||
|
.build();
|
||
|
}
|
||
|
if (isDestAoaAzimuthEnabled || isDestAoaElevationEnabled) {
|
||
|
AngleMeasurement aoaDestAzimuth = null;
|
||
|
AngleMeasurement aoaDestElevation = null;
|
||
|
if (isDestAoaAzimuthEnabled) {
|
||
|
aoaDestAzimuth =
|
||
|
new AngleMeasurement(
|
||
|
degreeToRadian(TEST_AOA_DEST_AZIMUTH), 0,
|
||
|
TEST_AOA_DEST_AZIMUTH_FOM / (double) 100);
|
||
|
}
|
||
|
if (isDestAoaElevationEnabled) {
|
||
|
aoaDestElevation =
|
||
|
new AngleMeasurement(
|
||
|
degreeToRadian(TEST_AOA_DEST_ELEVATION), 0,
|
||
|
TEST_AOA_DEST_ELEVATION_FOM / (double) 100);
|
||
|
}
|
||
|
aoaDestMeasurement = new AngleOfArrivalMeasurement.Builder(aoaDestAzimuth)
|
||
|
.setAltitude(aoaDestElevation)
|
||
|
.build();
|
||
|
}
|
||
|
RangingMeasurement rangingMeasurement = new RangingMeasurement.Builder()
|
||
|
.setRemoteDeviceAddress(UwbAddress.fromBytes(
|
||
|
TlvUtil.getReverseBytes(TEST_MAC_ADDRESS)))
|
||
|
.setStatus(TEST_STATUS)
|
||
|
.setElapsedRealtimeNanos(elapsedRealtimeNanos)
|
||
|
.setDistanceMeasurement(
|
||
|
new DistanceMeasurement.Builder()
|
||
|
.setMeters(TEST_DISTANCE / (double) 100)
|
||
|
.setErrorMeters(0)
|
||
|
.setConfidenceLevel(0)
|
||
|
.build())
|
||
|
.setAngleOfArrivalMeasurement(aoaMeasurement)
|
||
|
.setDestinationAngleOfArrivalMeasurement(aoaDestMeasurement)
|
||
|
.setLineOfSight(TEST_LOS)
|
||
|
.build();
|
||
|
RangingReport rangingReport = new RangingReport.Builder()
|
||
|
.addMeasurement(rangingMeasurement)
|
||
|
.build();
|
||
|
return Pair.create(uwbRangingData, rangingReport);
|
||
|
}
|
||
|
}
|