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