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