1 /* 2 * Copyright (C) 2021 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.google.uwb.support; 18 19 import static com.google.uwb.support.fira.FiraParams.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_INTERLEAVED; 20 import static com.google.uwb.support.fira.FiraParams.AOA_TYPE_AZIMUTH_AND_ELEVATION; 21 import static com.google.uwb.support.fira.FiraParams.BPRF_PHR_DATA_RATE_6M81; 22 import static com.google.uwb.support.fira.FiraParams.MAC_ADDRESS_MODE_8_BYTES; 23 import static com.google.uwb.support.fira.FiraParams.MAC_FCS_TYPE_CRC_32; 24 import static com.google.uwb.support.fira.FiraParams.MEASUREMENT_REPORT_TYPE_INITIATOR_TO_RESPONDER; 25 import static com.google.uwb.support.fira.FiraParams.MULTICAST_LIST_UPDATE_ACTION_DELETE; 26 import static com.google.uwb.support.fira.FiraParams.MULTICAST_LIST_UPDATE_STATUS_ERROR_MULTICAST_LIST_FULL; 27 import static com.google.uwb.support.fira.FiraParams.MULTI_NODE_MODE_MANY_TO_MANY; 28 import static com.google.uwb.support.fira.FiraParams.PREAMBLE_DURATION_T32_SYMBOLS; 29 import static com.google.uwb.support.fira.FiraParams.PRF_MODE_HPRF; 30 import static com.google.uwb.support.fira.FiraParams.PSDU_DATA_RATE_7M80; 31 import static com.google.uwb.support.fira.FiraParams.RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_EDGE_TRIG; 32 import static com.google.uwb.support.fira.FiraParams.RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG; 33 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_ROLE_INITIATOR; 34 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_TYPE_CONTROLEE; 35 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_TYPE_CONTROLLER; 36 import static com.google.uwb.support.fira.FiraParams.RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE; 37 import static com.google.uwb.support.fira.FiraParams.RFRAME_CONFIG_SP1; 38 import static com.google.uwb.support.fira.FiraParams.SESSION_TYPE_RANGING; 39 import static com.google.uwb.support.fira.FiraParams.SFD_ID_VALUE_3; 40 import static com.google.uwb.support.fira.FiraParams.STATE_CHANGE_REASON_CODE_ERROR_INVALID_RANGING_INTERVAL; 41 import static com.google.uwb.support.fira.FiraParams.STATUS_CODE_ERROR_ADDRESS_ALREADY_PRESENT; 42 import static com.google.uwb.support.fira.FiraParams.STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY; 43 import static com.google.uwb.support.fira.FiraParams.STS_LENGTH_128_SYMBOLS; 44 import static com.google.uwb.support.fira.FiraParams.STS_SEGMENT_COUNT_VALUE_2; 45 import static com.google.uwb.support.fira.FiraParams.TX_TIMESTAMP_40_BIT; 46 import static com.google.uwb.support.fira.FiraParams.UL_TDOA_DEVICE_ID_16_BIT; 47 48 import static org.junit.Assert.assertArrayEquals; 49 import static org.junit.Assert.assertEquals; 50 import static org.junit.Assert.assertTrue; 51 52 import android.os.PersistableBundle; 53 import android.uwb.UwbAddress; 54 55 import androidx.test.ext.junit.runners.AndroidJUnit4; 56 import androidx.test.filters.SmallTest; 57 58 import com.google.uwb.support.base.Params; 59 import com.google.uwb.support.fira.FiraControleeParams; 60 import com.google.uwb.support.fira.FiraMulticastListUpdateStatusCode; 61 import com.google.uwb.support.fira.FiraOpenSessionParams; 62 import com.google.uwb.support.fira.FiraParams; 63 import com.google.uwb.support.fira.FiraProtocolVersion; 64 import com.google.uwb.support.fira.FiraRangingReconfigureParams; 65 import com.google.uwb.support.fira.FiraSpecificationParams; 66 import com.google.uwb.support.fira.FiraStateChangeReasonCode; 67 import com.google.uwb.support.fira.FiraStatusCode; 68 69 import org.junit.Test; 70 import org.junit.runner.RunWith; 71 72 import java.util.ArrayList; 73 import java.util.EnumSet; 74 import java.util.List; 75 76 @SmallTest 77 @RunWith(AndroidJUnit4.class) 78 public class FiraTests { 79 @Test testOpenSessionParams()80 public void testOpenSessionParams() { 81 FiraProtocolVersion protocolVersion = FiraParams.PROTOCOL_VERSION_1_1; 82 int sessionId = 10; 83 int sessionType = SESSION_TYPE_RANGING; 84 int deviceType = RANGING_DEVICE_TYPE_CONTROLEE; 85 int deviceRole = RANGING_DEVICE_ROLE_INITIATOR; 86 int rangingRoundUsage = RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE; 87 int multiNodeMode = MULTI_NODE_MODE_MANY_TO_MANY; 88 int addressMode = MAC_ADDRESS_MODE_8_BYTES; 89 UwbAddress deviceAddress = UwbAddress.fromBytes(new byte[] {1, 2, 3, 4, 5, 6, 7, 8}); 90 UwbAddress destAddress1 = UwbAddress.fromBytes(new byte[] {1, 2, 3, 4, 5, 6, 7, 8}); 91 UwbAddress destAddress2 = 92 UwbAddress.fromBytes(new byte[] {(byte) 0xFF, (byte) 0xFE, 3, 4, 5, 6, 7, 8}); 93 List<UwbAddress> destAddressList = new ArrayList<>(); 94 destAddressList.add(destAddress1); 95 destAddressList.add(destAddress2); 96 int initiationTime = 100; 97 int slotDurationRstu = 2400; 98 int slotsPerRangingRound = 10; 99 int rangingIntervalMs = 100; 100 int blockStrideLength = 2; 101 int maxRangingRoundRetries = 3; 102 int sessionPriority = 100; 103 boolean hasRangingResultReportMessage = true; 104 boolean hasControlMessage = true; 105 boolean hasRangingControlPhase = false; 106 int measurementReportType = MEASUREMENT_REPORT_TYPE_INITIATOR_TO_RESPONDER; 107 int inBandTerminationAttemptCount = 8; 108 int channelNumber = 10; 109 int preambleCodeIndex = 12; 110 int rframeConfig = RFRAME_CONFIG_SP1; 111 int prfMode = PRF_MODE_HPRF; 112 int preambleDuration = PREAMBLE_DURATION_T32_SYMBOLS; 113 int sfdId = SFD_ID_VALUE_3; 114 int stsSegmentCount = STS_SEGMENT_COUNT_VALUE_2; 115 int stsLength = STS_LENGTH_128_SYMBOLS; 116 byte[] sessionKey = new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 117 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; 118 byte[] subsessionKey = new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 119 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; 120 int psduDataRate = PSDU_DATA_RATE_7M80; 121 int bprfPhrDataRate = BPRF_PHR_DATA_RATE_6M81; 122 int fcsType = MAC_FCS_TYPE_CRC_32; 123 boolean isTxAdaptivePayloadPowerEnabled = true; 124 int stsConfig = STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY; 125 int subSessionId = 24; 126 byte[] vendorId = new byte[] {(byte) 0xFE, (byte) 0xDC}; 127 byte[] staticStsIV = new byte[] {(byte) 0xDF, (byte) 0xCE, (byte) 0xAB, 0x12, 0x34, 0x56}; 128 boolean isKeyRotationEnabled = true; 129 int keyRotationRate = 15; 130 int aoaResultRequest = AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_INTERLEAVED; 131 int rangeDataNtfConfig = RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG; 132 int rangeDataNtfProximityNear = 50; 133 int rangeDataNtfProximityFar = 200; 134 double rangeDataNtfAoaAzimuthLower = -0.5; 135 double rangeDataNtfAoaAzimuthUpper = +1.5; 136 double rangeDataNtfAoaElevationLower = -1.5; 137 double rangeDataNtfAoaElevationUpper = +1.2; 138 boolean hasTimeOfFlightReport = true; 139 boolean hasAngleOfArrivalAzimuthReport = true; 140 boolean hasAngleOfArrivalElevationReport = true; 141 boolean hasAngleOfArrivalFigureOfMeritReport = true; 142 int aoaType = AOA_TYPE_AZIMUTH_AND_ELEVATION; 143 int numOfMsrmtFocusOnRange = 1; 144 int numOfMsrmtFocusOnAoaAzimuth = 2; 145 int numOfMsrmtFocusOnAoaElevation = 3; 146 int ulTdoaTxIntervalMs = 1_000; 147 int ulTdoaRandomWindowMS = 100; 148 int ulTdoaDeviceIdType = UL_TDOA_DEVICE_ID_16_BIT; 149 byte[] ulTdoaDeviceId = new byte[] {(byte) 0x0C, (byte) 0x0B}; 150 int ulTdoaTxTimestampType = TX_TIMESTAMP_40_BIT; 151 int maxNumberOfMeasurements = 1; 152 153 FiraOpenSessionParams params = 154 new FiraOpenSessionParams.Builder() 155 .setProtocolVersion(protocolVersion) 156 .setSessionId(sessionId) 157 .setSessionType(sessionType) 158 .setDeviceType(deviceType) 159 .setDeviceRole(deviceRole) 160 .setRangingRoundUsage(rangingRoundUsage) 161 .setMultiNodeMode(multiNodeMode) 162 .setDeviceAddress(deviceAddress) 163 .setDestAddressList(destAddressList) 164 .setInitiationTime(initiationTime) 165 .setSlotDurationRstu(slotDurationRstu) 166 .setSlotsPerRangingRound(slotsPerRangingRound) 167 .setRangingIntervalMs(rangingIntervalMs) 168 .setBlockStrideLength(blockStrideLength) 169 .setMaxRangingRoundRetries(maxRangingRoundRetries) 170 .setSessionPriority(sessionPriority) 171 .setMacAddressMode(addressMode) 172 .setHasRangingResultReportMessage(hasRangingResultReportMessage) 173 .setHasControlMessage(hasControlMessage) 174 .setHasRangingControlPhase(hasRangingControlPhase) 175 .setMeasurementReportType(measurementReportType) 176 .setInBandTerminationAttemptCount(inBandTerminationAttemptCount) 177 .setChannelNumber(channelNumber) 178 .setPreambleCodeIndex(preambleCodeIndex) 179 .setRframeConfig(rframeConfig) 180 .setPrfMode(prfMode) 181 .setPreambleDuration(preambleDuration) 182 .setSfdId(sfdId) 183 .setStsSegmentCount(stsSegmentCount) 184 .setStsLength(stsLength) 185 .setSessionKey(sessionKey) 186 .setSubsessionKey(subsessionKey) 187 .setPsduDataRate(psduDataRate) 188 .setBprfPhrDataRate(bprfPhrDataRate) 189 .setFcsType(fcsType) 190 .setIsTxAdaptivePayloadPowerEnabled(isTxAdaptivePayloadPowerEnabled) 191 .setStsConfig(stsConfig) 192 .setSubSessionId(subSessionId) 193 .setVendorId(vendorId) 194 .setStaticStsIV(staticStsIV) 195 .setIsKeyRotationEnabled(isKeyRotationEnabled) 196 .setKeyRotationRate(keyRotationRate) 197 .setAoaResultRequest(aoaResultRequest) 198 .setRangeDataNtfConfig(rangeDataNtfConfig) 199 .setRangeDataNtfProximityNear(rangeDataNtfProximityNear) 200 .setRangeDataNtfProximityFar(rangeDataNtfProximityFar) 201 .setRangeDataNtfAoaAzimuthLower(rangeDataNtfAoaAzimuthLower) 202 .setRangeDataNtfAoaAzimuthUpper(rangeDataNtfAoaAzimuthUpper) 203 .setRangeDataNtfAoaElevationLower(rangeDataNtfAoaElevationLower) 204 .setRangeDataNtfAoaElevationUpper(rangeDataNtfAoaElevationUpper) 205 .setHasTimeOfFlightReport(hasTimeOfFlightReport) 206 .setHasAngleOfArrivalAzimuthReport(hasAngleOfArrivalAzimuthReport) 207 .setHasAngleOfArrivalElevationReport(hasAngleOfArrivalElevationReport) 208 .setHasAngleOfArrivalFigureOfMeritReport( 209 hasAngleOfArrivalFigureOfMeritReport) 210 .setAoaType(aoaType) 211 .setMeasurementFocusRatio( 212 numOfMsrmtFocusOnRange, 213 numOfMsrmtFocusOnAoaAzimuth, 214 numOfMsrmtFocusOnAoaElevation) 215 .setUlTdoaTxIntervalMs(ulTdoaTxIntervalMs) 216 .setUlTdoaRandomWindowMs(ulTdoaRandomWindowMS) 217 .setUlTdoaDeviceIdType(ulTdoaDeviceIdType) 218 .setUlTdoaDeviceId(ulTdoaDeviceId) 219 .setUlTdoaTxTimestampType(ulTdoaTxTimestampType) 220 .setMaxNumberOfMeasurements(maxNumberOfMeasurements) 221 .build(); 222 223 assertEquals(params.getProtocolVersion(), protocolVersion); 224 assertEquals(params.getSessionId(), sessionId); 225 assertEquals(params.getSessionType(), sessionType); 226 assertEquals(params.getDeviceType(), deviceType); 227 assertEquals(params.getDeviceRole(), deviceRole); 228 assertEquals(params.getRangingRoundUsage(), rangingRoundUsage); 229 assertEquals(params.getMultiNodeMode(), multiNodeMode); 230 assertEquals(params.getDeviceAddress(), deviceAddress); 231 assertEquals(params.getDestAddressList().size(), destAddressList.size()); 232 for (int i = 0; i < destAddressList.size(); i++) { 233 assertEquals(params.getDestAddressList().get(i), destAddressList.get(i)); 234 } 235 236 assertEquals(params.getInitiationTime(), initiationTime); 237 assertEquals(params.getSlotDurationRstu(), slotDurationRstu); 238 assertEquals(params.getSlotsPerRangingRound(), slotsPerRangingRound); 239 assertEquals(params.getRangingIntervalMs(), rangingIntervalMs); 240 assertEquals(params.getBlockStrideLength(), blockStrideLength); 241 assertEquals(params.getMaxRangingRoundRetries(), maxRangingRoundRetries); 242 assertEquals(params.getSessionPriority(), sessionPriority); 243 assertEquals(params.getMacAddressMode(), addressMode); 244 assertEquals(params.hasRangingResultReportMessage(), hasRangingResultReportMessage); 245 assertEquals(params.hasControlMessage(), hasControlMessage); 246 assertEquals(params.hasRangingControlPhase(), hasRangingControlPhase); 247 assertEquals(params.getMeasurementReportType(), measurementReportType); 248 assertEquals(params.getInBandTerminationAttemptCount(), inBandTerminationAttemptCount); 249 assertEquals(params.getChannelNumber(), channelNumber); 250 assertEquals(params.getPreambleCodeIndex(), preambleCodeIndex); 251 assertEquals(params.getRframeConfig(), rframeConfig); 252 assertEquals(params.getPrfMode(), prfMode); 253 assertEquals(params.getPreambleDuration(), preambleDuration); 254 assertEquals(params.getSfdId(), sfdId); 255 assertEquals(params.getStsSegmentCount(), stsSegmentCount); 256 assertEquals(params.getStsLength(), stsLength); 257 assertArrayEquals(params.getSessionKey(), sessionKey); 258 assertArrayEquals(params.getSubsessionKey(), subsessionKey); 259 assertEquals(params.getPsduDataRate(), psduDataRate); 260 assertEquals(params.getBprfPhrDataRate(), bprfPhrDataRate); 261 assertEquals(params.getFcsType(), fcsType); 262 assertEquals(params.isTxAdaptivePayloadPowerEnabled(), isTxAdaptivePayloadPowerEnabled); 263 assertEquals(params.getStsConfig(), stsConfig); 264 assertEquals(params.getSubSessionId(), subSessionId); 265 assertArrayEquals(params.getVendorId(), vendorId); 266 assertArrayEquals(params.getStaticStsIV(), staticStsIV); 267 assertEquals(params.isKeyRotationEnabled(), isKeyRotationEnabled); 268 assertEquals(params.getKeyRotationRate(), keyRotationRate); 269 assertEquals(params.getAoaResultRequest(), aoaResultRequest); 270 assertEquals(params.getRangeDataNtfConfig(), rangeDataNtfConfig); 271 assertEquals(params.getRangeDataNtfProximityNear(), rangeDataNtfProximityNear); 272 assertEquals(params.getRangeDataNtfProximityFar(), rangeDataNtfProximityFar); 273 assertEquals(params.getRangeDataNtfAoaAzimuthLower(), rangeDataNtfAoaAzimuthLower, 0.0d); 274 assertEquals(params.getRangeDataNtfAoaAzimuthUpper(), rangeDataNtfAoaAzimuthUpper, 0.0d); 275 assertEquals(params.getRangeDataNtfAoaElevationLower(), rangeDataNtfAoaElevationLower, 276 0.0d); 277 assertEquals(params.getRangeDataNtfAoaElevationUpper(), rangeDataNtfAoaElevationUpper, 278 0.0d); 279 assertEquals(params.hasTimeOfFlightReport(), hasTimeOfFlightReport); 280 assertEquals(params.hasAngleOfArrivalAzimuthReport(), hasAngleOfArrivalAzimuthReport); 281 assertEquals(params.hasAngleOfArrivalElevationReport(), hasAngleOfArrivalElevationReport); 282 assertEquals( 283 params.hasAngleOfArrivalFigureOfMeritReport(), 284 hasAngleOfArrivalFigureOfMeritReport); 285 assertEquals(params.getAoaType(), aoaType); 286 assertEquals(params.getNumOfMsrmtFocusOnRange(), numOfMsrmtFocusOnRange); 287 assertEquals(params.getNumOfMsrmtFocusOnAoaAzimuth(), numOfMsrmtFocusOnAoaAzimuth); 288 assertEquals(params.getNumOfMsrmtFocusOnAoaElevation(), numOfMsrmtFocusOnAoaElevation); 289 assertEquals(params.getUlTdoaTxIntervalMs(), ulTdoaTxIntervalMs); 290 assertEquals(params.getUlTdoaRandomWindowMs(), ulTdoaRandomWindowMS); 291 assertEquals(params.getUlTdoaDeviceIdType(), ulTdoaDeviceIdType); 292 assertArrayEquals(params.getUlTdoaDeviceId(), ulTdoaDeviceId); 293 assertEquals(params.getUlTdoaTxTimestampType(), ulTdoaTxTimestampType); 294 assertEquals(params.getMaxNumberOfMeasurements(), maxNumberOfMeasurements); 295 296 FiraOpenSessionParams fromBundle = FiraOpenSessionParams.fromBundle(params.toBundle()); 297 298 assertEquals(fromBundle.getRangingRoundUsage(), rangingRoundUsage); 299 assertEquals(fromBundle.getMultiNodeMode(), multiNodeMode); 300 301 assertEquals(fromBundle.getDeviceAddress(), deviceAddress); 302 assertEquals(fromBundle.getDestAddressList().size(), destAddressList.size()); 303 for (int i = 0; i < destAddressList.size(); i++) { 304 assertEquals(fromBundle.getDestAddressList().get(i), destAddressList.get(i)); 305 } 306 307 assertEquals(fromBundle.getInitiationTime(), initiationTime); 308 assertEquals(fromBundle.getSlotDurationRstu(), slotDurationRstu); 309 assertEquals(fromBundle.getSlotsPerRangingRound(), slotsPerRangingRound); 310 assertEquals(fromBundle.getRangingIntervalMs(), rangingIntervalMs); 311 assertEquals(fromBundle.getBlockStrideLength(), blockStrideLength); 312 assertEquals(fromBundle.getMaxRangingRoundRetries(), maxRangingRoundRetries); 313 assertEquals(fromBundle.getSessionPriority(), sessionPriority); 314 assertEquals(fromBundle.getMacAddressMode(), addressMode); 315 assertEquals(fromBundle.hasRangingResultReportMessage(), hasRangingResultReportMessage); 316 assertEquals(fromBundle.hasControlMessage(), hasControlMessage); 317 assertEquals(fromBundle.hasRangingControlPhase(), hasRangingControlPhase); 318 assertEquals(fromBundle.getMeasurementReportType(), measurementReportType); 319 assertEquals(fromBundle.getInBandTerminationAttemptCount(), inBandTerminationAttemptCount); 320 assertEquals(fromBundle.getChannelNumber(), channelNumber); 321 assertEquals(fromBundle.getPreambleCodeIndex(), preambleCodeIndex); 322 assertEquals(fromBundle.getRframeConfig(), rframeConfig); 323 assertEquals(fromBundle.getPrfMode(), prfMode); 324 assertEquals(fromBundle.getPreambleDuration(), preambleDuration); 325 assertEquals(fromBundle.getSfdId(), sfdId); 326 assertEquals(fromBundle.getStsSegmentCount(), stsSegmentCount); 327 assertEquals(fromBundle.getStsLength(), stsLength); 328 assertArrayEquals(fromBundle.getSessionKey(), sessionKey); 329 assertArrayEquals(fromBundle.getSubsessionKey(), subsessionKey); 330 assertEquals(fromBundle.getPsduDataRate(), psduDataRate); 331 assertEquals(fromBundle.getBprfPhrDataRate(), bprfPhrDataRate); 332 assertEquals(fromBundle.getFcsType(), fcsType); 333 assertEquals(fromBundle.isTxAdaptivePayloadPowerEnabled(), isTxAdaptivePayloadPowerEnabled); 334 assertEquals(fromBundle.getStsConfig(), stsConfig); 335 assertEquals(fromBundle.getSubSessionId(), subSessionId); 336 assertArrayEquals(fromBundle.getVendorId(), vendorId); 337 assertArrayEquals(fromBundle.getStaticStsIV(), staticStsIV); 338 assertEquals(fromBundle.isKeyRotationEnabled(), isKeyRotationEnabled); 339 assertEquals(fromBundle.getKeyRotationRate(), keyRotationRate); 340 assertEquals(fromBundle.getAoaResultRequest(), aoaResultRequest); 341 assertEquals(fromBundle.getRangeDataNtfConfig(), rangeDataNtfConfig); 342 assertEquals(fromBundle.getRangeDataNtfProximityNear(), rangeDataNtfProximityNear, 0.0d); 343 assertEquals(fromBundle.getRangeDataNtfProximityFar(), rangeDataNtfProximityFar, 0.0d); 344 assertEquals(fromBundle.getRangeDataNtfAoaAzimuthLower(), rangeDataNtfAoaAzimuthLower, 345 0.0d); 346 assertEquals(fromBundle.getRangeDataNtfAoaAzimuthUpper(), rangeDataNtfAoaAzimuthUpper, 347 0.0d); 348 assertEquals(fromBundle.getRangeDataNtfAoaElevationLower(), rangeDataNtfAoaElevationLower, 349 0.0d); 350 assertEquals(fromBundle.getRangeDataNtfAoaElevationUpper(), rangeDataNtfAoaElevationUpper, 351 0.0d); 352 assertEquals(fromBundle.hasTimeOfFlightReport(), hasTimeOfFlightReport); 353 assertEquals(fromBundle.hasAngleOfArrivalAzimuthReport(), hasAngleOfArrivalAzimuthReport); 354 assertEquals( 355 fromBundle.hasAngleOfArrivalElevationReport(), hasAngleOfArrivalElevationReport); 356 assertEquals( 357 fromBundle.hasAngleOfArrivalFigureOfMeritReport(), 358 hasAngleOfArrivalFigureOfMeritReport); 359 assertEquals(fromBundle.getAoaType(), aoaType); 360 assertEquals(fromBundle.getNumOfMsrmtFocusOnRange(), numOfMsrmtFocusOnRange); 361 assertEquals(fromBundle.getNumOfMsrmtFocusOnAoaAzimuth(), numOfMsrmtFocusOnAoaAzimuth); 362 assertEquals(fromBundle.getNumOfMsrmtFocusOnAoaElevation(), numOfMsrmtFocusOnAoaElevation); 363 assertEquals(fromBundle.getUlTdoaTxIntervalMs(), ulTdoaTxIntervalMs); 364 assertEquals(fromBundle.getUlTdoaRandomWindowMs(), ulTdoaRandomWindowMS); 365 assertEquals(fromBundle.getUlTdoaDeviceIdType(), ulTdoaDeviceIdType); 366 assertArrayEquals(fromBundle.getUlTdoaDeviceId(), ulTdoaDeviceId); 367 assertEquals(fromBundle.getUlTdoaTxTimestampType(), ulTdoaTxTimestampType); 368 assertEquals(fromBundle.getMaxNumberOfMeasurements(), maxNumberOfMeasurements); 369 370 verifyProtocolPresent(fromBundle); 371 verifyBundlesEqual(params, fromBundle); 372 373 FiraOpenSessionParams fromCopy = new FiraOpenSessionParams.Builder(params).build(); 374 375 assertEquals(fromCopy.getRangingRoundUsage(), rangingRoundUsage); 376 assertEquals(fromCopy.getMultiNodeMode(), multiNodeMode); 377 378 assertEquals(fromCopy.getDeviceAddress(), deviceAddress); 379 assertEquals(fromCopy.getDestAddressList().size(), destAddressList.size()); 380 for (int i = 0; i < destAddressList.size(); i++) { 381 assertEquals(fromCopy.getDestAddressList().get(i), destAddressList.get(i)); 382 } 383 384 assertEquals(fromCopy.getInitiationTime(), initiationTime); 385 assertEquals(fromCopy.getSlotDurationRstu(), slotDurationRstu); 386 assertEquals(fromCopy.getSlotsPerRangingRound(), slotsPerRangingRound); 387 assertEquals(fromCopy.getRangingIntervalMs(), rangingIntervalMs); 388 assertEquals(fromCopy.getBlockStrideLength(), blockStrideLength); 389 assertEquals(fromCopy.getMaxRangingRoundRetries(), maxRangingRoundRetries); 390 assertEquals(fromCopy.getSessionPriority(), sessionPriority); 391 assertEquals(fromCopy.getMacAddressMode(), addressMode); 392 assertEquals(fromCopy.hasRangingResultReportMessage(), hasRangingResultReportMessage); 393 assertEquals(fromCopy.hasControlMessage(), hasControlMessage); 394 assertEquals(fromCopy.hasRangingControlPhase(), hasRangingControlPhase); 395 assertEquals(fromCopy.getMeasurementReportType(), measurementReportType); 396 assertEquals(fromCopy.getInBandTerminationAttemptCount(), inBandTerminationAttemptCount); 397 assertEquals(fromCopy.getChannelNumber(), channelNumber); 398 assertEquals(fromCopy.getPreambleCodeIndex(), preambleCodeIndex); 399 assertEquals(fromCopy.getRframeConfig(), rframeConfig); 400 assertEquals(fromCopy.getPrfMode(), prfMode); 401 assertEquals(fromCopy.getPreambleDuration(), preambleDuration); 402 assertEquals(fromCopy.getSfdId(), sfdId); 403 assertEquals(fromCopy.getStsSegmentCount(), stsSegmentCount); 404 assertEquals(fromCopy.getStsLength(), stsLength); 405 assertArrayEquals(fromCopy.getSessionKey(), sessionKey); 406 assertArrayEquals(fromCopy.getSubsessionKey(), subsessionKey); 407 assertEquals(fromCopy.getPsduDataRate(), psduDataRate); 408 assertEquals(fromCopy.getBprfPhrDataRate(), bprfPhrDataRate); 409 assertEquals(fromCopy.getFcsType(), fcsType); 410 assertEquals(fromCopy.isTxAdaptivePayloadPowerEnabled(), isTxAdaptivePayloadPowerEnabled); 411 assertEquals(fromCopy.getStsConfig(), stsConfig); 412 assertEquals(fromCopy.getSubSessionId(), subSessionId); 413 assertArrayEquals(fromCopy.getVendorId(), vendorId); 414 assertArrayEquals(fromCopy.getStaticStsIV(), staticStsIV); 415 assertEquals(fromCopy.isKeyRotationEnabled(), isKeyRotationEnabled); 416 assertEquals(fromCopy.getKeyRotationRate(), keyRotationRate); 417 assertEquals(fromCopy.getAoaResultRequest(), aoaResultRequest); 418 assertEquals(fromCopy.getRangeDataNtfConfig(), rangeDataNtfConfig); 419 assertEquals(fromCopy.getRangeDataNtfProximityNear(), rangeDataNtfProximityNear, 0.0d); 420 assertEquals(fromCopy.getRangeDataNtfProximityFar(), rangeDataNtfProximityFar, 0.0d); 421 assertEquals(fromCopy.getRangeDataNtfAoaAzimuthLower(), rangeDataNtfAoaAzimuthLower, 422 0.0d); 423 assertEquals(fromCopy.getRangeDataNtfAoaAzimuthUpper(), rangeDataNtfAoaAzimuthUpper, 424 0.0d); 425 assertEquals(fromCopy.getRangeDataNtfAoaElevationLower(), rangeDataNtfAoaElevationLower, 426 0.0d); 427 assertEquals(fromCopy.getRangeDataNtfAoaElevationUpper(), rangeDataNtfAoaElevationUpper, 428 0.0d); 429 assertEquals(fromCopy.hasTimeOfFlightReport(), hasTimeOfFlightReport); 430 assertEquals(fromCopy.hasAngleOfArrivalAzimuthReport(), hasAngleOfArrivalAzimuthReport); 431 assertEquals( 432 fromCopy.hasAngleOfArrivalElevationReport(), hasAngleOfArrivalElevationReport); 433 assertEquals( 434 fromCopy.hasAngleOfArrivalFigureOfMeritReport(), 435 hasAngleOfArrivalFigureOfMeritReport); 436 assertEquals(fromCopy.getAoaType(), aoaType); 437 assertEquals(fromCopy.getNumOfMsrmtFocusOnRange(), numOfMsrmtFocusOnRange); 438 assertEquals(fromCopy.getNumOfMsrmtFocusOnAoaAzimuth(), numOfMsrmtFocusOnAoaAzimuth); 439 assertEquals(fromCopy.getNumOfMsrmtFocusOnAoaElevation(), numOfMsrmtFocusOnAoaElevation); 440 assertEquals(fromCopy.getUlTdoaTxIntervalMs(), ulTdoaTxIntervalMs); 441 assertEquals(fromCopy.getUlTdoaRandomWindowMs(), ulTdoaRandomWindowMS); 442 assertEquals(fromCopy.getUlTdoaDeviceIdType(), ulTdoaDeviceIdType); 443 assertArrayEquals(fromCopy.getUlTdoaDeviceId(), ulTdoaDeviceId); 444 assertEquals(fromCopy.getUlTdoaTxTimestampType(), ulTdoaTxTimestampType); 445 assertEquals(fromCopy.getMaxNumberOfMeasurements(), maxNumberOfMeasurements); 446 447 verifyProtocolPresent(fromCopy); 448 verifyBundlesEqual(params, fromCopy); 449 } 450 451 @Test testRangingReconfigureParams()452 public void testRangingReconfigureParams() { 453 int action = MULTICAST_LIST_UPDATE_ACTION_DELETE; 454 UwbAddress uwbAddress1 = UwbAddress.fromBytes(new byte[] {1, 2}); 455 UwbAddress uwbAddress2 = UwbAddress.fromBytes(new byte[] {4, 5}); 456 UwbAddress[] addressList = new UwbAddress[] {uwbAddress1, uwbAddress2}; 457 int blockStrideLength = 5; 458 int rangeDataNtfConfig = RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_EDGE_TRIG; 459 int rangeDataProximityNear = 100; 460 int rangeDataProximityFar = 500; 461 double rangeDataAoaAzimuthLower = -0.5; 462 double rangeDataAoaAzimuthUpper = +1.5; 463 double rangeDataAoaElevationLower = -1.5; 464 double rangeDataAoaElevationUpper = +1.2; 465 466 int[] subSessionIdList = new int[] {3, 4}; 467 FiraRangingReconfigureParams params = 468 new FiraRangingReconfigureParams.Builder() 469 .setAction(action) 470 .setAddressList(addressList) 471 .setSubSessionIdList(subSessionIdList) 472 .build(); 473 474 assertEquals((int) params.getAction(), action); 475 assertArrayEquals(params.getAddressList(), addressList); 476 assertArrayEquals(params.getSubSessionIdList(), subSessionIdList); 477 FiraRangingReconfigureParams fromBundle = 478 FiraRangingReconfigureParams.fromBundle(params.toBundle()); 479 assertEquals((int) fromBundle.getAction(), action); 480 assertArrayEquals(fromBundle.getAddressList(), addressList); 481 assertArrayEquals(fromBundle.getSubSessionIdList(), subSessionIdList); 482 verifyProtocolPresent(params); 483 verifyBundlesEqual(params, fromBundle); 484 485 params = 486 new FiraRangingReconfigureParams.Builder() 487 .setBlockStrideLength(blockStrideLength) 488 .setRangeDataNtfConfig(rangeDataNtfConfig) 489 .setRangeDataProximityNear(rangeDataProximityNear) 490 .setRangeDataProximityFar(rangeDataProximityFar) 491 .setRangeDataAoaAzimuthLower(rangeDataAoaAzimuthLower) 492 .setRangeDataAoaAzimuthUpper(rangeDataAoaAzimuthUpper) 493 .setRangeDataAoaElevationLower(rangeDataAoaElevationLower) 494 .setRangeDataAoaElevationUpper(rangeDataAoaElevationUpper) 495 .build(); 496 assertEquals((int) params.getBlockStrideLength(), blockStrideLength); 497 assertEquals((int) params.getRangeDataNtfConfig(), rangeDataNtfConfig); 498 assertEquals((int) params.getRangeDataProximityNear(), rangeDataProximityNear); 499 assertEquals((int) params.getRangeDataProximityFar(), rangeDataProximityFar); 500 assertEquals((double) params.getRangeDataAoaAzimuthLower(), rangeDataAoaAzimuthLower, 501 0.0d); 502 assertEquals((double) params.getRangeDataAoaAzimuthUpper(), rangeDataAoaAzimuthUpper, 503 0.0d); 504 assertEquals((double) params.getRangeDataAoaElevationLower(), rangeDataAoaElevationLower, 505 0.0d); 506 assertEquals((double) params.getRangeDataAoaElevationUpper(), rangeDataAoaElevationUpper, 507 0.0d); 508 509 fromBundle = FiraRangingReconfigureParams.fromBundle(params.toBundle()); 510 assertEquals((int) fromBundle.getBlockStrideLength(), blockStrideLength); 511 assertEquals((int) fromBundle.getRangeDataNtfConfig(), rangeDataNtfConfig); 512 assertEquals((int) fromBundle.getRangeDataProximityNear(), rangeDataProximityNear); 513 assertEquals((int) fromBundle.getRangeDataProximityFar(), rangeDataProximityFar); 514 assertEquals((double) fromBundle.getRangeDataAoaAzimuthLower(), rangeDataAoaAzimuthLower, 515 0.0d); 516 assertEquals((double) fromBundle.getRangeDataAoaAzimuthUpper(), rangeDataAoaAzimuthUpper, 517 0.0d); 518 assertEquals((double) fromBundle.getRangeDataAoaElevationLower(), 519 rangeDataAoaElevationLower, 0.0d); 520 assertEquals((double) fromBundle.getRangeDataAoaElevationUpper(), 521 rangeDataAoaElevationUpper, 0.0d); 522 523 verifyProtocolPresent(params); 524 verifyBundlesEqual(params, fromBundle); 525 } 526 527 @Test testControleeParams()528 public void testControleeParams() { 529 UwbAddress uwbAddress1 = UwbAddress.fromBytes(new byte[] {1, 2}); 530 UwbAddress uwbAddress2 = UwbAddress.fromBytes(new byte[] {4, 5}); 531 UwbAddress[] addressList = new UwbAddress[] {uwbAddress1, uwbAddress2}; 532 int[] subSessionIdList = new int[] {3, 4}; 533 FiraControleeParams params = 534 new FiraControleeParams.Builder() 535 .setAddressList(addressList) 536 .setSubSessionIdList(subSessionIdList) 537 .build(); 538 539 assertArrayEquals(params.getAddressList(), addressList); 540 assertArrayEquals(params.getSubSessionIdList(), subSessionIdList); 541 FiraControleeParams fromBundle = 542 FiraControleeParams.fromBundle(params.toBundle()); 543 assertArrayEquals(fromBundle.getAddressList(), addressList); 544 assertArrayEquals(fromBundle.getSubSessionIdList(), subSessionIdList); 545 verifyProtocolPresent(params); 546 verifyBundlesEqual(params, fromBundle); 547 } 548 549 @Test testStatusCode()550 public void testStatusCode() { 551 int statusCode = STATUS_CODE_ERROR_ADDRESS_ALREADY_PRESENT; 552 FiraStatusCode params = new FiraStatusCode.Builder().setStatusCode(statusCode).build(); 553 assertEquals(params.getStatusCode(), statusCode); 554 assertTrue(FiraStatusCode.isBundleValid(params.toBundle())); 555 FiraStatusCode fromBundle = FiraStatusCode.fromBundle(params.toBundle()); 556 assertEquals(fromBundle.getStatusCode(), statusCode); 557 558 verifyProtocolPresent(params); 559 verifyBundlesEqual(params, fromBundle); 560 } 561 562 @Test testMulticastListUpdateStatusCode()563 public void testMulticastListUpdateStatusCode() { 564 int statusCode = MULTICAST_LIST_UPDATE_STATUS_ERROR_MULTICAST_LIST_FULL; 565 FiraMulticastListUpdateStatusCode params = 566 new FiraMulticastListUpdateStatusCode.Builder().setStatusCode(statusCode).build(); 567 assertEquals(params.getStatusCode(), statusCode); 568 assertTrue(FiraMulticastListUpdateStatusCode.isBundleValid(params.toBundle())); 569 570 FiraMulticastListUpdateStatusCode fromBundle = 571 FiraMulticastListUpdateStatusCode.fromBundle(params.toBundle()); 572 assertEquals(fromBundle.getStatusCode(), statusCode); 573 574 verifyProtocolPresent(params); 575 verifyBundlesEqual(params, fromBundle); 576 } 577 578 @Test testStateChangeReasonCode()579 public void testStateChangeReasonCode() { 580 int reasonCode = STATE_CHANGE_REASON_CODE_ERROR_INVALID_RANGING_INTERVAL; 581 FiraStateChangeReasonCode params = 582 new FiraStateChangeReasonCode.Builder().setReasonCode(reasonCode).build(); 583 assertEquals(reasonCode, params.getReasonCode()); 584 assertTrue(FiraStateChangeReasonCode.isBundleValid(params.toBundle())); 585 586 FiraStateChangeReasonCode fromBundle = 587 FiraStateChangeReasonCode.fromBundle(params.toBundle()); 588 assertEquals(reasonCode, fromBundle.getReasonCode()); 589 590 verifyProtocolPresent(params); 591 verifyBundlesEqual(params, fromBundle); 592 } 593 verifyProtocolPresent(Params params)594 private void verifyProtocolPresent(Params params) { 595 assertTrue(Params.isProtocol(params.toBundle(), FiraParams.PROTOCOL_NAME)); 596 } 597 verifyBundlesEqual(Params params, Params fromBundle)598 private void verifyBundlesEqual(Params params, Params fromBundle) { 599 PersistableBundle.kindofEquals(params.toBundle(), fromBundle.toBundle()); 600 } 601 602 @Test testSpecificationParams()603 public void testSpecificationParams() { 604 FiraProtocolVersion minPhyVersionSupported = new FiraProtocolVersion(1, 0); 605 FiraProtocolVersion maxPhyVersionSupported = new FiraProtocolVersion(2, 0); 606 FiraProtocolVersion minMacVersionSupported = new FiraProtocolVersion(1, 2); 607 FiraProtocolVersion maxMacVersionSupported = new FiraProtocolVersion(1, 2); 608 List<Integer> supportedChannels = List.of(5, 6, 8, 9); 609 EnumSet<FiraParams.AoaCapabilityFlag> aoaCapabilities = 610 EnumSet.of(FiraParams.AoaCapabilityFlag.HAS_ELEVATION_SUPPORT); 611 612 EnumSet<FiraParams.DeviceRoleCapabilityFlag> deviceRoleCapabilities = 613 EnumSet.allOf(FiraParams.DeviceRoleCapabilityFlag.class); 614 boolean hasBlockStridingSupport = true; 615 boolean hasNonDeferredModeSupport = true; 616 boolean hasInitiationTimeSupport = true; 617 boolean hasRssiReportingSupport = true; 618 boolean hasDiagnosticsSupport = true; 619 EnumSet<FiraParams.MultiNodeCapabilityFlag> multiNodeCapabilities = 620 EnumSet.allOf(FiraParams.MultiNodeCapabilityFlag.class); 621 EnumSet<FiraParams.PrfCapabilityFlag> prfCapabilities = 622 EnumSet.allOf(FiraParams.PrfCapabilityFlag.class); 623 EnumSet<FiraParams.RangingRoundCapabilityFlag> rangingRoundCapabilities = 624 EnumSet.allOf(FiraParams.RangingRoundCapabilityFlag.class); 625 EnumSet<FiraParams.RframeCapabilityFlag> rframeCapabilities = 626 EnumSet.allOf(FiraParams.RframeCapabilityFlag.class); 627 EnumSet<FiraParams.StsCapabilityFlag> stsCapabilities = 628 EnumSet.allOf(FiraParams.StsCapabilityFlag.class); 629 EnumSet<FiraParams.PsduDataRateCapabilityFlag> psduDataRateCapabilities = 630 EnumSet.allOf(FiraParams.PsduDataRateCapabilityFlag.class); 631 EnumSet<FiraParams.BprfParameterSetCapabilityFlag> bprfCapabilities = 632 EnumSet.allOf(FiraParams.BprfParameterSetCapabilityFlag.class); 633 EnumSet<FiraParams.HprfParameterSetCapabilityFlag> hprfCapabilities = 634 EnumSet.allOf(FiraParams.HprfParameterSetCapabilityFlag.class); 635 EnumSet<FiraParams.RangeDataNtfConfigCapabilityFlag> rangeDataNtfConfigCapabilities = 636 EnumSet.allOf(FiraParams.RangeDataNtfConfigCapabilityFlag.class); 637 int deviceType = RANGING_DEVICE_TYPE_CONTROLLER; 638 boolean suspendRangingSupport = true; 639 int sessionKeyLength = 1; 640 boolean hasBackgroundSupport = true; 641 642 FiraSpecificationParams params = 643 new FiraSpecificationParams.Builder() 644 .setMinPhyVersionSupported(minPhyVersionSupported) 645 .setMaxPhyVersionSupported(maxPhyVersionSupported) 646 .setMinMacVersionSupported(minMacVersionSupported) 647 .setMaxMacVersionSupported(maxMacVersionSupported) 648 .setSupportedChannels(supportedChannels) 649 .setAoaCapabilities(aoaCapabilities) 650 .setDeviceRoleCapabilities(deviceRoleCapabilities) 651 .hasBlockStridingSupport(hasBlockStridingSupport) 652 .hasNonDeferredModeSupport(hasNonDeferredModeSupport) 653 .hasInitiationTimeSupport(hasInitiationTimeSupport) 654 .hasRssiReportingSupport(hasRssiReportingSupport) 655 .hasDiagnosticsSupport(hasDiagnosticsSupport) 656 .setMultiNodeCapabilities(multiNodeCapabilities) 657 .setPrfCapabilities(prfCapabilities) 658 .setRangingRoundCapabilities(rangingRoundCapabilities) 659 .setRframeCapabilities(rframeCapabilities) 660 .setStsCapabilities(stsCapabilities) 661 .setPsduDataRateCapabilities(psduDataRateCapabilities) 662 .setBprfParameterSetCapabilities(bprfCapabilities) 663 .setHprfParameterSetCapabilities(hprfCapabilities) 664 .setRangeDataNtfConfigCapabilities(rangeDataNtfConfigCapabilities) 665 .setDeviceType(deviceType) 666 .setSuspendRangingSupport(suspendRangingSupport) 667 .setSessionKeyLength(sessionKeyLength) 668 .setBackgroundRangingSupport(false) 669 .build(); 670 assertEquals(minPhyVersionSupported, params.getMinPhyVersionSupported()); 671 assertEquals(maxPhyVersionSupported, params.getMaxPhyVersionSupported()); 672 assertEquals(minMacVersionSupported, params.getMinMacVersionSupported()); 673 assertEquals(maxMacVersionSupported, params.getMaxMacVersionSupported()); 674 assertEquals(supportedChannels, params.getSupportedChannels()); 675 assertEquals(aoaCapabilities, params.getAoaCapabilities()); 676 assertEquals(deviceRoleCapabilities, params.getDeviceRoleCapabilities()); 677 assertEquals(hasBlockStridingSupport, params.hasBlockStridingSupport()); 678 assertEquals(hasNonDeferredModeSupport, params.hasNonDeferredModeSupport()); 679 assertEquals(hasInitiationTimeSupport, params.hasInitiationTimeSupport()); 680 assertEquals(hasRssiReportingSupport, params.hasRssiReportingSupport()); 681 assertEquals(hasDiagnosticsSupport, params.hasDiagnosticsSupport()); 682 assertEquals(multiNodeCapabilities, params.getMultiNodeCapabilities()); 683 assertEquals(prfCapabilities, params.getPrfCapabilities()); 684 assertEquals(rangingRoundCapabilities, params.getRangingRoundCapabilities()); 685 assertEquals(rframeCapabilities, params.getRframeCapabilities()); 686 assertEquals(stsCapabilities, params.getStsCapabilities()); 687 assertEquals(psduDataRateCapabilities, params.getPsduDataRateCapabilities()); 688 assertEquals(bprfCapabilities, params.getBprfParameterSetCapabilities()); 689 assertEquals(hprfCapabilities, params.getHprfParameterSetCapabilities()); 690 assertEquals(rangeDataNtfConfigCapabilities, params.getRangeDataNtfConfigCapabilities()); 691 assertEquals(deviceType, params.getDeviceType()); 692 assertEquals(suspendRangingSupport, params.hasSuspendRangingSupport()); 693 assertEquals(sessionKeyLength, params.getSessionKeyLength()); 694 assertEquals(false, params.hasBackgroundRangingSupport()); 695 696 FiraSpecificationParams fromBundle = FiraSpecificationParams.fromBundle(params.toBundle()); 697 assertEquals(minPhyVersionSupported, fromBundle.getMinPhyVersionSupported()); 698 assertEquals(maxPhyVersionSupported, fromBundle.getMaxPhyVersionSupported()); 699 assertEquals(minMacVersionSupported, fromBundle.getMinMacVersionSupported()); 700 assertEquals(maxMacVersionSupported, fromBundle.getMaxMacVersionSupported()); 701 assertEquals(supportedChannels, fromBundle.getSupportedChannels()); 702 assertEquals(aoaCapabilities, fromBundle.getAoaCapabilities()); 703 assertEquals(deviceRoleCapabilities, fromBundle.getDeviceRoleCapabilities()); 704 assertEquals(hasBlockStridingSupport, fromBundle.hasBlockStridingSupport()); 705 assertEquals(hasNonDeferredModeSupport, fromBundle.hasNonDeferredModeSupport()); 706 assertEquals(hasInitiationTimeSupport, params.hasInitiationTimeSupport()); 707 assertEquals(multiNodeCapabilities, fromBundle.getMultiNodeCapabilities()); 708 assertEquals(prfCapabilities, fromBundle.getPrfCapabilities()); 709 assertEquals(rangingRoundCapabilities, fromBundle.getRangingRoundCapabilities()); 710 assertEquals(rframeCapabilities, fromBundle.getRframeCapabilities()); 711 assertEquals(stsCapabilities, fromBundle.getStsCapabilities()); 712 assertEquals(psduDataRateCapabilities, fromBundle.getPsduDataRateCapabilities()); 713 assertEquals(bprfCapabilities, fromBundle.getBprfParameterSetCapabilities()); 714 assertEquals(hprfCapabilities, fromBundle.getHprfParameterSetCapabilities()); 715 assertEquals(rangeDataNtfConfigCapabilities, 716 fromBundle.getRangeDataNtfConfigCapabilities()); 717 assertEquals(deviceType, fromBundle.getDeviceType()); 718 assertEquals(suspendRangingSupport, fromBundle.hasSuspendRangingSupport()); 719 assertEquals(sessionKeyLength, fromBundle.getSessionKeyLength()); 720 assertEquals(false, fromBundle.hasBackgroundRangingSupport()); 721 verifyProtocolPresent(params); 722 verifyBundlesEqual(params, fromBundle); 723 724 FiraSpecificationParams fromCopy = new FiraSpecificationParams.Builder(params) 725 .setBackgroundRangingSupport(hasBackgroundSupport) 726 .build(); 727 728 assertEquals(minPhyVersionSupported, fromCopy.getMinPhyVersionSupported()); 729 assertEquals(maxPhyVersionSupported, fromCopy.getMaxPhyVersionSupported()); 730 assertEquals(minMacVersionSupported, fromCopy.getMinMacVersionSupported()); 731 assertEquals(maxMacVersionSupported, fromCopy.getMaxMacVersionSupported()); 732 assertEquals(supportedChannels, fromCopy.getSupportedChannels()); 733 assertEquals(aoaCapabilities, fromCopy.getAoaCapabilities()); 734 assertEquals(deviceRoleCapabilities, fromCopy.getDeviceRoleCapabilities()); 735 assertEquals(hasBlockStridingSupport, fromCopy.hasBlockStridingSupport()); 736 assertEquals(hasNonDeferredModeSupport, fromCopy.hasNonDeferredModeSupport()); 737 assertEquals(hasInitiationTimeSupport, params.hasInitiationTimeSupport()); 738 assertEquals(multiNodeCapabilities, fromCopy.getMultiNodeCapabilities()); 739 assertEquals(prfCapabilities, fromCopy.getPrfCapabilities()); 740 assertEquals(rangingRoundCapabilities, fromCopy.getRangingRoundCapabilities()); 741 assertEquals(rframeCapabilities, fromCopy.getRframeCapabilities()); 742 assertEquals(stsCapabilities, fromCopy.getStsCapabilities()); 743 assertEquals(psduDataRateCapabilities, fromCopy.getPsduDataRateCapabilities()); 744 assertEquals(bprfCapabilities, fromCopy.getBprfParameterSetCapabilities()); 745 assertEquals(hprfCapabilities, fromCopy.getHprfParameterSetCapabilities()); 746 assertEquals(rangeDataNtfConfigCapabilities, 747 fromCopy.getRangeDataNtfConfigCapabilities()); 748 assertEquals(deviceType, fromCopy.getDeviceType()); 749 assertEquals(suspendRangingSupport, fromCopy.hasSuspendRangingSupport()); 750 assertEquals(sessionKeyLength, fromCopy.getSessionKeyLength()); 751 assertEquals(hasBackgroundSupport, fromCopy.hasBackgroundRangingSupport()); 752 verifyProtocolPresent(params); 753 verifyBundlesEqual(params, fromCopy); 754 } 755 756 @Test testSpecificationParams_whenNoChannelsSet()757 public void testSpecificationParams_whenNoChannelsSet() { 758 FiraSpecificationParams params = 759 new FiraSpecificationParams.Builder() 760 .build(); 761 assertEquals(List.of(), params.getSupportedChannels()); 762 763 FiraSpecificationParams fromBundle = FiraSpecificationParams.fromBundle(params.toBundle()); 764 assertEquals(List.of(), fromBundle.getSupportedChannels()); 765 } 766 767 @Test testFiraProtocolVersion()768 public void testFiraProtocolVersion() { 769 FiraProtocolVersion firaVersion = new FiraProtocolVersion(1, 2); 770 assertEquals(1, firaVersion.getMajor()); 771 assertEquals(2, firaVersion.getMinor()); 772 773 firaVersion = FiraProtocolVersion.fromString("1.3"); 774 assertEquals(1, firaVersion.getMajor()); 775 assertEquals(3, firaVersion.getMinor()); 776 777 firaVersion = FiraProtocolVersion.fromBytes(new byte[]{0x1, 0x4}, 0); 778 assertEquals(1, firaVersion.getMajor()); 779 assertEquals(4, firaVersion.getMinor()); 780 781 firaVersion = FiraProtocolVersion.fromLEShort((short) 0x1002); 782 assertEquals(2, firaVersion.getMajor()); 783 assertEquals(1, firaVersion.getMinor()); 784 } 785 } 786