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.fira; 18 19 import static com.google.common.base.Preconditions.checkArgument; 20 import static com.google.common.base.Preconditions.checkNotNull; 21 22 import static java.util.Objects.requireNonNull; 23 24 import android.os.PersistableBundle; 25 import android.uwb.UwbAddress; 26 import android.uwb.UwbManager; 27 28 import androidx.annotation.FloatRange; 29 import androidx.annotation.IntRange; 30 import androidx.annotation.NonNull; 31 import androidx.annotation.Nullable; 32 33 import com.google.uwb.support.base.RequiredParam; 34 35 import java.util.ArrayList; 36 import java.util.Collections; 37 import java.util.List; 38 39 /** 40 * UWB parameters used to open a FiRa session. 41 * 42 * <p>This is passed as a bundle to the service API {@link UwbManager#openRangingSession}. 43 */ 44 public class FiraOpenSessionParams extends FiraParams { 45 private final FiraProtocolVersion mProtocolVersion; 46 47 private final int mSessionId; 48 @SessionType private final int mSessionType; 49 @RangingDeviceType private final int mDeviceType; 50 @RangingDeviceRole private final int mDeviceRole; 51 @RangingRoundUsage private final int mRangingRoundUsage; 52 @MultiNodeMode private final int mMultiNodeMode; 53 54 private final UwbAddress mDeviceAddress; 55 56 // Dest address list 57 private final List<UwbAddress> mDestAddressList; 58 59 // FiRa 1.0: Relative time (in milli-seconds). 60 // FiRa 2.0: Absolute time in UWB time domain, as specified in CR-272 (in micro-seconds). 61 private final long mInitiationTime; 62 private final int mSlotDurationRstu; 63 private final int mSlotsPerRangingRound; 64 private final int mRangingIntervalMs; 65 private final int mBlockStrideLength; 66 private final int mHoppingMode; 67 68 @IntRange(from = 0, to = 65535) 69 private final int mMaxRangingRoundRetries; 70 71 private final int mSessionPriority; 72 @MacAddressMode final int mMacAddressMode; 73 private final boolean mHasRangingResultReportMessage; 74 private final boolean mHasControlMessage; 75 private final boolean mHasRangingControlPhase; 76 @MeasurementReportType private final int mMeasurementReportType; 77 78 @IntRange(from = 1, to = 10) 79 private final int mInBandTerminationAttemptCount; 80 81 @UwbChannel private final int mChannelNumber; 82 private final int mPreambleCodeIndex; 83 @RframeConfig private final int mRframeConfig; 84 @PrfMode private final int mPrfMode; 85 private final byte[] mCapSize; 86 @SchedulingMode private final int mScheduledMode; 87 @PreambleDuration private final int mPreambleDuration; 88 @SfdIdValue private final int mSfdId; 89 @StsSegmentCountValue private final int mStsSegmentCount; 90 @StsLength private final int mStsLength; 91 92 // 16-byte or 32-byte long array 93 @Nullable private final byte[] mSessionKey; 94 95 // 16-byte or 32-byte long array 96 @Nullable private final byte[] mSubSessionKey; 97 98 @PsduDataRate private final int mPsduDataRate; 99 @BprfPhrDataRate private final int mBprfPhrDataRate; 100 @MacFcsType private final int mFcsType; 101 private final boolean mIsTxAdaptivePayloadPowerEnabled; 102 @StsConfig private final int mStsConfig; 103 private final int mSubSessionId; 104 @AoaType private final int mAoaType; 105 106 // 2-byte long array 107 @Nullable private final byte[] mVendorId; 108 109 // 6-byte long array 110 @Nullable private final byte[] mStaticStsIV; 111 112 private final boolean mIsRssiReportingEnabled; 113 private final boolean mIsDiagnosticsEnabled; 114 private final byte mDiagramsFrameReportsFieldsFlags; 115 private final boolean mIsKeyRotationEnabled; 116 private final int mKeyRotationRate; 117 @AoaResultRequestMode private final int mAoaResultRequest; 118 @RangeDataNtfConfig private final int mRangeDataNtfConfig; 119 private final int mRangeDataNtfProximityNear; 120 private final int mRangeDataNtfProximityFar; 121 private double mRangeDataNtfAoaAzimuthLower; 122 private double mRangeDataNtfAoaAzimuthUpper; 123 private double mRangeDataNtfAoaElevationLower; 124 private double mRangeDataNtfAoaElevationUpper; 125 private final boolean mHasTimeOfFlightReport; 126 private final boolean mHasAngleOfArrivalAzimuthReport; 127 private final boolean mHasAngleOfArrivalElevationReport; 128 private final boolean mHasAngleOfArrivalFigureOfMeritReport; 129 private final int mNumOfMsrmtFocusOnRange; 130 private final int mNumOfMsrmtFocusOnAoaAzimuth; 131 private final int mNumOfMsrmtFocusOnAoaElevation; 132 private final Long mRangingErrorStreakTimeoutMs; 133 private final int mLinkLayerMode; 134 private final int mMinFramesPerRr; 135 private final int mMtuSize; 136 private final int mInterFrameInterval; 137 private final int mUlTdoaTxIntervalMs; 138 private final int mUlTdoaRandomWindowMs; 139 @UlTdoaDeviceIdType private final int mUlTdoaDeviceIdType; 140 @Nullable private final byte[] mUlTdoaDeviceId; 141 @UlTdoaTxTimestampType private final int mUlTdoaTxTimestampType; 142 @FilterType private final int mFilterType; 143 private final int mMaxNumberOfMeasurements; 144 145 private static final int BUNDLE_VERSION_1 = 1; 146 private static final int BUNDLE_VERSION_CURRENT = BUNDLE_VERSION_1; 147 148 private static final String KEY_PROTOCOL_VERSION = "protocol_version"; 149 private static final String KEY_SESSION_ID = "session_id"; 150 private static final String KEY_SESSION_TYPE = "session_type"; 151 private static final String KEY_DEVICE_TYPE = "device_type"; 152 private static final String KEY_DEVICE_ROLE = "device_role"; 153 private static final String KEY_RANGING_ROUND_USAGE = "ranging_round_usage"; 154 private static final String KEY_MULTI_NODE_MODE = "multi_node_mode"; 155 private static final String KEY_DEVICE_ADDRESS = "device_address"; 156 private static final String KEY_DEST_ADDRESS_LIST = "dest_address_list"; 157 private static final String KEY_INITIATION_TIME_MS = "initiation_time_ms"; 158 private static final String KEY_SLOT_DURATION_RSTU = "slot_duration_rstu"; 159 private static final String KEY_SLOTS_PER_RANGING_ROUND = "slots_per_ranging_round"; 160 private static final String KEY_RANGING_INTERVAL_MS = "ranging_interval_ms"; 161 private static final String KEY_BLOCK_STRIDE_LENGTH = "block_stride_length"; 162 private static final String KEY_HOPPING_MODE = "hopping_mode"; 163 private static final String KEY_MAX_RANGING_ROUND_RETRIES = "max_ranging_round_retries"; 164 private static final String KEY_SESSION_PRIORITY = "session_priority"; 165 private static final String KEY_MAC_ADDRESS_MODE = "mac_address_mode"; 166 private static final String KEY_IN_BAND_TERMINATION_ATTEMPT_COUNT = 167 "in_band_termination_attempt_count"; 168 private static final String KEY_CHANNEL_NUMBER = "channel_number"; 169 private static final String KEY_PREAMBLE_CODE_INDEX = "preamble_code_index"; 170 private static final String KEY_RFRAME_CONFIG = "rframe_config"; 171 private static final String KEY_PRF_MODE = "prf_mode"; 172 private static final String KEY_CAP_SIZE_RANGE = "cap_size_range"; 173 private static final String KEY_SCHEDULED_MODE = "scheduled_mode"; 174 private static final String KEY_PREAMBLE_DURATION = "preamble_duration"; 175 private static final String KEY_SFD_ID = "sfd_id"; 176 private static final String KEY_STS_SEGMENT_COUNT = "sts_segment_count"; 177 private static final String KEY_STS_LENGTH = "sts_length"; 178 private static final String KEY_SESSION_KEY = "session_key"; 179 private static final String KEY_SUBSESSION_KEY = "subsession_key"; 180 private static final String KEY_PSDU_DATA_RATE = "psdu_data_rate"; 181 private static final String KEY_BPRF_PHR_DATA_RATE = "bprf_phr_data_rate"; 182 private static final String KEY_FCS_TYPE = "fcs_type"; 183 private static final String KEY_IS_TX_ADAPTIVE_PAYLOAD_POWER_ENABLED = 184 "is_tx_adaptive_payload_power_enabled"; 185 private static final String KEY_STS_CONFIG = "sts_config"; 186 private static final String KEY_SUB_SESSION_ID = "sub_session_id"; 187 private static final String KEY_VENDOR_ID = "vendor_id"; 188 private static final String KEY_STATIC_STS_IV = "static_sts_iv"; 189 private static final String KEY_IS_RSSI_REPORTING_ENABLED = "is_rssi_reporting_enabled"; 190 private static final String KEY_IS_DIAGNOSTICS_ENABLED = "is_diagnostics_enabled"; 191 private static final String KEY_DIAGRAMS_FRAME_REPORTS_FIELDS_FLAGS = 192 "diagrams_frame_reports_fields_flags"; 193 private static final String KEY_IS_KEY_ROTATION_ENABLED = "is_key_rotation_enabled"; 194 private static final String KEY_KEY_ROTATION_RATE = "key_rotation_rate"; 195 private static final String KEY_AOA_RESULT_REQUEST = "aoa_result_request"; 196 private static final String KEY_RANGE_DATA_NTF_CONFIG = "range_data_ntf_config"; 197 private static final String KEY_RANGE_DATA_NTF_PROXIMITY_NEAR = "range_data_ntf_proximity_near"; 198 private static final String KEY_RANGE_DATA_NTF_PROXIMITY_FAR = "range_data_ntf_proximity_far"; 199 private static final String KEY_RANGE_DATA_NTF_AOA_AZIMUTH_LOWER = 200 "range_data_ntf_aoa_azimuth_lower"; 201 private static final String KEY_RANGE_DATA_NTF_AOA_AZIMUTH_UPPER = 202 "range_data_ntf_aoa_azimuth_upper"; 203 private static final String KEY_RANGE_DATA_NTF_AOA_ELEVATION_LOWER = 204 "range_data_ntf_aoa_elevation_lower"; 205 private static final String KEY_RANGE_DATA_NTF_AOA_ELEVATION_UPPER = 206 "range_data_ntf_aoa_elevation_upper"; 207 private static final String KEY_HAS_TIME_OF_FLIGHT_REPORT = "has_time_of_flight_report"; 208 private static final String KEY_HAS_ANGLE_OF_ARRIVAL_AZIMUTH_REPORT = 209 "has_angle_of_arrival_azimuth_report"; 210 private static final String KEY_HAS_ANGLE_OF_ARRIVAL_ELEVATION_REPORT = 211 "has_angle_of_arrival_elevation_report"; 212 private static final String KEY_HAS_ANGLE_OF_ARRIVAL_FIGURE_OF_MERIT_REPORT = 213 "has_angle_of_arrival_figure_of_merit_report"; 214 // key value not the same as constant name to maintain backwards compatibility. 215 private static final String KEY_HAS_RANGING_RESULT_REPORT_MESSAGE = "has_result_report_phase"; 216 private static final String KEY_HAS_CONTROL_MESSAGE = "has_control_message"; 217 private static final String KEY_HAS_RANGING_CONTROL_PHASE = "has_ranging_control_phase"; 218 private static final String KEY_MEASUREMENT_REPORT_TYPE = "measurement_report_type"; 219 private static final String KEY_AOA_TYPE = "aoa_type"; 220 private static final String KEY_NUM_OF_MSRMT_FOCUS_ON_RANGE = 221 "num_of_msrmt_focus_on_range"; 222 private static final String KEY_NUM_OF_MSRMT_FOCUS_ON_AOA_AZIMUTH = 223 "num_of_msrmt_focus_on_aoa_azimuth"; 224 private static final String KEY_NUM_OF_MSRMT_FOCUS_ON_AOA_ELEVATION = 225 "num_of_msrmt_focus_on_aoa_elevation"; 226 private static final String RANGING_ERROR_STREAK_TIMEOUT_MS = 227 "ranging_error_streak_timeout_ms"; 228 private static final String KEY_LINK_LAYER_MODE = 229 "link_layer_mode"; 230 private static final String KEY_MIN_FRAMES_PER_RR = 231 "min_frames_per_rr"; 232 private static final String KEY_MTU_SIZE = 233 "mtu_size"; 234 private static final String KEY_INTER_FRAME_INTERVAL = 235 "inter_frame_interval"; 236 private static final String UL_TDOA_TX_INTERVAL = "ul_tdoa_tx_interval"; 237 private static final String UL_TDOA_RANDOM_WINDOW = "ul_tdoa_random_window"; 238 private static final String UL_TDOA_DEVICE_ID_TYPE = "ul_tdoa_device_id_type"; 239 private static final String UL_TDOA_DEVICE_ID = "ul_tdoa_device_id"; 240 private static final String UL_TDOA_TX_TIMESTAMP_TYPE = "ul_tdoa_tx_timestamp_type"; 241 private static final String KEY_FILTER_TYPE = "filter_type"; 242 private static final String KEY_MAX_NUMBER_OF_MEASUREMENTS = "max_number_of_measurements"; 243 FiraOpenSessionParams( FiraProtocolVersion protocolVersion, int sessionId, @SessionType int sessionType, @RangingDeviceType int deviceType, @RangingDeviceRole int deviceRole, @RangingRoundUsage int rangingRoundUsage, @MultiNodeMode int multiNodeMode, UwbAddress deviceAddress, List<UwbAddress> destAddressList, long initiationTime, int slotDurationRstu, int slotsPerRangingRound, int rangingIntervalMs, int blockStrideLength, int hoppingMode, @IntRange(from = 0, to = 65535) int maxRangingRoundRetries, int sessionPriority, @MacAddressMode int macAddressMode, boolean hasRangingResultReportMessage, boolean hasControlMessage, boolean hasRangingControlPhase, @MeasurementReportType int measurementReportType, @IntRange(from = 1, to = 10) int inBandTerminationAttemptCount, @UwbChannel int channelNumber, int preambleCodeIndex, @RframeConfig int rframeConfig, @PrfMode int prfMode, byte[] capSize, @SchedulingMode int scheduledMode, @PreambleDuration int preambleDuration, @SfdIdValue int sfdId, @StsSegmentCountValue int stsSegmentCount, @StsLength int stsLength, @Nullable byte[] sessionKey, @Nullable byte[] subsessionKey, @PsduDataRate int psduDataRate, @BprfPhrDataRate int bprfPhrDataRate, @MacFcsType int fcsType, boolean isTxAdaptivePayloadPowerEnabled, @StsConfig int stsConfig, int subSessionId, @Nullable byte[] vendorId, @Nullable byte[] staticStsIV, boolean isRssiReportingEnabled, boolean isDiagnosticsEnabled, byte diagramsFrameReportsFieldsFlags, boolean isKeyRotationEnabled, int keyRotationRate, @AoaResultRequestMode int aoaResultRequest, @RangeDataNtfConfig int rangeDataNtfConfig, int rangeDataNtfProximityNear, int rangeDataNtfProximityFar, double rangeDataNtfAoaAzimuthLower, double rangeDataNtfAoaAzimuthUpper, double rangeDataNtfAoaElevationLower, double rangeDataNtfAoaElevationUpper, boolean hasTimeOfFlightReport, boolean hasAngleOfArrivalAzimuthReport, boolean hasAngleOfArrivalElevationReport, boolean hasAngleOfArrivalFigureOfMeritReport, @AoaType int aoaType, int numOfMsrmtFocusOnRange, int numOfMsrmtFocusOnAoaAzimuth, int numOfMsrmtFocusOnAoaElevation, Long rangingErrorStreakTimeoutMs, int linkLayerMode, int minFramePerRr, int mtuSize, int interFrameInterval, int ulTdoaTxIntervalMs, int ulTdoaRandomWindowMs, int ulTdoaDeviceIdType, @Nullable byte[] ulTdoaDeviceId, int ulTdoaTxTimestampType, int filterType, int maxNumberOfMeasurements)244 private FiraOpenSessionParams( 245 FiraProtocolVersion protocolVersion, 246 int sessionId, 247 @SessionType int sessionType, 248 @RangingDeviceType int deviceType, 249 @RangingDeviceRole int deviceRole, 250 @RangingRoundUsage int rangingRoundUsage, 251 @MultiNodeMode int multiNodeMode, 252 UwbAddress deviceAddress, 253 List<UwbAddress> destAddressList, 254 long initiationTime, 255 int slotDurationRstu, 256 int slotsPerRangingRound, 257 int rangingIntervalMs, 258 int blockStrideLength, 259 int hoppingMode, 260 @IntRange(from = 0, to = 65535) int maxRangingRoundRetries, 261 int sessionPriority, 262 @MacAddressMode int macAddressMode, 263 boolean hasRangingResultReportMessage, 264 boolean hasControlMessage, 265 boolean hasRangingControlPhase, 266 @MeasurementReportType int measurementReportType, 267 @IntRange(from = 1, to = 10) int inBandTerminationAttemptCount, 268 @UwbChannel int channelNumber, 269 int preambleCodeIndex, 270 @RframeConfig int rframeConfig, 271 @PrfMode int prfMode, 272 byte[] capSize, 273 @SchedulingMode int scheduledMode, 274 @PreambleDuration int preambleDuration, 275 @SfdIdValue int sfdId, 276 @StsSegmentCountValue int stsSegmentCount, 277 @StsLength int stsLength, 278 @Nullable byte[] sessionKey, 279 @Nullable byte[] subsessionKey, 280 @PsduDataRate int psduDataRate, 281 @BprfPhrDataRate int bprfPhrDataRate, 282 @MacFcsType int fcsType, 283 boolean isTxAdaptivePayloadPowerEnabled, 284 @StsConfig int stsConfig, 285 int subSessionId, 286 @Nullable byte[] vendorId, 287 @Nullable byte[] staticStsIV, 288 boolean isRssiReportingEnabled, 289 boolean isDiagnosticsEnabled, 290 byte diagramsFrameReportsFieldsFlags, 291 boolean isKeyRotationEnabled, 292 int keyRotationRate, 293 @AoaResultRequestMode int aoaResultRequest, 294 @RangeDataNtfConfig int rangeDataNtfConfig, 295 int rangeDataNtfProximityNear, 296 int rangeDataNtfProximityFar, 297 double rangeDataNtfAoaAzimuthLower, 298 double rangeDataNtfAoaAzimuthUpper, 299 double rangeDataNtfAoaElevationLower, 300 double rangeDataNtfAoaElevationUpper, 301 boolean hasTimeOfFlightReport, 302 boolean hasAngleOfArrivalAzimuthReport, 303 boolean hasAngleOfArrivalElevationReport, 304 boolean hasAngleOfArrivalFigureOfMeritReport, 305 @AoaType int aoaType, 306 int numOfMsrmtFocusOnRange, 307 int numOfMsrmtFocusOnAoaAzimuth, 308 int numOfMsrmtFocusOnAoaElevation, 309 Long rangingErrorStreakTimeoutMs, 310 int linkLayerMode, 311 int minFramePerRr, 312 int mtuSize, 313 int interFrameInterval, 314 int ulTdoaTxIntervalMs, 315 int ulTdoaRandomWindowMs, 316 int ulTdoaDeviceIdType, 317 @Nullable byte[] ulTdoaDeviceId, 318 int ulTdoaTxTimestampType, 319 int filterType, 320 int maxNumberOfMeasurements) { 321 mProtocolVersion = protocolVersion; 322 mSessionId = sessionId; 323 mSessionType = sessionType; 324 mDeviceType = deviceType; 325 mDeviceRole = deviceRole; 326 mRangingRoundUsage = rangingRoundUsage; 327 mMultiNodeMode = multiNodeMode; 328 mDeviceAddress = deviceAddress; 329 mDestAddressList = destAddressList; 330 mInitiationTime = initiationTime; 331 mSlotDurationRstu = slotDurationRstu; 332 mSlotsPerRangingRound = slotsPerRangingRound; 333 mRangingIntervalMs = rangingIntervalMs; 334 mBlockStrideLength = blockStrideLength; 335 mHoppingMode = hoppingMode; 336 mMaxRangingRoundRetries = maxRangingRoundRetries; 337 mSessionPriority = sessionPriority; 338 mMacAddressMode = macAddressMode; 339 mHasRangingResultReportMessage = hasRangingResultReportMessage; 340 mHasControlMessage = hasControlMessage; 341 mHasRangingControlPhase = hasRangingControlPhase; 342 mMeasurementReportType = measurementReportType; 343 mInBandTerminationAttemptCount = inBandTerminationAttemptCount; 344 mChannelNumber = channelNumber; 345 mPreambleCodeIndex = preambleCodeIndex; 346 mRframeConfig = rframeConfig; 347 mPrfMode = prfMode; 348 mCapSize = capSize; 349 mScheduledMode = scheduledMode; 350 mPreambleDuration = preambleDuration; 351 mSfdId = sfdId; 352 mStsSegmentCount = stsSegmentCount; 353 mStsLength = stsLength; 354 mSessionKey = sessionKey; 355 mSubSessionKey = subsessionKey; 356 mPsduDataRate = psduDataRate; 357 mBprfPhrDataRate = bprfPhrDataRate; 358 mFcsType = fcsType; 359 mIsTxAdaptivePayloadPowerEnabled = isTxAdaptivePayloadPowerEnabled; 360 mStsConfig = stsConfig; 361 mSubSessionId = subSessionId; 362 mVendorId = vendorId; 363 mStaticStsIV = staticStsIV; 364 mIsRssiReportingEnabled = isRssiReportingEnabled; 365 mIsDiagnosticsEnabled = isDiagnosticsEnabled; 366 mDiagramsFrameReportsFieldsFlags = diagramsFrameReportsFieldsFlags; 367 mIsKeyRotationEnabled = isKeyRotationEnabled; 368 mKeyRotationRate = keyRotationRate; 369 mAoaResultRequest = aoaResultRequest; 370 mRangeDataNtfConfig = rangeDataNtfConfig; 371 mRangeDataNtfProximityNear = rangeDataNtfProximityNear; 372 mRangeDataNtfProximityFar = rangeDataNtfProximityFar; 373 mRangeDataNtfAoaAzimuthLower = rangeDataNtfAoaAzimuthLower; 374 mRangeDataNtfAoaAzimuthUpper = rangeDataNtfAoaAzimuthUpper; 375 mRangeDataNtfAoaElevationLower = rangeDataNtfAoaElevationLower; 376 mRangeDataNtfAoaElevationUpper = rangeDataNtfAoaElevationUpper; 377 mHasTimeOfFlightReport = hasTimeOfFlightReport; 378 mHasAngleOfArrivalAzimuthReport = hasAngleOfArrivalAzimuthReport; 379 mHasAngleOfArrivalElevationReport = hasAngleOfArrivalElevationReport; 380 mHasAngleOfArrivalFigureOfMeritReport = hasAngleOfArrivalFigureOfMeritReport; 381 mAoaType = aoaType; 382 mNumOfMsrmtFocusOnRange = numOfMsrmtFocusOnRange; 383 mNumOfMsrmtFocusOnAoaAzimuth = numOfMsrmtFocusOnAoaAzimuth; 384 mNumOfMsrmtFocusOnAoaElevation = numOfMsrmtFocusOnAoaElevation; 385 mRangingErrorStreakTimeoutMs = rangingErrorStreakTimeoutMs; 386 mLinkLayerMode = linkLayerMode; 387 mMinFramesPerRr = minFramePerRr; 388 mMtuSize = mtuSize; 389 mInterFrameInterval = interFrameInterval; 390 mUlTdoaTxIntervalMs = ulTdoaTxIntervalMs; 391 mUlTdoaRandomWindowMs = ulTdoaRandomWindowMs; 392 mUlTdoaDeviceIdType = ulTdoaDeviceIdType; 393 mUlTdoaDeviceId = ulTdoaDeviceId; 394 mUlTdoaTxTimestampType = ulTdoaTxTimestampType; 395 mFilterType = filterType; 396 mMaxNumberOfMeasurements = maxNumberOfMeasurements; 397 } 398 399 @Override getBundleVersion()400 protected int getBundleVersion() { 401 return BUNDLE_VERSION_CURRENT; 402 } 403 getSessionId()404 public int getSessionId() { 405 return mSessionId; 406 } 407 408 @SessionType getSessionType()409 public int getSessionType() { 410 return mSessionType; 411 } 412 413 @RangingDeviceType getDeviceType()414 public int getDeviceType() { 415 return mDeviceType; 416 } 417 418 @RangingDeviceRole getDeviceRole()419 public int getDeviceRole() { 420 return mDeviceRole; 421 } 422 423 @RangingRoundUsage getRangingRoundUsage()424 public int getRangingRoundUsage() { 425 return mRangingRoundUsage; 426 } 427 428 @MultiNodeMode getMultiNodeMode()429 public int getMultiNodeMode() { 430 return mMultiNodeMode; 431 } 432 getDeviceAddress()433 public UwbAddress getDeviceAddress() { 434 return mDeviceAddress; 435 } 436 getDestAddressList()437 public List<UwbAddress> getDestAddressList() { 438 return Collections.unmodifiableList(mDestAddressList); 439 } 440 getInitiationTime()441 public long getInitiationTime() { 442 return mInitiationTime; 443 } 444 getSlotDurationRstu()445 public int getSlotDurationRstu() { 446 return mSlotDurationRstu; 447 } 448 getSlotsPerRangingRound()449 public int getSlotsPerRangingRound() { 450 return mSlotsPerRangingRound; 451 } 452 getRangingIntervalMs()453 public int getRangingIntervalMs() { 454 return mRangingIntervalMs; 455 } 456 getBlockStrideLength()457 public int getBlockStrideLength() { 458 return mBlockStrideLength; 459 } 460 getHoppingMode()461 public int getHoppingMode() { 462 return mHoppingMode; 463 } 464 465 @IntRange(from = 0, to = 65535) getMaxRangingRoundRetries()466 public int getMaxRangingRoundRetries() { 467 return mMaxRangingRoundRetries; 468 } 469 getSessionPriority()470 public int getSessionPriority() { 471 return mSessionPriority; 472 } 473 474 @MacAddressMode getMacAddressMode()475 public int getMacAddressMode() { 476 return mMacAddressMode; 477 } 478 hasRangingResultReportMessage()479 public boolean hasRangingResultReportMessage() { 480 return mHasRangingResultReportMessage; 481 } 482 hasControlMessage()483 public boolean hasControlMessage() { 484 return mHasControlMessage; 485 } 486 hasRangingControlPhase()487 public boolean hasRangingControlPhase() { 488 return mHasRangingControlPhase; 489 } 490 491 @MeasurementReportType getMeasurementReportType()492 public int getMeasurementReportType() { 493 return mMeasurementReportType; 494 } 495 496 @IntRange(from = 1, to = 10) getInBandTerminationAttemptCount()497 public int getInBandTerminationAttemptCount() { 498 return mInBandTerminationAttemptCount; 499 } 500 501 @UwbChannel getChannelNumber()502 public int getChannelNumber() { 503 return mChannelNumber; 504 } 505 getPreambleCodeIndex()506 public int getPreambleCodeIndex() { 507 return mPreambleCodeIndex; 508 } 509 510 @RframeConfig getRframeConfig()511 public int getRframeConfig() { 512 return mRframeConfig; 513 } 514 515 @PrfMode getPrfMode()516 public int getPrfMode() { 517 return mPrfMode; 518 } 519 getCapSize()520 public byte[] getCapSize() { 521 return mCapSize; 522 } 523 524 @SchedulingMode getScheduledMode()525 public int getScheduledMode() { 526 return mScheduledMode; 527 } 528 529 @PreambleDuration getPreambleDuration()530 public int getPreambleDuration() { 531 return mPreambleDuration; 532 } 533 534 @SfdIdValue getSfdId()535 public int getSfdId() { 536 return mSfdId; 537 } 538 539 @StsSegmentCountValue getStsSegmentCount()540 public int getStsSegmentCount() { 541 return mStsSegmentCount; 542 } 543 544 @StsLength getStsLength()545 public int getStsLength() { 546 return mStsLength; 547 } 548 549 @Nullable getSessionKey()550 public byte[] getSessionKey() { 551 return mSessionKey; 552 } 553 554 @Nullable getSubsessionKey()555 public byte[] getSubsessionKey() { 556 return mSubSessionKey; 557 } 558 559 @PsduDataRate getPsduDataRate()560 public int getPsduDataRate() { 561 return mPsduDataRate; 562 } 563 564 @BprfPhrDataRate getBprfPhrDataRate()565 public int getBprfPhrDataRate() { 566 return mBprfPhrDataRate; 567 } 568 569 @MacFcsType getFcsType()570 public int getFcsType() { 571 return mFcsType; 572 } 573 isTxAdaptivePayloadPowerEnabled()574 public boolean isTxAdaptivePayloadPowerEnabled() { 575 return mIsTxAdaptivePayloadPowerEnabled; 576 } 577 578 @StsConfig getStsConfig()579 public int getStsConfig() { 580 return mStsConfig; 581 } 582 getSubSessionId()583 public int getSubSessionId() { 584 return mSubSessionId; 585 } 586 587 @Nullable getVendorId()588 public byte[] getVendorId() { 589 return mVendorId; 590 } 591 592 @Nullable getStaticStsIV()593 public byte[] getStaticStsIV() { 594 return mStaticStsIV; 595 } 596 isRssiReportingEnabled()597 public boolean isRssiReportingEnabled() { 598 return mIsRssiReportingEnabled; 599 } 600 isDiagnosticsEnabled()601 public boolean isDiagnosticsEnabled() { 602 return mIsDiagnosticsEnabled; 603 } 604 getDiagramsFrameReportsFieldsFlags()605 public byte getDiagramsFrameReportsFieldsFlags() { 606 return mDiagramsFrameReportsFieldsFlags; 607 } 608 isKeyRotationEnabled()609 public boolean isKeyRotationEnabled() { 610 return mIsKeyRotationEnabled; 611 } 612 getKeyRotationRate()613 public int getKeyRotationRate() { 614 return mKeyRotationRate; 615 } 616 617 @AoaResultRequestMode getAoaResultRequest()618 public int getAoaResultRequest() { 619 return mAoaResultRequest; 620 } 621 622 @RangeDataNtfConfig getRangeDataNtfConfig()623 public int getRangeDataNtfConfig() { 624 return mRangeDataNtfConfig; 625 } 626 getRangeDataNtfProximityNear()627 public int getRangeDataNtfProximityNear() { 628 return mRangeDataNtfProximityNear; 629 } 630 getRangeDataNtfProximityFar()631 public int getRangeDataNtfProximityFar() { 632 return mRangeDataNtfProximityFar; 633 } 634 getRangeDataNtfAoaAzimuthLower()635 public double getRangeDataNtfAoaAzimuthLower() { 636 return mRangeDataNtfAoaAzimuthLower; 637 } 638 getRangeDataNtfAoaAzimuthUpper()639 public double getRangeDataNtfAoaAzimuthUpper() { 640 return mRangeDataNtfAoaAzimuthUpper; 641 } 642 getRangeDataNtfAoaElevationLower()643 public double getRangeDataNtfAoaElevationLower() { 644 return mRangeDataNtfAoaElevationLower; 645 } 646 getRangeDataNtfAoaElevationUpper()647 public double getRangeDataNtfAoaElevationUpper() { 648 return mRangeDataNtfAoaElevationUpper; 649 } 650 hasTimeOfFlightReport()651 public boolean hasTimeOfFlightReport() { 652 return mHasTimeOfFlightReport; 653 } 654 hasAngleOfArrivalAzimuthReport()655 public boolean hasAngleOfArrivalAzimuthReport() { 656 return mHasAngleOfArrivalAzimuthReport; 657 } 658 hasAngleOfArrivalElevationReport()659 public boolean hasAngleOfArrivalElevationReport() { 660 return mHasAngleOfArrivalElevationReport; 661 } 662 hasAngleOfArrivalFigureOfMeritReport()663 public boolean hasAngleOfArrivalFigureOfMeritReport() { 664 return mHasAngleOfArrivalFigureOfMeritReport; 665 } 666 667 @AoaType getAoaType()668 public int getAoaType() { 669 return mAoaType; 670 } 671 getNumOfMsrmtFocusOnRange()672 public int getNumOfMsrmtFocusOnRange() { 673 return mNumOfMsrmtFocusOnRange; 674 } 675 getNumOfMsrmtFocusOnAoaAzimuth()676 public int getNumOfMsrmtFocusOnAoaAzimuth() { 677 return mNumOfMsrmtFocusOnAoaAzimuth; 678 } 679 getNumOfMsrmtFocusOnAoaElevation()680 public int getNumOfMsrmtFocusOnAoaElevation() { 681 return mNumOfMsrmtFocusOnAoaElevation; 682 } 683 getRangingErrorStreakTimeoutMs()684 public long getRangingErrorStreakTimeoutMs() { 685 return mRangingErrorStreakTimeoutMs; 686 } 687 getLinkLayerMode()688 public int getLinkLayerMode() { 689 return mLinkLayerMode; 690 } 691 getMinFramesPerRr()692 public int getMinFramesPerRr() { 693 return mMinFramesPerRr; 694 } 695 getMtuSize()696 public int getMtuSize() { 697 return mMtuSize; 698 } 699 getInterFrameInterval()700 public int getInterFrameInterval() { 701 return mInterFrameInterval; 702 } 703 getUlTdoaTxIntervalMs()704 public int getUlTdoaTxIntervalMs() { 705 return mUlTdoaTxIntervalMs; 706 } 707 getUlTdoaRandomWindowMs()708 public int getUlTdoaRandomWindowMs() { 709 return mUlTdoaRandomWindowMs; 710 } 711 getUlTdoaDeviceIdType()712 public int getUlTdoaDeviceIdType() { 713 return mUlTdoaDeviceIdType; 714 } 715 716 @Nullable getUlTdoaDeviceId()717 public byte[] getUlTdoaDeviceId() { 718 return mUlTdoaDeviceId; 719 } 720 getUlTdoaTxTimestampType()721 public int getUlTdoaTxTimestampType() { 722 return mUlTdoaTxTimestampType; 723 } 724 725 @FilterType getFilterType()726 public int getFilterType() { 727 return mFilterType; 728 } 729 getMaxNumberOfMeasurements()730 public int getMaxNumberOfMeasurements() { return mMaxNumberOfMeasurements; } 731 732 @Nullable byteArrayToIntArray(@ullable byte[] bytes)733 private static int[] byteArrayToIntArray(@Nullable byte[] bytes) { 734 if (bytes == null) { 735 return null; 736 } 737 738 int[] values = new int[bytes.length]; 739 for (int i = 0; i < values.length; i++) { 740 values[i] = bytes[i]; 741 } 742 return values; 743 } 744 745 @Nullable intArrayToByteArray(@ullable int[] values)746 private static byte[] intArrayToByteArray(@Nullable int[] values) { 747 if (values == null) { 748 return null; 749 } 750 byte[] bytes = new byte[values.length]; 751 for (int i = 0; i < values.length; i++) { 752 bytes[i] = (byte) values[i]; 753 } 754 return bytes; 755 } 756 757 @Override toBundle()758 public PersistableBundle toBundle() { 759 PersistableBundle bundle = super.toBundle(); 760 bundle.putString(KEY_PROTOCOL_VERSION, mProtocolVersion.toString()); 761 bundle.putInt(KEY_SESSION_ID, mSessionId); 762 bundle.putInt(KEY_SESSION_TYPE, mSessionType); 763 bundle.putInt(KEY_DEVICE_TYPE, mDeviceType); 764 bundle.putInt(KEY_DEVICE_ROLE, mDeviceRole); 765 bundle.putInt(KEY_RANGING_ROUND_USAGE, mRangingRoundUsage); 766 bundle.putInt(KEY_MULTI_NODE_MODE, mMultiNodeMode); 767 // Always store address as long in bundle. 768 bundle.putLong(KEY_DEVICE_ADDRESS, uwbAddressToLong(mDeviceAddress)); 769 770 // Dest Address list needs to be converted to long array. 771 long[] destAddressList = new long[mDestAddressList.size()]; 772 int i = 0; 773 for (UwbAddress destAddress : mDestAddressList) { 774 destAddressList[i++] = uwbAddressToLong(destAddress); 775 } 776 bundle.putLongArray(KEY_DEST_ADDRESS_LIST, destAddressList); 777 778 bundle.putLong(KEY_INITIATION_TIME_MS, mInitiationTime); 779 bundle.putInt(KEY_SLOT_DURATION_RSTU, mSlotDurationRstu); 780 bundle.putInt(KEY_SLOTS_PER_RANGING_ROUND, mSlotsPerRangingRound); 781 bundle.putInt(KEY_RANGING_INTERVAL_MS, mRangingIntervalMs); 782 bundle.putInt(KEY_BLOCK_STRIDE_LENGTH, mBlockStrideLength); 783 bundle.putInt(KEY_HOPPING_MODE, mHoppingMode); 784 bundle.putInt(KEY_MAX_RANGING_ROUND_RETRIES, mMaxRangingRoundRetries); 785 bundle.putInt(KEY_SESSION_PRIORITY, mSessionPriority); 786 bundle.putInt(KEY_MAC_ADDRESS_MODE, mMacAddressMode); 787 bundle.putBoolean(KEY_HAS_RANGING_RESULT_REPORT_MESSAGE, mHasRangingResultReportMessage); 788 bundle.putBoolean(KEY_HAS_CONTROL_MESSAGE, mHasControlMessage); 789 bundle.putBoolean(KEY_HAS_RANGING_CONTROL_PHASE, mHasRangingControlPhase); 790 bundle.putInt(KEY_MEASUREMENT_REPORT_TYPE, mMeasurementReportType); 791 bundle.putInt(KEY_IN_BAND_TERMINATION_ATTEMPT_COUNT, mInBandTerminationAttemptCount); 792 bundle.putInt(KEY_CHANNEL_NUMBER, mChannelNumber); 793 bundle.putInt(KEY_PREAMBLE_CODE_INDEX, mPreambleCodeIndex); 794 bundle.putInt(KEY_RFRAME_CONFIG, mRframeConfig); 795 bundle.putInt(KEY_PRF_MODE, mPrfMode); 796 bundle.putInt(KEY_SCHEDULED_MODE, mScheduledMode); 797 if (mScheduledMode == CONTENTION_BASED_RANGING) { 798 bundle.putIntArray(KEY_CAP_SIZE_RANGE, byteArrayToIntArray(mCapSize)); 799 } 800 bundle.putInt(KEY_PREAMBLE_DURATION, mPreambleDuration); 801 bundle.putInt(KEY_SFD_ID, mSfdId); 802 bundle.putInt(KEY_STS_SEGMENT_COUNT, mStsSegmentCount); 803 bundle.putInt(KEY_STS_LENGTH, mStsLength); 804 bundle.putIntArray(KEY_SESSION_KEY, byteArrayToIntArray(mSessionKey)); 805 bundle.putIntArray(KEY_SUBSESSION_KEY, byteArrayToIntArray(mSubSessionKey)); 806 bundle.putInt(KEY_PSDU_DATA_RATE, mPsduDataRate); 807 bundle.putInt(KEY_BPRF_PHR_DATA_RATE, mBprfPhrDataRate); 808 bundle.putInt(KEY_FCS_TYPE, mFcsType); 809 bundle.putBoolean( 810 KEY_IS_TX_ADAPTIVE_PAYLOAD_POWER_ENABLED, mIsTxAdaptivePayloadPowerEnabled); 811 bundle.putInt(KEY_STS_CONFIG, mStsConfig); 812 if (mStsConfig == STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY) { 813 bundle.putInt(KEY_SUB_SESSION_ID, mSubSessionId); 814 } 815 if (mStsConfig == STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY) { 816 bundle.putInt(KEY_SUB_SESSION_ID, mSubSessionId); 817 } 818 bundle.putIntArray(KEY_VENDOR_ID, byteArrayToIntArray(mVendorId)); 819 bundle.putIntArray(KEY_STATIC_STS_IV, byteArrayToIntArray(mStaticStsIV)); 820 bundle.putBoolean(KEY_IS_RSSI_REPORTING_ENABLED, mIsRssiReportingEnabled); 821 bundle.putBoolean(KEY_IS_DIAGNOSTICS_ENABLED, mIsDiagnosticsEnabled); 822 bundle.putInt(KEY_DIAGRAMS_FRAME_REPORTS_FIELDS_FLAGS, mDiagramsFrameReportsFieldsFlags); 823 bundle.putBoolean(KEY_IS_KEY_ROTATION_ENABLED, mIsKeyRotationEnabled); 824 bundle.putInt(KEY_KEY_ROTATION_RATE, mKeyRotationRate); 825 bundle.putInt(KEY_AOA_RESULT_REQUEST, mAoaResultRequest); 826 bundle.putInt(KEY_RANGE_DATA_NTF_CONFIG, mRangeDataNtfConfig); 827 bundle.putInt(KEY_RANGE_DATA_NTF_PROXIMITY_NEAR, mRangeDataNtfProximityNear); 828 bundle.putInt(KEY_RANGE_DATA_NTF_PROXIMITY_FAR, mRangeDataNtfProximityFar); 829 bundle.putDouble(KEY_RANGE_DATA_NTF_AOA_AZIMUTH_LOWER, mRangeDataNtfAoaAzimuthLower); 830 bundle.putDouble(KEY_RANGE_DATA_NTF_AOA_AZIMUTH_UPPER, mRangeDataNtfAoaAzimuthUpper); 831 bundle.putDouble(KEY_RANGE_DATA_NTF_AOA_ELEVATION_LOWER, mRangeDataNtfAoaElevationLower); 832 bundle.putDouble(KEY_RANGE_DATA_NTF_AOA_ELEVATION_UPPER, mRangeDataNtfAoaElevationUpper); 833 bundle.putBoolean(KEY_HAS_TIME_OF_FLIGHT_REPORT, mHasTimeOfFlightReport); 834 bundle.putBoolean(KEY_HAS_ANGLE_OF_ARRIVAL_AZIMUTH_REPORT, mHasAngleOfArrivalAzimuthReport); 835 bundle.putBoolean( 836 KEY_HAS_ANGLE_OF_ARRIVAL_ELEVATION_REPORT, mHasAngleOfArrivalElevationReport); 837 bundle.putBoolean( 838 KEY_HAS_ANGLE_OF_ARRIVAL_FIGURE_OF_MERIT_REPORT, 839 mHasAngleOfArrivalFigureOfMeritReport); 840 bundle.putInt(KEY_AOA_TYPE, mAoaType); 841 bundle.putInt(KEY_NUM_OF_MSRMT_FOCUS_ON_RANGE, mNumOfMsrmtFocusOnRange); 842 bundle.putInt(KEY_NUM_OF_MSRMT_FOCUS_ON_AOA_AZIMUTH, mNumOfMsrmtFocusOnAoaAzimuth); 843 bundle.putInt(KEY_NUM_OF_MSRMT_FOCUS_ON_AOA_ELEVATION, mNumOfMsrmtFocusOnAoaElevation); 844 bundle.putLong(RANGING_ERROR_STREAK_TIMEOUT_MS, mRangingErrorStreakTimeoutMs); 845 bundle.putInt(KEY_LINK_LAYER_MODE, mLinkLayerMode); 846 bundle.putInt(KEY_MIN_FRAMES_PER_RR, mMinFramesPerRr); 847 bundle.putInt(KEY_MTU_SIZE, mMtuSize); 848 bundle.putInt(KEY_INTER_FRAME_INTERVAL, mInterFrameInterval); 849 bundle.putInt(UL_TDOA_TX_INTERVAL, mUlTdoaTxIntervalMs); 850 bundle.putInt(UL_TDOA_RANDOM_WINDOW, mUlTdoaRandomWindowMs); 851 bundle.putInt(UL_TDOA_DEVICE_ID_TYPE, mUlTdoaDeviceIdType); 852 bundle.putIntArray(UL_TDOA_DEVICE_ID, byteArrayToIntArray(mUlTdoaDeviceId)); 853 bundle.putInt(UL_TDOA_TX_TIMESTAMP_TYPE, mUlTdoaTxTimestampType); 854 bundle.putInt(KEY_FILTER_TYPE, mFilterType); 855 bundle.putInt(KEY_MAX_NUMBER_OF_MEASUREMENTS, mMaxNumberOfMeasurements); 856 return bundle; 857 } 858 fromBundle(PersistableBundle bundle)859 public static FiraOpenSessionParams fromBundle(PersistableBundle bundle) { 860 if (!isCorrectProtocol(bundle)) { 861 throw new IllegalArgumentException("Invalid protocol"); 862 } 863 864 switch (getBundleVersion(bundle)) { 865 case BUNDLE_VERSION_1: 866 return parseBundleVersion1(bundle); 867 868 default: 869 throw new IllegalArgumentException("unknown bundle version"); 870 } 871 } 872 parseBundleVersion1(PersistableBundle bundle)873 private static FiraOpenSessionParams parseBundleVersion1(PersistableBundle bundle) { 874 int macAddressMode = bundle.getInt(KEY_MAC_ADDRESS_MODE); 875 int addressByteLength = 2; 876 if (macAddressMode == MAC_ADDRESS_MODE_8_BYTES) { 877 addressByteLength = 8; 878 } 879 UwbAddress deviceAddress = 880 longToUwbAddress(bundle.getLong(KEY_DEVICE_ADDRESS), addressByteLength); 881 882 long[] destAddresses = bundle.getLongArray(KEY_DEST_ADDRESS_LIST); 883 List<UwbAddress> destAddressList = new ArrayList<>(); 884 for (long address : destAddresses) { 885 destAddressList.add(longToUwbAddress(address, addressByteLength)); 886 } 887 888 FiraOpenSessionParams.Builder builder = new FiraOpenSessionParams.Builder() 889 .setProtocolVersion( 890 FiraProtocolVersion.fromString( 891 requireNonNull(bundle.getString(KEY_PROTOCOL_VERSION)))) 892 .setSessionId(bundle.getInt(KEY_SESSION_ID)) 893 .setSessionType(bundle.getInt(KEY_SESSION_TYPE, FiraParams.SESSION_TYPE_RANGING)) 894 .setDeviceType(bundle.getInt(KEY_DEVICE_TYPE)) 895 .setDeviceRole(bundle.getInt(KEY_DEVICE_ROLE)) 896 .setRangingRoundUsage(bundle.getInt(KEY_RANGING_ROUND_USAGE)) 897 .setMultiNodeMode(bundle.getInt(KEY_MULTI_NODE_MODE)) 898 .setDeviceAddress(deviceAddress) 899 .setDestAddressList(destAddressList) 900 // Changed from int to long. Look for int value, if long value not found to 901 // maintain backwards compatibility. 902 .setInitiationTime(bundle.getLong(KEY_INITIATION_TIME_MS)) 903 .setSlotDurationRstu(bundle.getInt(KEY_SLOT_DURATION_RSTU)) 904 .setSlotsPerRangingRound(bundle.getInt(KEY_SLOTS_PER_RANGING_ROUND)) 905 .setRangingIntervalMs(bundle.getInt(KEY_RANGING_INTERVAL_MS)) 906 .setBlockStrideLength(bundle.getInt(KEY_BLOCK_STRIDE_LENGTH)) 907 .setHoppingMode(bundle.getInt(KEY_HOPPING_MODE)) 908 .setMaxRangingRoundRetries(bundle.getInt(KEY_MAX_RANGING_ROUND_RETRIES)) 909 .setSessionPriority(bundle.getInt(KEY_SESSION_PRIORITY)) 910 .setMacAddressMode(bundle.getInt(KEY_MAC_ADDRESS_MODE)) 911 .setHasRangingResultReportMessage( 912 bundle.getBoolean(KEY_HAS_RANGING_RESULT_REPORT_MESSAGE)) 913 .setHasControlMessage( 914 bundle.getBoolean(KEY_HAS_CONTROL_MESSAGE, true)) 915 .setHasRangingControlPhase( 916 bundle.getBoolean(KEY_HAS_RANGING_CONTROL_PHASE, false)) 917 .setMeasurementReportType(bundle.getInt(KEY_MEASUREMENT_REPORT_TYPE)) 918 .setInBandTerminationAttemptCount( 919 bundle.getInt(KEY_IN_BAND_TERMINATION_ATTEMPT_COUNT)) 920 .setChannelNumber(bundle.getInt(KEY_CHANNEL_NUMBER)) 921 .setPreambleCodeIndex(bundle.getInt(KEY_PREAMBLE_CODE_INDEX)) 922 .setRframeConfig(bundle.getInt(KEY_RFRAME_CONFIG)) 923 .setPrfMode(bundle.getInt(KEY_PRF_MODE)) 924 .setCapSize(intArrayToByteArray(bundle.getIntArray(KEY_CAP_SIZE_RANGE))) 925 .setScheduledMode(bundle.getInt(KEY_SCHEDULED_MODE, TIME_SCHEDULED_RANGING)) 926 .setPreambleDuration(bundle.getInt(KEY_PREAMBLE_DURATION)) 927 .setSfdId(bundle.getInt(KEY_SFD_ID)) 928 .setStsSegmentCount(bundle.getInt(KEY_STS_SEGMENT_COUNT)) 929 .setStsLength(bundle.getInt(KEY_STS_LENGTH)) 930 .setSessionKey(intArrayToByteArray(bundle.getIntArray(KEY_SESSION_KEY))) 931 .setSubsessionKey(intArrayToByteArray(bundle.getIntArray(KEY_SUBSESSION_KEY))) 932 .setPsduDataRate(bundle.getInt(KEY_PSDU_DATA_RATE)) 933 .setBprfPhrDataRate(bundle.getInt(KEY_BPRF_PHR_DATA_RATE)) 934 .setFcsType(bundle.getInt(KEY_FCS_TYPE)) 935 .setIsTxAdaptivePayloadPowerEnabled( 936 bundle.getBoolean(KEY_IS_TX_ADAPTIVE_PAYLOAD_POWER_ENABLED)) 937 .setStsConfig(bundle.getInt(KEY_STS_CONFIG)) 938 .setSubSessionId(bundle.getInt(KEY_SUB_SESSION_ID)) 939 .setVendorId(intArrayToByteArray(bundle.getIntArray(KEY_VENDOR_ID))) 940 .setStaticStsIV(intArrayToByteArray(bundle.getIntArray(KEY_STATIC_STS_IV))) 941 .setIsRssiReportingEnabled(bundle.getBoolean(KEY_IS_RSSI_REPORTING_ENABLED)) 942 .setIsDiagnosticsEnabled(bundle.getBoolean(KEY_IS_DIAGNOSTICS_ENABLED, false)) 943 .setDiagramsFrameReportsFieldsFlags((byte) 944 bundle.getInt(KEY_DIAGRAMS_FRAME_REPORTS_FIELDS_FLAGS, 0)) 945 .setIsKeyRotationEnabled(bundle.getBoolean(KEY_IS_KEY_ROTATION_ENABLED)) 946 .setKeyRotationRate(bundle.getInt(KEY_KEY_ROTATION_RATE)) 947 .setAoaResultRequest(bundle.getInt(KEY_AOA_RESULT_REQUEST)) 948 .setRangeDataNtfConfig(bundle.getInt(KEY_RANGE_DATA_NTF_CONFIG)) 949 .setRangeDataNtfProximityNear(bundle.getInt(KEY_RANGE_DATA_NTF_PROXIMITY_NEAR)) 950 .setRangeDataNtfProximityFar(bundle.getInt(KEY_RANGE_DATA_NTF_PROXIMITY_FAR)) 951 .setRangeDataNtfAoaAzimuthLower( 952 bundle.getDouble(KEY_RANGE_DATA_NTF_AOA_AZIMUTH_LOWER, 953 RANGE_DATA_NTF_AOA_AZIMUTH_LOWER_DEFAULT)) 954 .setRangeDataNtfAoaAzimuthUpper( 955 bundle.getDouble(KEY_RANGE_DATA_NTF_AOA_AZIMUTH_UPPER, 956 RANGE_DATA_NTF_AOA_AZIMUTH_UPPER_DEFAULT)) 957 .setRangeDataNtfAoaElevationLower( 958 bundle.getDouble(KEY_RANGE_DATA_NTF_AOA_ELEVATION_LOWER, 959 RANGE_DATA_NTF_AOA_ELEVATION_LOWER_DEFAULT)) 960 .setRangeDataNtfAoaElevationUpper( 961 bundle.getDouble(KEY_RANGE_DATA_NTF_AOA_ELEVATION_UPPER, 962 RANGE_DATA_NTF_AOA_ELEVATION_UPPER_DEFAULT)) 963 .setHasTimeOfFlightReport(bundle.getBoolean(KEY_HAS_TIME_OF_FLIGHT_REPORT)) 964 .setHasAngleOfArrivalAzimuthReport( 965 bundle.getBoolean(KEY_HAS_ANGLE_OF_ARRIVAL_AZIMUTH_REPORT)) 966 .setHasAngleOfArrivalElevationReport( 967 bundle.getBoolean(KEY_HAS_ANGLE_OF_ARRIVAL_ELEVATION_REPORT)) 968 .setHasAngleOfArrivalFigureOfMeritReport( 969 bundle.getBoolean(KEY_HAS_ANGLE_OF_ARRIVAL_FIGURE_OF_MERIT_REPORT)) 970 .setAoaType(bundle.getInt(KEY_AOA_TYPE)) 971 .setMeasurementFocusRatio( 972 bundle.getInt(KEY_NUM_OF_MSRMT_FOCUS_ON_RANGE), 973 bundle.getInt(KEY_NUM_OF_MSRMT_FOCUS_ON_AOA_AZIMUTH), 974 bundle.getInt(KEY_NUM_OF_MSRMT_FOCUS_ON_AOA_ELEVATION)) 975 .setRangingErrorStreakTimeoutMs(bundle 976 .getLong(RANGING_ERROR_STREAK_TIMEOUT_MS, 10_000L)) 977 .setLinkLayerMode(bundle.getInt(KEY_LINK_LAYER_MODE, 0)) 978 .setMinFramePerRr(bundle.getInt(KEY_MIN_FRAMES_PER_RR, 1)) 979 .setMtuSize(bundle.getInt(KEY_MTU_SIZE, 1048)) 980 .setInterFrameInterval(bundle.getInt(KEY_INTER_FRAME_INTERVAL, 1)) 981 .setUlTdoaTxIntervalMs(bundle.getInt(UL_TDOA_TX_INTERVAL)) 982 .setUlTdoaRandomWindowMs(bundle.getInt(UL_TDOA_RANDOM_WINDOW)) 983 .setUlTdoaDeviceIdType(bundle.getInt(UL_TDOA_DEVICE_ID_TYPE)) 984 .setUlTdoaDeviceId(intArrayToByteArray(bundle.getIntArray(UL_TDOA_DEVICE_ID))) 985 .setUlTdoaTxTimestampType(bundle.getInt(UL_TDOA_TX_TIMESTAMP_TYPE)) 986 .setFilterType(bundle.getInt(KEY_FILTER_TYPE, FILTER_TYPE_DEFAULT)) 987 .setMaxNumberOfMeasurements(bundle.getInt( 988 KEY_MAX_NUMBER_OF_MEASUREMENTS, MAX_NUMBER_OF_MEASUREMENTS_DEFAULT)); 989 return builder.build(); 990 } 991 getProtocolVersion()992 public FiraProtocolVersion getProtocolVersion() { 993 return mProtocolVersion; 994 } 995 996 /** Returns a builder from the params. */ toBuilder()997 public Builder toBuilder() { 998 return new Builder(this); 999 } 1000 1001 /** Builder */ 1002 public static final class Builder { 1003 private final RequiredParam<FiraProtocolVersion> mProtocolVersion = new RequiredParam<>(); 1004 1005 private final RequiredParam<Integer> mSessionId = new RequiredParam<>(); 1006 @SessionType 1007 private int mSessionType = FiraParams.SESSION_TYPE_RANGING; 1008 private final RequiredParam<Integer> mDeviceType = new RequiredParam<>(); 1009 private final RequiredParam<Integer> mDeviceRole = new RequiredParam<>(); 1010 1011 /** UCI spec default: DS-TWR with deferred mode */ 1012 @RangingRoundUsage 1013 private int mRangingRoundUsage = RANGING_ROUND_USAGE_DS_TWR_DEFERRED_MODE; 1014 1015 private final RequiredParam<Integer> mMultiNodeMode = new RequiredParam<>(); 1016 private UwbAddress mDeviceAddress = null; 1017 private List<UwbAddress> mDestAddressList = null; 1018 1019 /** UCI spec default: 0ms */ 1020 private long mInitiationTime = 0; 1021 1022 /** UCI spec default: 2400 RSTU (2 ms). */ 1023 private int mSlotDurationRstu = 2400; 1024 1025 /** UCI spec default: 25 slots per ranging round. */ 1026 private int mSlotsPerRangingRound = SLOTS_PER_RR; 1027 1028 /** UCI spec default: RANGING_INTERVAL 200 ms */ 1029 private int mRangingIntervalMs = 200; 1030 1031 /** UCI spec default: no block striding. */ 1032 private int mBlockStrideLength = 0; 1033 1034 /** UCI spec default: no hopping. */ 1035 private int mHoppingMode = HOPPING_MODE_DISABLE; 1036 1037 /** UCI spec default: Termination is disabled and ranging round attempt is infinite */ 1038 @IntRange(from = 0, to = 65535) 1039 private int mMaxRangingRoundRetries = 0; 1040 1041 /** UCI spec default: priority 50 */ 1042 private int mSessionPriority = 50; 1043 1044 /** UCI spec default: 2-byte short address */ 1045 @MacAddressMode private int mMacAddressMode = MAC_ADDRESS_MODE_2_BYTES; 1046 1047 /** UCI spec default: RANGING_ROUND_CONTROL bit 0 default 1 */ 1048 private boolean mHasRangingResultReportMessage = true; 1049 1050 /** UCI spec default: RANGING_ROUND_CONTROL bit 1 default 1 */ 1051 private boolean mHasControlMessage = true; 1052 1053 /** UCI spec default: RANGING_ROUND_CONTROL bit 2 default 0 */ 1054 private boolean mHasRangingControlPhase = false; 1055 1056 /** UCI spec default: RANGING_ROUND_CONTROL bit 7 default 0 */ 1057 @MeasurementReportType 1058 private int mMeasurementReportType = MEASUREMENT_REPORT_TYPE_INITIATOR_TO_RESPONDER; 1059 1060 /** UCI spec default: in-band termination signal will be sent once. */ 1061 @IntRange(from = 1, to = 10) 1062 private int mInBandTerminationAttemptCount = 1; 1063 1064 /** UCI spec default: Channel 9, which is the only mandatory channel. */ 1065 @UwbChannel private int mChannelNumber = UWB_CHANNEL_9; 1066 1067 /** UCI spec default: index 10 */ 1068 @UwbPreambleCodeIndex private int mPreambleCodeIndex = UWB_PREAMBLE_CODE_INDEX_10; 1069 1070 /** UCI spec default: SP3 */ 1071 private int mRframeConfig = RFRAME_CONFIG_SP3; 1072 1073 /** UCI spec default: BPRF */ 1074 @PrfMode private int mPrfMode = PRF_MODE_BPRF; 1075 1076 /** UCI spec default: Octet [0] = SLOTS_PER_RR-1 Octet [1] = 0x05 */ 1077 private byte[] mCapSize = {(SLOTS_PER_RR - 1) , MIN_CAP_SIZE}; 1078 1079 /** UCI spec default: Time scheduled ranging */ 1080 @SchedulingMode private int mScheduledMode = TIME_SCHEDULED_RANGING; 1081 1082 /** UCI spec default: 64 symbols */ 1083 @PreambleDuration private int mPreambleDuration = PREAMBLE_DURATION_T64_SYMBOLS; 1084 1085 /** UCI spec default: ID 2 */ 1086 @SfdIdValue private int mSfdId = SFD_ID_VALUE_2; 1087 1088 /** UCI spec default: one STS segment */ 1089 @StsSegmentCountValue private int mStsSegmentCount = STS_SEGMENT_COUNT_VALUE_1; 1090 1091 /** UCI spec default: 64 symbols */ 1092 @StsLength private int mStsLength = STS_LENGTH_64_SYMBOLS; 1093 1094 /** PROVISIONED STS only. 128-bit or 256-bit long */ 1095 @Nullable private byte[] mSessionKey = null; 1096 1097 /** PROVISIONED STS only. 128-bit or 256-bit long */ 1098 @Nullable private byte[] mSubsessionKey = null; 1099 1100 /** UCI spec default: 6.81Mb/s */ 1101 @PsduDataRate private int mPsduDataRate = PSDU_DATA_RATE_6M81; 1102 1103 /** UCI spec default: 850kb/s */ 1104 @BprfPhrDataRate private int mBprfPhrDataRate = BPRF_PHR_DATA_RATE_850K; 1105 1106 /** UCI spec default: CRC-16 */ 1107 @MacFcsType private int mFcsType = MAC_FCS_TYPE_CRC_16; 1108 1109 /** UCI spec default: adaptive payload power for TX disabled */ 1110 private boolean mIsTxAdaptivePayloadPowerEnabled = false; 1111 1112 /** UCI spec default: static STS */ 1113 @StsConfig private int mStsConfig = STS_CONFIG_STATIC; 1114 1115 /** 1116 * Per UCI spec, only required when STS config is 1117 * STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY. 1118 */ 1119 private final RequiredParam<Integer> mSubSessionId = new RequiredParam<>(); 1120 1121 /** STATIC STS only. For Key generation. 16-bit long */ 1122 @Nullable private byte[] mVendorId = null; 1123 1124 /** STATIC STS only. For Key generation. 48-bit long */ 1125 @Nullable private byte[] mStaticStsIV = null; 1126 1127 /** UCI spec default: RSSI reporting disabled */ 1128 private boolean mIsRssiReportingEnabled = false; 1129 1130 /** Diagnostics is Disabled by default */ 1131 private boolean mIsDiagnosticsEnabled = false; 1132 1133 /** All fields are set to 0 by default */ 1134 private byte mDiagramsFrameReportsFieldsFlags = 0; 1135 1136 /** UCI spec default: no key rotation */ 1137 private boolean mIsKeyRotationEnabled = false; 1138 1139 /** UCI spec default: 0 */ 1140 private int mKeyRotationRate = 0; 1141 1142 /** UCI spec default: AoA enabled. */ 1143 @AoaResultRequestMode 1144 private int mAoaResultRequest = AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS; 1145 1146 /** UCI spec default: Ranging notification enabled. */ 1147 @RangeDataNtfConfig private int mRangeDataNtfConfig = RANGE_DATA_NTF_CONFIG_ENABLE; 1148 1149 /** UCI spec default: 0 (No low-bound filtering) */ 1150 private int mRangeDataNtfProximityNear = RANGE_DATA_NTF_PROXIMITY_NEAR_DEFAULT; 1151 1152 /** UCI spec default: 20000 cm (or 200 meters) */ 1153 private int mRangeDataNtfProximityFar = RANGE_DATA_NTF_PROXIMITY_FAR_DEFAULT; 1154 1155 /** UCI spec default: -180 (No low-bound filtering) */ 1156 private double mRangeDataNtfAoaAzimuthLower = RANGE_DATA_NTF_AOA_AZIMUTH_LOWER_DEFAULT; 1157 1158 /** UCI spec default: +180 (No upper-bound filtering) */ 1159 private double mRangeDataNtfAoaAzimuthUpper = RANGE_DATA_NTF_AOA_AZIMUTH_UPPER_DEFAULT; 1160 1161 /** UCI spec default: -90 (No low-bound filtering) */ 1162 private double mRangeDataNtfAoaElevationLower = RANGE_DATA_NTF_AOA_ELEVATION_LOWER_DEFAULT; 1163 1164 /** UCI spec default: +90 (No upper-bound filtering) */ 1165 private double mRangeDataNtfAoaElevationUpper = RANGE_DATA_NTF_AOA_ELEVATION_UPPER_DEFAULT; 1166 1167 /** UCI spec default: RESULT_REPORT_CONFIG bit 0 is 1 */ 1168 private boolean mHasTimeOfFlightReport = true; 1169 1170 /** UCI spec default: RESULT_REPORT_CONFIG bit 1 is 0 */ 1171 private boolean mHasAngleOfArrivalAzimuthReport = false; 1172 1173 /** UCI spec default: RESULT_REPORT_CONFIG bit 2 is 0 */ 1174 private boolean mHasAngleOfArrivalElevationReport = false; 1175 1176 /** UCI spec default: RESULT_REPORT_CONFIG bit 3 is 0 */ 1177 private boolean mHasAngleOfArrivalFigureOfMeritReport = false; 1178 1179 /** Not defined in UCI, we use Azimuth-only as default */ 1180 @AoaType private int mAoaType = AOA_TYPE_AZIMUTH; 1181 1182 /** Interleaving ratios are not set by default */ 1183 private int mNumOfMsrmtFocusOnRange = 0; 1184 private int mNumOfMsrmtFocusOnAoaAzimuth = 0; 1185 private int mNumOfMsrmtFocusOnAoaElevation = 0; 1186 1187 /** Ranging result error streak timeout in Milliseconds*/ 1188 private long mRangingErrorStreakTimeoutMs = 10_000L; 1189 1190 /** UCI spec default: 0 */ 1191 private int mLinkLayerMode = 0; 1192 1193 /** UCI spec default: 1 */ 1194 public int mMinFramesPerRr = 1; 1195 1196 /** No UCI spec default*/ 1197 public int mMtuSize = 1048; 1198 1199 /** UCI spec default: 1 */ 1200 public int mInterFrameInterval = 1; 1201 1202 /** Ul-TDoA Tx Interval in Milliseconds */ 1203 private int mUlTdoaTxIntervalMs = 2000; 1204 1205 /** Ul-TDoA Random Window in Milliseconds */ 1206 private int mUlTdoaRandomWindowMs = 0; 1207 1208 /** Ul-TDoA Device ID type */ 1209 @UlTdoaDeviceIdType private int mUlTdoaDeviceIdType = UL_TDOA_DEVICE_ID_NONE; 1210 1211 /** Ul-TDoA Device ID */ 1212 @Nullable private byte[] mUlTdoaDeviceId; 1213 1214 /** Ul-TDoA Tx Timestamp Type */ 1215 @UlTdoaTxTimestampType private int mUlTdoaTxTimestampType = TX_TIMESTAMP_NONE; 1216 1217 /** AoA/distance filtering type */ 1218 @FilterType private int mFilterType = FILTER_TYPE_DEFAULT; 1219 1220 private int mMaxNumberOfMeasurements = MAX_NUMBER_OF_MEASUREMENTS_DEFAULT; 1221 Builder()1222 public Builder() {} 1223 Builder(@onNull Builder builder)1224 public Builder(@NonNull Builder builder) { 1225 mProtocolVersion.set(builder.mProtocolVersion.get()); 1226 mSessionId.set(builder.mSessionId.get()); 1227 mSessionType = builder.mSessionType; 1228 mDeviceType.set(builder.mDeviceType.get()); 1229 mDeviceRole.set(builder.mDeviceRole.get()); 1230 mRangingRoundUsage = builder.mRangingRoundUsage; 1231 mMultiNodeMode.set(builder.mMultiNodeMode.get()); 1232 mDeviceAddress = builder.mDeviceAddress; 1233 mDestAddressList = builder.mDestAddressList; 1234 mInitiationTime = builder.mInitiationTime; 1235 mSlotDurationRstu = builder.mSlotDurationRstu; 1236 mSlotsPerRangingRound = builder.mSlotsPerRangingRound; 1237 mRangingIntervalMs = builder.mRangingIntervalMs; 1238 mBlockStrideLength = builder.mBlockStrideLength; 1239 mHoppingMode = builder.mHoppingMode; 1240 mMaxRangingRoundRetries = builder.mMaxRangingRoundRetries; 1241 mSessionPriority = builder.mSessionPriority; 1242 mMacAddressMode = builder.mMacAddressMode; 1243 mHasRangingResultReportMessage = builder.mHasRangingResultReportMessage; 1244 mHasControlMessage = builder.mHasControlMessage; 1245 mHasRangingControlPhase = builder.mHasRangingControlPhase; 1246 mMeasurementReportType = builder.mMeasurementReportType; 1247 mInBandTerminationAttemptCount = builder.mInBandTerminationAttemptCount; 1248 mChannelNumber = builder.mChannelNumber; 1249 mPreambleCodeIndex = builder.mPreambleCodeIndex; 1250 mRframeConfig = builder.mRframeConfig; 1251 mPrfMode = builder.mPrfMode; 1252 mScheduledMode = builder.mScheduledMode; 1253 if (builder.mScheduledMode == CONTENTION_BASED_RANGING) { 1254 mCapSize = builder.mCapSize; 1255 } 1256 mPreambleDuration = builder.mPreambleDuration; 1257 mSfdId = builder.mSfdId; 1258 mStsSegmentCount = builder.mStsSegmentCount; 1259 mStsLength = builder.mStsLength; 1260 mSessionKey = builder.mSessionKey; 1261 mSubsessionKey = builder.mSubsessionKey; 1262 mPsduDataRate = builder.mPsduDataRate; 1263 mBprfPhrDataRate = builder.mBprfPhrDataRate; 1264 mFcsType = builder.mFcsType; 1265 mIsTxAdaptivePayloadPowerEnabled = builder.mIsTxAdaptivePayloadPowerEnabled; 1266 mStsConfig = builder.mStsConfig; 1267 if (builder.mSubSessionId.isSet()) mSubSessionId.set(builder.mSubSessionId.get()); 1268 mVendorId = builder.mVendorId; 1269 mStaticStsIV = builder.mStaticStsIV; 1270 mIsRssiReportingEnabled = builder.mIsRssiReportingEnabled; 1271 mIsDiagnosticsEnabled = builder.mIsDiagnosticsEnabled; 1272 mDiagramsFrameReportsFieldsFlags = builder.mDiagramsFrameReportsFieldsFlags; 1273 mIsKeyRotationEnabled = builder.mIsKeyRotationEnabled; 1274 mKeyRotationRate = builder.mKeyRotationRate; 1275 mAoaResultRequest = builder.mAoaResultRequest; 1276 mRangeDataNtfConfig = builder.mRangeDataNtfConfig; 1277 mRangeDataNtfProximityNear = builder.mRangeDataNtfProximityNear; 1278 mRangeDataNtfProximityFar = builder.mRangeDataNtfProximityFar; 1279 mRangeDataNtfAoaAzimuthLower = builder.mRangeDataNtfAoaAzimuthLower; 1280 mRangeDataNtfAoaAzimuthUpper = builder.mRangeDataNtfAoaAzimuthUpper; 1281 mRangeDataNtfAoaElevationLower = builder.mRangeDataNtfAoaElevationLower; 1282 mRangeDataNtfAoaElevationUpper = builder.mRangeDataNtfAoaElevationUpper; 1283 mHasTimeOfFlightReport = builder.mHasTimeOfFlightReport; 1284 mHasAngleOfArrivalAzimuthReport = builder.mHasAngleOfArrivalAzimuthReport; 1285 mHasAngleOfArrivalElevationReport = builder.mHasAngleOfArrivalElevationReport; 1286 mHasAngleOfArrivalFigureOfMeritReport = builder.mHasAngleOfArrivalFigureOfMeritReport; 1287 mAoaType = builder.mAoaType; 1288 mNumOfMsrmtFocusOnRange = builder.mNumOfMsrmtFocusOnRange; 1289 mNumOfMsrmtFocusOnAoaAzimuth = builder.mNumOfMsrmtFocusOnAoaAzimuth; 1290 mNumOfMsrmtFocusOnAoaElevation = builder.mNumOfMsrmtFocusOnAoaElevation; 1291 mRangingErrorStreakTimeoutMs = builder.mRangingErrorStreakTimeoutMs; 1292 mLinkLayerMode = builder.mLinkLayerMode; 1293 mMinFramesPerRr = builder.mMinFramesPerRr; 1294 mMtuSize = builder.mMtuSize; 1295 mInterFrameInterval = builder.mInterFrameInterval; 1296 mUlTdoaTxIntervalMs = builder.mUlTdoaTxIntervalMs; 1297 mUlTdoaRandomWindowMs = builder.mUlTdoaRandomWindowMs; 1298 mUlTdoaDeviceIdType = builder.mUlTdoaDeviceIdType; 1299 mUlTdoaDeviceId = builder.mUlTdoaDeviceId; 1300 mUlTdoaTxTimestampType = builder.mUlTdoaTxTimestampType; 1301 mMaxNumberOfMeasurements = builder.mMaxNumberOfMeasurements; 1302 } 1303 Builder(@onNull FiraOpenSessionParams params)1304 public Builder(@NonNull FiraOpenSessionParams params) { 1305 mProtocolVersion.set(params.mProtocolVersion); 1306 mSessionId.set(params.mSessionId); 1307 mSessionType = params.mSessionType; 1308 mDeviceType.set(params.mDeviceType); 1309 mDeviceRole.set(params.mDeviceRole); 1310 mRangingRoundUsage = params.mRangingRoundUsage; 1311 mMultiNodeMode.set(params.mMultiNodeMode); 1312 mDeviceAddress = params.mDeviceAddress; 1313 mDestAddressList = params.mDestAddressList; 1314 mInitiationTime = params.mInitiationTime; 1315 mSlotDurationRstu = params.mSlotDurationRstu; 1316 mSlotsPerRangingRound = params.mSlotsPerRangingRound; 1317 mRangingIntervalMs = params.mRangingIntervalMs; 1318 mBlockStrideLength = params.mBlockStrideLength; 1319 mHoppingMode = params.mHoppingMode; 1320 mMaxRangingRoundRetries = params.mMaxRangingRoundRetries; 1321 mSessionPriority = params.mSessionPriority; 1322 mMacAddressMode = params.mMacAddressMode; 1323 mHasRangingResultReportMessage = params.mHasRangingResultReportMessage; 1324 mHasControlMessage = params.mHasControlMessage; 1325 mHasRangingControlPhase = params.mHasRangingControlPhase; 1326 mMeasurementReportType = params.mMeasurementReportType; 1327 mInBandTerminationAttemptCount = params.mInBandTerminationAttemptCount; 1328 mChannelNumber = params.mChannelNumber; 1329 mPreambleCodeIndex = params.mPreambleCodeIndex; 1330 mRframeConfig = params.mRframeConfig; 1331 mPrfMode = params.mPrfMode; 1332 mScheduledMode = params.mScheduledMode; 1333 if (params.mScheduledMode == CONTENTION_BASED_RANGING) { 1334 mCapSize = params.mCapSize; 1335 } 1336 mPreambleDuration = params.mPreambleDuration; 1337 mSfdId = params.mSfdId; 1338 mStsSegmentCount = params.mStsSegmentCount; 1339 mStsLength = params.mStsLength; 1340 mSessionKey = params.mSessionKey; 1341 mSubsessionKey = params.mSubSessionKey; 1342 mPsduDataRate = params.mPsduDataRate; 1343 mBprfPhrDataRate = params.mBprfPhrDataRate; 1344 mFcsType = params.mFcsType; 1345 mIsTxAdaptivePayloadPowerEnabled = params.mIsTxAdaptivePayloadPowerEnabled; 1346 mStsConfig = params.mStsConfig; 1347 mSubSessionId.set(params.mSubSessionId); 1348 mVendorId = params.mVendorId; 1349 mStaticStsIV = params.mStaticStsIV; 1350 mIsRssiReportingEnabled = params.mIsRssiReportingEnabled; 1351 mIsDiagnosticsEnabled = params.mIsDiagnosticsEnabled; 1352 mDiagramsFrameReportsFieldsFlags = params.mDiagramsFrameReportsFieldsFlags; 1353 mIsKeyRotationEnabled = params.mIsKeyRotationEnabled; 1354 mKeyRotationRate = params.mKeyRotationRate; 1355 mAoaResultRequest = params.mAoaResultRequest; 1356 mRangeDataNtfConfig = params.mRangeDataNtfConfig; 1357 mRangeDataNtfProximityNear = params.mRangeDataNtfProximityNear; 1358 mRangeDataNtfProximityFar = params.mRangeDataNtfProximityFar; 1359 mRangeDataNtfAoaAzimuthLower = params.mRangeDataNtfAoaAzimuthLower; 1360 mRangeDataNtfAoaAzimuthUpper = params.mRangeDataNtfAoaAzimuthUpper; 1361 mRangeDataNtfAoaElevationLower = params.mRangeDataNtfAoaElevationLower; 1362 mRangeDataNtfAoaElevationUpper = params.mRangeDataNtfAoaElevationUpper; 1363 mHasTimeOfFlightReport = params.mHasTimeOfFlightReport; 1364 mHasAngleOfArrivalAzimuthReport = params.mHasAngleOfArrivalAzimuthReport; 1365 mHasAngleOfArrivalElevationReport = params.mHasAngleOfArrivalElevationReport; 1366 mHasAngleOfArrivalFigureOfMeritReport = params.mHasAngleOfArrivalFigureOfMeritReport; 1367 mAoaType = params.mAoaType; 1368 mNumOfMsrmtFocusOnRange = params.mNumOfMsrmtFocusOnRange; 1369 mNumOfMsrmtFocusOnAoaAzimuth = params.mNumOfMsrmtFocusOnAoaAzimuth; 1370 mNumOfMsrmtFocusOnAoaElevation = params.mNumOfMsrmtFocusOnAoaElevation; 1371 mRangingErrorStreakTimeoutMs = params.mRangingErrorStreakTimeoutMs; 1372 mLinkLayerMode = params.mLinkLayerMode; 1373 mMinFramesPerRr = params.mMinFramesPerRr; 1374 mMtuSize = params.mMtuSize; 1375 mInterFrameInterval = params.mInterFrameInterval; 1376 mUlTdoaTxIntervalMs = params.mUlTdoaTxIntervalMs; 1377 mUlTdoaRandomWindowMs = params.mUlTdoaRandomWindowMs; 1378 mUlTdoaDeviceIdType = params.mUlTdoaDeviceIdType; 1379 mUlTdoaDeviceId = params.mUlTdoaDeviceId; 1380 mUlTdoaTxTimestampType = params.mUlTdoaTxTimestampType; 1381 mFilterType = params.mFilterType; 1382 mMaxNumberOfMeasurements = params.mMaxNumberOfMeasurements; 1383 } 1384 setProtocolVersion(FiraProtocolVersion version)1385 public FiraOpenSessionParams.Builder setProtocolVersion(FiraProtocolVersion version) { 1386 mProtocolVersion.set(version); 1387 return this; 1388 } 1389 setSessionId(int sessionId)1390 public FiraOpenSessionParams.Builder setSessionId(int sessionId) { 1391 mSessionId.set(sessionId); 1392 return this; 1393 } 1394 setSessionType(@essionType int sessionType)1395 public FiraOpenSessionParams.Builder setSessionType(@SessionType int sessionType) { 1396 mSessionType = sessionType; 1397 return this; 1398 } 1399 setDeviceType(@angingDeviceType int deviceType)1400 public FiraOpenSessionParams.Builder setDeviceType(@RangingDeviceType int deviceType) { 1401 mDeviceType.set(deviceType); 1402 return this; 1403 } 1404 setDeviceRole(@angingDeviceRole int deviceRole)1405 public FiraOpenSessionParams.Builder setDeviceRole(@RangingDeviceRole int deviceRole) { 1406 mDeviceRole.set(deviceRole); 1407 return this; 1408 } 1409 setRangingRoundUsage( @angingRoundUsage int rangingRoundUsage)1410 public FiraOpenSessionParams.Builder setRangingRoundUsage( 1411 @RangingRoundUsage int rangingRoundUsage) { 1412 mRangingRoundUsage = rangingRoundUsage; 1413 return this; 1414 } 1415 setMultiNodeMode(@ultiNodeMode int multiNodeMode)1416 public FiraOpenSessionParams.Builder setMultiNodeMode(@MultiNodeMode int multiNodeMode) { 1417 mMultiNodeMode.set(multiNodeMode); 1418 return this; 1419 } 1420 setDeviceAddress(UwbAddress deviceAddress)1421 public FiraOpenSessionParams.Builder setDeviceAddress(UwbAddress deviceAddress) { 1422 mDeviceAddress = deviceAddress; 1423 return this; 1424 } 1425 setDestAddressList(List<UwbAddress> destAddressList)1426 public FiraOpenSessionParams.Builder setDestAddressList(List<UwbAddress> destAddressList) { 1427 mDestAddressList = destAddressList; 1428 return this; 1429 } 1430 1431 /** 1432 * @param initiationTime UWB initiation time: 1433 * FiRa 1.0: Relative time (in milli-seconds). 1434 * FiRa 2.0: Absolute time in UWB time domain, as specified in CR-272 1435 * (in micro-seconds). 1436 */ setInitiationTime(long initiationTime)1437 public FiraOpenSessionParams.Builder setInitiationTime(long initiationTime) { 1438 mInitiationTime = initiationTime; 1439 return this; 1440 } 1441 setSlotDurationRstu(int slotDurationRstu)1442 public FiraOpenSessionParams.Builder setSlotDurationRstu(int slotDurationRstu) { 1443 mSlotDurationRstu = slotDurationRstu; 1444 return this; 1445 } 1446 setSlotsPerRangingRound(int slotsPerRangingRound)1447 public FiraOpenSessionParams.Builder setSlotsPerRangingRound(int slotsPerRangingRound) { 1448 mSlotsPerRangingRound = slotsPerRangingRound; 1449 return this; 1450 } 1451 setRangingIntervalMs(int rangingIntervalMs)1452 public FiraOpenSessionParams.Builder setRangingIntervalMs(int rangingIntervalMs) { 1453 mRangingIntervalMs = rangingIntervalMs; 1454 return this; 1455 } 1456 setBlockStrideLength(int blockStrideLength)1457 public FiraOpenSessionParams.Builder setBlockStrideLength(int blockStrideLength) { 1458 mBlockStrideLength = blockStrideLength; 1459 return this; 1460 } 1461 setHoppingMode(int hoppingMode)1462 public FiraOpenSessionParams.Builder setHoppingMode(int hoppingMode) { 1463 this.mHoppingMode = hoppingMode; 1464 return this; 1465 } 1466 setMaxRangingRoundRetries( @ntRangefrom = 0, to = 65535) int maxRangingRoundRetries)1467 public FiraOpenSessionParams.Builder setMaxRangingRoundRetries( 1468 @IntRange(from = 0, to = 65535) int maxRangingRoundRetries) { 1469 mMaxRangingRoundRetries = maxRangingRoundRetries; 1470 return this; 1471 } 1472 setSessionPriority(int sessionPriority)1473 public FiraOpenSessionParams.Builder setSessionPriority(int sessionPriority) { 1474 mSessionPriority = sessionPriority; 1475 return this; 1476 } 1477 setMacAddressMode(int macAddressMode)1478 public FiraOpenSessionParams.Builder setMacAddressMode(int macAddressMode) { 1479 this.mMacAddressMode = macAddressMode; 1480 return this; 1481 } 1482 setHasRangingResultReportMessage( boolean hasRangingResultReportMessage)1483 public FiraOpenSessionParams.Builder setHasRangingResultReportMessage( 1484 boolean hasRangingResultReportMessage) { 1485 mHasRangingResultReportMessage = hasRangingResultReportMessage; 1486 return this; 1487 } 1488 setHasControlMessage(boolean hasControlMessage)1489 public FiraOpenSessionParams.Builder setHasControlMessage(boolean hasControlMessage) { 1490 mHasControlMessage = hasControlMessage; 1491 return this; 1492 } 1493 setHasRangingControlPhase( boolean hasRangingControlPhase)1494 public FiraOpenSessionParams.Builder setHasRangingControlPhase( 1495 boolean hasRangingControlPhase) { 1496 mHasRangingControlPhase = hasRangingControlPhase; 1497 return this; 1498 } 1499 setMeasurementReportType( @easurementReportType int measurementReportType)1500 public FiraOpenSessionParams.Builder setMeasurementReportType( 1501 @MeasurementReportType int measurementReportType) { 1502 mMeasurementReportType = measurementReportType; 1503 return this; 1504 } 1505 setInBandTerminationAttemptCount( @ntRangefrom = 1, to = 10) int inBandTerminationAttemptCount)1506 public FiraOpenSessionParams.Builder setInBandTerminationAttemptCount( 1507 @IntRange(from = 1, to = 10) int inBandTerminationAttemptCount) { 1508 mInBandTerminationAttemptCount = inBandTerminationAttemptCount; 1509 return this; 1510 } 1511 setChannelNumber(@wbChannel int channelNumber)1512 public FiraOpenSessionParams.Builder setChannelNumber(@UwbChannel int channelNumber) { 1513 mChannelNumber = channelNumber; 1514 return this; 1515 } 1516 setPreambleCodeIndex( @wbPreambleCodeIndex int preambleCodeIndex)1517 public FiraOpenSessionParams.Builder setPreambleCodeIndex( 1518 @UwbPreambleCodeIndex int preambleCodeIndex) { 1519 mPreambleCodeIndex = preambleCodeIndex; 1520 return this; 1521 } 1522 setRframeConfig(@frameConfig int rframeConfig)1523 public FiraOpenSessionParams.Builder setRframeConfig(@RframeConfig int rframeConfig) { 1524 mRframeConfig = rframeConfig; 1525 return this; 1526 } 1527 setPrfMode(@rfMode int prfMode)1528 public FiraOpenSessionParams.Builder setPrfMode(@PrfMode int prfMode) { 1529 mPrfMode = prfMode; 1530 return this; 1531 } 1532 setCapSize(byte[] capSize)1533 public FiraOpenSessionParams.Builder setCapSize(byte[] capSize) { 1534 mCapSize = capSize; 1535 return this; 1536 } 1537 setScheduledMode(@chedulingMode int scheduledMode)1538 public FiraOpenSessionParams.Builder setScheduledMode(@SchedulingMode int scheduledMode) { 1539 mScheduledMode = scheduledMode; 1540 return this; 1541 } 1542 setPreambleDuration( @reambleDuration int preambleDuration)1543 public FiraOpenSessionParams.Builder setPreambleDuration( 1544 @PreambleDuration int preambleDuration) { 1545 mPreambleDuration = preambleDuration; 1546 return this; 1547 } 1548 setSfdId(@fdIdValue int sfdId)1549 public FiraOpenSessionParams.Builder setSfdId(@SfdIdValue int sfdId) { 1550 mSfdId = sfdId; 1551 return this; 1552 } 1553 setStsSegmentCount( @tsSegmentCountValue int stsSegmentCount)1554 public FiraOpenSessionParams.Builder setStsSegmentCount( 1555 @StsSegmentCountValue int stsSegmentCount) { 1556 mStsSegmentCount = stsSegmentCount; 1557 return this; 1558 } 1559 setStsLength(@tsLength int stsLength)1560 public FiraOpenSessionParams.Builder setStsLength(@StsLength int stsLength) { 1561 mStsLength = stsLength; 1562 return this; 1563 } 1564 1565 /** set session key */ setSessionKey(@ullable byte[] sessionKey)1566 public FiraOpenSessionParams.Builder setSessionKey(@Nullable byte[] sessionKey) { 1567 mSessionKey = sessionKey; 1568 return this; 1569 } 1570 1571 /** set subsession key */ setSubsessionKey(@ullable byte[] subsessionKey)1572 public FiraOpenSessionParams.Builder setSubsessionKey(@Nullable byte[] subsessionKey) { 1573 mSubsessionKey = subsessionKey; 1574 return this; 1575 } 1576 setPsduDataRate(@sduDataRate int psduDataRate)1577 public FiraOpenSessionParams.Builder setPsduDataRate(@PsduDataRate int psduDataRate) { 1578 mPsduDataRate = psduDataRate; 1579 return this; 1580 } 1581 setBprfPhrDataRate( @prfPhrDataRate int bprfPhrDataRate)1582 public FiraOpenSessionParams.Builder setBprfPhrDataRate( 1583 @BprfPhrDataRate int bprfPhrDataRate) { 1584 mBprfPhrDataRate = bprfPhrDataRate; 1585 return this; 1586 } 1587 setFcsType(@acFcsType int fcsType)1588 public FiraOpenSessionParams.Builder setFcsType(@MacFcsType int fcsType) { 1589 mFcsType = fcsType; 1590 return this; 1591 } 1592 setIsTxAdaptivePayloadPowerEnabled( boolean isTxAdaptivePayloadPowerEnabled)1593 public FiraOpenSessionParams.Builder setIsTxAdaptivePayloadPowerEnabled( 1594 boolean isTxAdaptivePayloadPowerEnabled) { 1595 mIsTxAdaptivePayloadPowerEnabled = isTxAdaptivePayloadPowerEnabled; 1596 return this; 1597 } 1598 setStsConfig(@tsConfig int stsConfig)1599 public FiraOpenSessionParams.Builder setStsConfig(@StsConfig int stsConfig) { 1600 mStsConfig = stsConfig; 1601 return this; 1602 } 1603 setSubSessionId(int subSessionId)1604 public FiraOpenSessionParams.Builder setSubSessionId(int subSessionId) { 1605 mSubSessionId.set(subSessionId); 1606 return this; 1607 } 1608 setVendorId(@ullable byte[] vendorId)1609 public FiraOpenSessionParams.Builder setVendorId(@Nullable byte[] vendorId) { 1610 mVendorId = vendorId; 1611 return this; 1612 } 1613 setStaticStsIV(@ullable byte[] staticStsIV)1614 public FiraOpenSessionParams.Builder setStaticStsIV(@Nullable byte[] staticStsIV) { 1615 mStaticStsIV = staticStsIV; 1616 return this; 1617 } 1618 1619 /** Set whether rssi reporting is enabled */ 1620 public FiraOpenSessionParams.Builder setIsRssiReportingEnabled(boolean isRssiReportingEnabled)1621 setIsRssiReportingEnabled(boolean isRssiReportingEnabled) { 1622 mIsRssiReportingEnabled = isRssiReportingEnabled; 1623 return this; 1624 } 1625 1626 /** Set whether diagnostics is enabled */ setIsDiagnosticsEnabled(boolean isDiagnosticsEnabled)1627 public FiraOpenSessionParams.Builder setIsDiagnosticsEnabled(boolean isDiagnosticsEnabled) { 1628 mIsDiagnosticsEnabled = isDiagnosticsEnabled; 1629 return this; 1630 } 1631 1632 /** Set the activated field 1633 * b0: Activate RSSIs field 1634 * b1: Activate AoAs field 1635 * b2: Activate CIRs field 1636 * b3 - b7: RFU 1637 */ 1638 public FiraOpenSessionParams.Builder setDiagramsFrameReportsFieldsFlags(byte diagramsFrameReportsFieldsFlags)1639 setDiagramsFrameReportsFieldsFlags(byte diagramsFrameReportsFieldsFlags) { 1640 mDiagramsFrameReportsFieldsFlags = diagramsFrameReportsFieldsFlags; 1641 return this; 1642 } 1643 setIsKeyRotationEnabled(boolean isKeyRotationEnabled)1644 public FiraOpenSessionParams.Builder setIsKeyRotationEnabled(boolean isKeyRotationEnabled) { 1645 mIsKeyRotationEnabled = isKeyRotationEnabled; 1646 return this; 1647 } 1648 setKeyRotationRate(int keyRotationRate)1649 public FiraOpenSessionParams.Builder setKeyRotationRate(int keyRotationRate) { 1650 mKeyRotationRate = keyRotationRate; 1651 return this; 1652 } 1653 setAoaResultRequest( @oaResultRequestMode int aoaResultRequest)1654 public FiraOpenSessionParams.Builder setAoaResultRequest( 1655 @AoaResultRequestMode int aoaResultRequest) { 1656 mAoaResultRequest = aoaResultRequest; 1657 return this; 1658 } 1659 setRangeDataNtfConfig( @angeDataNtfConfig int rangeDataNtfConfig)1660 public FiraOpenSessionParams.Builder setRangeDataNtfConfig( 1661 @RangeDataNtfConfig int rangeDataNtfConfig) { 1662 mRangeDataNtfConfig = rangeDataNtfConfig; 1663 return this; 1664 } 1665 setRangeDataNtfProximityNear( @ntRangefrom = RANGE_DATA_NTF_PROXIMITY_NEAR_DEFAULT, to = RANGE_DATA_NTF_PROXIMITY_FAR_DEFAULT) int rangeDataNtfProximityNear)1666 public FiraOpenSessionParams.Builder setRangeDataNtfProximityNear( 1667 @IntRange(from = RANGE_DATA_NTF_PROXIMITY_NEAR_DEFAULT, 1668 to = RANGE_DATA_NTF_PROXIMITY_FAR_DEFAULT) 1669 int rangeDataNtfProximityNear) { 1670 mRangeDataNtfProximityNear = rangeDataNtfProximityNear; 1671 return this; 1672 } 1673 setRangeDataNtfProximityFar( @ntRangefrom = RANGE_DATA_NTF_PROXIMITY_NEAR_DEFAULT, to = RANGE_DATA_NTF_PROXIMITY_FAR_DEFAULT) int rangeDataNtfProximityFar)1674 public FiraOpenSessionParams.Builder setRangeDataNtfProximityFar( 1675 @IntRange(from = RANGE_DATA_NTF_PROXIMITY_NEAR_DEFAULT, 1676 to = RANGE_DATA_NTF_PROXIMITY_FAR_DEFAULT) 1677 int rangeDataNtfProximityFar) { 1678 mRangeDataNtfProximityFar = rangeDataNtfProximityFar; 1679 return this; 1680 } 1681 setRangeDataNtfAoaAzimuthLower( @loatRangefrom = RANGE_DATA_NTF_AOA_AZIMUTH_LOWER_DEFAULT, to = RANGE_DATA_NTF_AOA_AZIMUTH_UPPER_DEFAULT) double rangeDataNtfAoaAzimuthLower)1682 public FiraOpenSessionParams.Builder setRangeDataNtfAoaAzimuthLower( 1683 @FloatRange(from = RANGE_DATA_NTF_AOA_AZIMUTH_LOWER_DEFAULT, 1684 to = RANGE_DATA_NTF_AOA_AZIMUTH_UPPER_DEFAULT) 1685 double rangeDataNtfAoaAzimuthLower) { 1686 mRangeDataNtfAoaAzimuthLower = rangeDataNtfAoaAzimuthLower; 1687 return this; 1688 } 1689 setRangeDataNtfAoaAzimuthUpper( @loatRangefrom = RANGE_DATA_NTF_AOA_AZIMUTH_LOWER_DEFAULT, to = RANGE_DATA_NTF_AOA_AZIMUTH_UPPER_DEFAULT) double rangeDataNtfAoaAzimuthUpper)1690 public FiraOpenSessionParams.Builder setRangeDataNtfAoaAzimuthUpper( 1691 @FloatRange(from = RANGE_DATA_NTF_AOA_AZIMUTH_LOWER_DEFAULT, 1692 to = RANGE_DATA_NTF_AOA_AZIMUTH_UPPER_DEFAULT) 1693 double rangeDataNtfAoaAzimuthUpper) { 1694 mRangeDataNtfAoaAzimuthUpper = rangeDataNtfAoaAzimuthUpper; 1695 return this; 1696 } 1697 setRangeDataNtfAoaElevationLower( @loatRangefrom = RANGE_DATA_NTF_AOA_ELEVATION_LOWER_DEFAULT, to = RANGE_DATA_NTF_AOA_ELEVATION_UPPER_DEFAULT) double rangeDataNtfAoaElevationLower)1698 public FiraOpenSessionParams.Builder setRangeDataNtfAoaElevationLower( 1699 @FloatRange(from = RANGE_DATA_NTF_AOA_ELEVATION_LOWER_DEFAULT, 1700 to = RANGE_DATA_NTF_AOA_ELEVATION_UPPER_DEFAULT) 1701 double rangeDataNtfAoaElevationLower) { 1702 mRangeDataNtfAoaElevationLower = rangeDataNtfAoaElevationLower; 1703 return this; 1704 } 1705 setRangeDataNtfAoaElevationUpper( @loatRangefrom = RANGE_DATA_NTF_AOA_ELEVATION_LOWER_DEFAULT, to = RANGE_DATA_NTF_AOA_ELEVATION_UPPER_DEFAULT) double rangeDataNtfAoaElevationUpper)1706 public FiraOpenSessionParams.Builder setRangeDataNtfAoaElevationUpper( 1707 @FloatRange(from = RANGE_DATA_NTF_AOA_ELEVATION_LOWER_DEFAULT, 1708 to = RANGE_DATA_NTF_AOA_ELEVATION_UPPER_DEFAULT) 1709 double rangeDataNtfAoaElevationUpper) { 1710 mRangeDataNtfAoaElevationUpper = rangeDataNtfAoaElevationUpper; 1711 return this; 1712 } 1713 setHasTimeOfFlightReport( boolean hasTimeOfFlightReport)1714 public FiraOpenSessionParams.Builder setHasTimeOfFlightReport( 1715 boolean hasTimeOfFlightReport) { 1716 mHasTimeOfFlightReport = hasTimeOfFlightReport; 1717 return this; 1718 } 1719 setHasAngleOfArrivalAzimuthReport( boolean hasAngleOfArrivalAzimuthReport)1720 public FiraOpenSessionParams.Builder setHasAngleOfArrivalAzimuthReport( 1721 boolean hasAngleOfArrivalAzimuthReport) { 1722 mHasAngleOfArrivalAzimuthReport = hasAngleOfArrivalAzimuthReport; 1723 return this; 1724 } 1725 setHasAngleOfArrivalElevationReport( boolean hasAngleOfArrivalElevationReport)1726 public FiraOpenSessionParams.Builder setHasAngleOfArrivalElevationReport( 1727 boolean hasAngleOfArrivalElevationReport) { 1728 mHasAngleOfArrivalElevationReport = hasAngleOfArrivalElevationReport; 1729 return this; 1730 } 1731 setHasAngleOfArrivalFigureOfMeritReport( boolean hasAngleOfArrivalFigureOfMeritReport)1732 public FiraOpenSessionParams.Builder setHasAngleOfArrivalFigureOfMeritReport( 1733 boolean hasAngleOfArrivalFigureOfMeritReport) { 1734 mHasAngleOfArrivalFigureOfMeritReport = hasAngleOfArrivalFigureOfMeritReport; 1735 return this; 1736 } 1737 setAoaType(int aoaType)1738 public FiraOpenSessionParams.Builder setAoaType(int aoaType) { 1739 mAoaType = aoaType; 1740 return this; 1741 } 1742 setRangingErrorStreakTimeoutMs( long rangingErrorStreakTimeoutMs)1743 public FiraOpenSessionParams.Builder setRangingErrorStreakTimeoutMs( 1744 long rangingErrorStreakTimeoutMs) { 1745 mRangingErrorStreakTimeoutMs = rangingErrorStreakTimeoutMs; 1746 return this; 1747 } 1748 setLinkLayerMode(int linkLayerMode)1749 public FiraOpenSessionParams.Builder setLinkLayerMode(int linkLayerMode) { 1750 mLinkLayerMode = linkLayerMode; 1751 return this; 1752 } 1753 setMinFramePerRr(int minFramePerRr)1754 public FiraOpenSessionParams.Builder setMinFramePerRr(int minFramePerRr) { 1755 mMinFramesPerRr = minFramePerRr; 1756 return this; 1757 } 1758 setMtuSize(int mtuSize)1759 public FiraOpenSessionParams.Builder setMtuSize(int mtuSize) { 1760 mMtuSize = mtuSize; 1761 return this; 1762 } 1763 setInterFrameInterval(int interFrameInterval)1764 public FiraOpenSessionParams.Builder setInterFrameInterval(int interFrameInterval) { 1765 mInterFrameInterval = interFrameInterval; 1766 return this; 1767 } 1768 setUlTdoaTxIntervalMs( int ulTdoaTxIntervalMs)1769 public FiraOpenSessionParams.Builder setUlTdoaTxIntervalMs( 1770 int ulTdoaTxIntervalMs) { 1771 mUlTdoaTxIntervalMs = ulTdoaTxIntervalMs; 1772 return this; 1773 } 1774 setUlTdoaRandomWindowMs( int ulTdoaRandomWindowMs)1775 public FiraOpenSessionParams.Builder setUlTdoaRandomWindowMs( 1776 int ulTdoaRandomWindowMs) { 1777 mUlTdoaRandomWindowMs = ulTdoaRandomWindowMs; 1778 return this; 1779 } 1780 setUlTdoaDeviceIdType( int ulTdoaDeviceIdType)1781 public FiraOpenSessionParams.Builder setUlTdoaDeviceIdType( 1782 int ulTdoaDeviceIdType) { 1783 mUlTdoaDeviceIdType = ulTdoaDeviceIdType; 1784 return this; 1785 } 1786 setUlTdoaDeviceId( byte[] ulTdoaDeviceId)1787 public FiraOpenSessionParams.Builder setUlTdoaDeviceId( 1788 byte[] ulTdoaDeviceId) { 1789 mUlTdoaDeviceId = ulTdoaDeviceId; 1790 return this; 1791 } 1792 setUlTdoaTxTimestampType( int ulTdoatxTimestampType)1793 public FiraOpenSessionParams.Builder setUlTdoaTxTimestampType( 1794 int ulTdoatxTimestampType) { 1795 mUlTdoaTxTimestampType = ulTdoatxTimestampType; 1796 return this; 1797 } 1798 1799 /** 1800 * After the session has been started, the device starts by 1801 * performing numOfMsrmtFocusOnRange range-only measurements (no 1802 * AoA), then it proceeds with numOfMsrmtFocusOnAoaAzimuth AoA 1803 * azimuth measurements followed by numOfMsrmtFocusOnAoaElevation 1804 * AoA elevation measurements. 1805 * If this is not invoked, the focus of each measurement is left 1806 * to the UWB vendor. 1807 * 1808 * Only valid when {@link #setAoaResultRequest(int)} is set to 1809 * {@link FiraParams#AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_INTERLEAVED}. 1810 */ setMeasurementFocusRatio( int numOfMsrmtFocusOnRange, int numOfMsrmtFocusOnAoaAzimuth, int numOfMsrmtFocusOnAoaElevation)1811 public FiraOpenSessionParams.Builder setMeasurementFocusRatio( 1812 int numOfMsrmtFocusOnRange, 1813 int numOfMsrmtFocusOnAoaAzimuth, 1814 int numOfMsrmtFocusOnAoaElevation) { 1815 mNumOfMsrmtFocusOnRange = numOfMsrmtFocusOnRange; 1816 mNumOfMsrmtFocusOnAoaAzimuth = numOfMsrmtFocusOnAoaAzimuth; 1817 mNumOfMsrmtFocusOnAoaElevation = numOfMsrmtFocusOnAoaElevation; 1818 return this; 1819 } 1820 setMaxNumberOfMeasurements( int maxNumberOfMeasurements)1821 public FiraOpenSessionParams.Builder setMaxNumberOfMeasurements( 1822 int maxNumberOfMeasurements) { 1823 mMaxNumberOfMeasurements = maxNumberOfMeasurements; 1824 return this; 1825 } 1826 checkAddress()1827 private void checkAddress() { 1828 checkArgument( 1829 mMacAddressMode == MAC_ADDRESS_MODE_2_BYTES 1830 || mMacAddressMode == MAC_ADDRESS_MODE_8_BYTES); 1831 int addressByteLength = UwbAddress.SHORT_ADDRESS_BYTE_LENGTH; 1832 if (mMacAddressMode == MAC_ADDRESS_MODE_8_BYTES) { 1833 addressByteLength = UwbAddress.EXTENDED_ADDRESS_BYTE_LENGTH; 1834 } 1835 1836 // Make sure address length matches the address mode 1837 checkArgument(mDeviceAddress != null && mDeviceAddress.size() == addressByteLength); 1838 checkNotNull(mDestAddressList); 1839 for (UwbAddress destAddress : mDestAddressList) { 1840 checkArgument(destAddress != null && destAddress.size() == addressByteLength); 1841 } 1842 } 1843 checkStsConfig()1844 private void checkStsConfig() { 1845 if (mStsConfig == STS_CONFIG_STATIC) { 1846 // These two fields are used by Static STS only. 1847 checkArgument(mVendorId != null && mVendorId.length == 2); 1848 checkArgument(mStaticStsIV != null && mStaticStsIV.length == 6); 1849 } 1850 1851 if (mStsConfig != STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY) { 1852 // Sub Session ID is used for dynamic individual key STS only. 1853 if (!mSubSessionId.isSet()) { 1854 mSubSessionId.set(0); 1855 } 1856 } 1857 1858 if (mStsConfig == STS_CONFIG_PROVISIONED) { 1859 checkArgument(mSessionKey != null 1860 && (mSessionKey.length == 16 || mSessionKey.length == 32)); 1861 } 1862 1863 if (mStsConfig == STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY) { 1864 checkArgument(mSessionKey != null 1865 && (mSessionKey.length == 16 || mSessionKey.length == 32)); 1866 if (mDeviceType.get() == RANGING_DEVICE_TYPE_CONTROLEE) { 1867 if (!mSubSessionId.isSet()) { 1868 mSubSessionId.set(0); 1869 } 1870 checkArgument(mSubsessionKey != null 1871 && (mSubsessionKey.length == 16 || mSubsessionKey.length == 32)); 1872 } 1873 } 1874 } 1875 checkInterleavingRatio()1876 private void checkInterleavingRatio() { 1877 if (mAoaResultRequest != AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_INTERLEAVED) { 1878 checkArgument(mNumOfMsrmtFocusOnRange == 0); 1879 checkArgument(mNumOfMsrmtFocusOnAoaAzimuth == 0); 1880 checkArgument(mNumOfMsrmtFocusOnAoaElevation == 0); 1881 } else { 1882 // at-least one of the ratio params should be set for interleaving mode. 1883 checkArgument(mNumOfMsrmtFocusOnRange > 0 1884 || mNumOfMsrmtFocusOnAoaAzimuth > 0 1885 || mNumOfMsrmtFocusOnAoaElevation > 0); 1886 } 1887 } 1888 checkRangeDataNtfConfig()1889 private void checkRangeDataNtfConfig() { 1890 if (mRangeDataNtfConfig == RANGE_DATA_NTF_CONFIG_DISABLE) { 1891 checkArgument(mRangeDataNtfProximityNear 1892 == RANGE_DATA_NTF_PROXIMITY_NEAR_DEFAULT); 1893 checkArgument(mRangeDataNtfProximityFar 1894 == RANGE_DATA_NTF_PROXIMITY_FAR_DEFAULT); 1895 checkArgument(mRangeDataNtfAoaAzimuthLower 1896 == RANGE_DATA_NTF_AOA_AZIMUTH_LOWER_DEFAULT); 1897 checkArgument(mRangeDataNtfAoaAzimuthUpper 1898 == RANGE_DATA_NTF_AOA_AZIMUTH_UPPER_DEFAULT); 1899 checkArgument(mRangeDataNtfAoaElevationLower 1900 == RANGE_DATA_NTF_AOA_ELEVATION_LOWER_DEFAULT); 1901 checkArgument(mRangeDataNtfAoaElevationUpper 1902 == RANGE_DATA_NTF_AOA_ELEVATION_UPPER_DEFAULT); 1903 } else if (mRangeDataNtfConfig == RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_LEVEL_TRIG 1904 || mRangeDataNtfConfig == RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_EDGE_TRIG) { 1905 checkArgument( 1906 mRangeDataNtfProximityNear != RANGE_DATA_NTF_PROXIMITY_NEAR_DEFAULT 1907 || mRangeDataNtfProximityFar != RANGE_DATA_NTF_PROXIMITY_FAR_DEFAULT); 1908 checkArgument(mRangeDataNtfAoaAzimuthLower 1909 == RANGE_DATA_NTF_AOA_AZIMUTH_LOWER_DEFAULT); 1910 checkArgument(mRangeDataNtfAoaAzimuthUpper 1911 == RANGE_DATA_NTF_AOA_AZIMUTH_UPPER_DEFAULT); 1912 checkArgument(mRangeDataNtfAoaElevationLower 1913 == RANGE_DATA_NTF_AOA_ELEVATION_LOWER_DEFAULT); 1914 checkArgument(mRangeDataNtfAoaElevationUpper 1915 == RANGE_DATA_NTF_AOA_ELEVATION_UPPER_DEFAULT); 1916 } else if (mRangeDataNtfConfig == RANGE_DATA_NTF_CONFIG_ENABLE_AOA_LEVEL_TRIG 1917 || mRangeDataNtfConfig == RANGE_DATA_NTF_CONFIG_ENABLE_AOA_EDGE_TRIG) { 1918 checkArgument(mRangeDataNtfProximityNear 1919 == RANGE_DATA_NTF_PROXIMITY_NEAR_DEFAULT); 1920 checkArgument(mRangeDataNtfProximityFar 1921 == RANGE_DATA_NTF_PROXIMITY_FAR_DEFAULT); 1922 checkArgument(mRangeDataNtfAoaAzimuthLower 1923 != RANGE_DATA_NTF_AOA_AZIMUTH_LOWER_DEFAULT 1924 || mRangeDataNtfAoaAzimuthUpper 1925 != RANGE_DATA_NTF_AOA_AZIMUTH_UPPER_DEFAULT 1926 || mRangeDataNtfAoaElevationLower 1927 != RANGE_DATA_NTF_AOA_ELEVATION_LOWER_DEFAULT 1928 || mRangeDataNtfAoaElevationUpper 1929 != RANGE_DATA_NTF_AOA_ELEVATION_UPPER_DEFAULT); 1930 } else if (mRangeDataNtfConfig == RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG 1931 || mRangeDataNtfConfig 1932 == RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_EDGE_TRIG) { 1933 checkArgument( 1934 mRangeDataNtfProximityNear != RANGE_DATA_NTF_PROXIMITY_NEAR_DEFAULT 1935 || mRangeDataNtfProximityFar != RANGE_DATA_NTF_PROXIMITY_FAR_DEFAULT 1936 || mRangeDataNtfAoaAzimuthLower 1937 != RANGE_DATA_NTF_AOA_AZIMUTH_LOWER_DEFAULT 1938 || mRangeDataNtfAoaAzimuthUpper 1939 != RANGE_DATA_NTF_AOA_AZIMUTH_UPPER_DEFAULT 1940 || mRangeDataNtfAoaElevationLower 1941 != RANGE_DATA_NTF_AOA_ELEVATION_LOWER_DEFAULT 1942 || mRangeDataNtfAoaElevationUpper 1943 != RANGE_DATA_NTF_AOA_ELEVATION_UPPER_DEFAULT); 1944 } 1945 } checkDlTdoaParameters()1946 private void checkDlTdoaParameters() { 1947 if (mDeviceRole.get() == RANGING_DEVICE_DT_TAG) { 1948 checkArgument(mStsConfig == STS_CONFIG_STATIC 1949 && mMultiNodeMode.get() == MULTI_NODE_MODE_ONE_TO_MANY 1950 && mRframeConfig == RFRAME_CONFIG_SP1); 1951 } 1952 } 1953 1954 /** Sets the type of filtering used by the session. Defaults to FILTER_TYPE_DEFAULT */ setFilterType(@ilterType int filterType)1955 public FiraOpenSessionParams.Builder setFilterType(@FilterType int filterType) { 1956 this.mFilterType = filterType; 1957 return this; 1958 } 1959 build()1960 public FiraOpenSessionParams build() { 1961 checkAddress(); 1962 checkStsConfig(); 1963 checkInterleavingRatio(); 1964 checkRangeDataNtfConfig(); 1965 checkDlTdoaParameters(); 1966 return new FiraOpenSessionParams( 1967 mProtocolVersion.get(), 1968 mSessionId.get(), 1969 mSessionType, 1970 mDeviceType.get(), 1971 mDeviceRole.get(), 1972 mRangingRoundUsage, 1973 mMultiNodeMode.get(), 1974 mDeviceAddress, 1975 mDestAddressList, 1976 mInitiationTime, 1977 mSlotDurationRstu, 1978 mSlotsPerRangingRound, 1979 mRangingIntervalMs, 1980 mBlockStrideLength, 1981 mHoppingMode, 1982 mMaxRangingRoundRetries, 1983 mSessionPriority, 1984 mMacAddressMode, 1985 mHasRangingResultReportMessage, 1986 mHasControlMessage, 1987 mHasRangingControlPhase, 1988 mMeasurementReportType, 1989 mInBandTerminationAttemptCount, 1990 mChannelNumber, 1991 mPreambleCodeIndex, 1992 mRframeConfig, 1993 mPrfMode, 1994 mCapSize, 1995 mScheduledMode, 1996 mPreambleDuration, 1997 mSfdId, 1998 mStsSegmentCount, 1999 mStsLength, 2000 mSessionKey, 2001 mSubsessionKey, 2002 mPsduDataRate, 2003 mBprfPhrDataRate, 2004 mFcsType, 2005 mIsTxAdaptivePayloadPowerEnabled, 2006 mStsConfig, 2007 mSubSessionId.get(), 2008 mVendorId, 2009 mStaticStsIV, 2010 mIsRssiReportingEnabled, 2011 mIsDiagnosticsEnabled, 2012 mDiagramsFrameReportsFieldsFlags, 2013 mIsKeyRotationEnabled, 2014 mKeyRotationRate, 2015 mAoaResultRequest, 2016 mRangeDataNtfConfig, 2017 mRangeDataNtfProximityNear, 2018 mRangeDataNtfProximityFar, 2019 mRangeDataNtfAoaAzimuthLower, 2020 mRangeDataNtfAoaAzimuthUpper, 2021 mRangeDataNtfAoaElevationLower, 2022 mRangeDataNtfAoaElevationUpper, 2023 mHasTimeOfFlightReport, 2024 mHasAngleOfArrivalAzimuthReport, 2025 mHasAngleOfArrivalElevationReport, 2026 mHasAngleOfArrivalFigureOfMeritReport, 2027 mAoaType, 2028 mNumOfMsrmtFocusOnRange, 2029 mNumOfMsrmtFocusOnAoaAzimuth, 2030 mNumOfMsrmtFocusOnAoaElevation, 2031 mRangingErrorStreakTimeoutMs, 2032 mLinkLayerMode, 2033 mMinFramesPerRr, 2034 mMtuSize, 2035 mInterFrameInterval, 2036 mUlTdoaTxIntervalMs, 2037 mUlTdoaRandomWindowMs, 2038 mUlTdoaDeviceIdType, 2039 mUlTdoaDeviceId, 2040 mUlTdoaTxTimestampType, 2041 mFilterType, 2042 mMaxNumberOfMeasurements); 2043 } 2044 } 2045 } 2046