• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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