• 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 android.os.Build.VERSION_CODES;
20 import android.os.PersistableBundle;
21 import android.uwb.UwbAddress;
22 
23 import androidx.annotation.IntDef;
24 import androidx.annotation.RequiresApi;
25 
26 import com.google.uwb.support.base.FlagEnum;
27 import com.google.uwb.support.base.Params;
28 
29 import java.lang.annotation.Retention;
30 import java.lang.annotation.RetentionPolicy;
31 import java.nio.ByteBuffer;
32 import java.util.Arrays;
33 
34 /** Defines parameters for FiRa operation */
35 @RequiresApi(VERSION_CODES.LOLLIPOP)
36 public abstract class FiraParams extends Params {
37     public static final String PROTOCOL_NAME = "fira";
38 
39     @Override
getProtocolName()40     public final String getProtocolName() {
41         return PROTOCOL_NAME;
42     }
43 
isCorrectProtocol(PersistableBundle bundle)44     public static boolean isCorrectProtocol(PersistableBundle bundle) {
45         return isProtocol(bundle, PROTOCOL_NAME);
46     }
47 
48     public static final FiraProtocolVersion PROTOCOL_VERSION_1_1 = new FiraProtocolVersion(1, 1);
49     public static final FiraProtocolVersion PROTOCOL_VERSION_2_0 = new FiraProtocolVersion(2, 0);
50 
51     /** Service ID for FiRa profile */
52     @IntDef(
53             value = {
54                     PACS_PROFILE_SERVICE_ID,
55             })
56     public @interface ServiceID {}
57 
58     public static final int PACS_PROFILE_SERVICE_ID = 1;
59 
60     /** UWB Channel selections */
61     @Retention(RetentionPolicy.SOURCE)
62     @IntDef(
63             value = {
64                 UWB_CHANNEL_5,
65                 UWB_CHANNEL_6,
66                 UWB_CHANNEL_8,
67                 UWB_CHANNEL_9,
68                 UWB_CHANNEL_10,
69                 UWB_CHANNEL_12,
70                 UWB_CHANNEL_13,
71                 UWB_CHANNEL_14,
72             })
73     public @interface UwbChannel {}
74 
75     public static final int UWB_CHANNEL_5 = 5;
76     public static final int UWB_CHANNEL_6 = 6;
77     public static final int UWB_CHANNEL_8 = 8;
78     public static final int UWB_CHANNEL_9 = 9;
79     public static final int UWB_CHANNEL_10 = 10;
80     public static final int UWB_CHANNEL_12 = 12;
81     public static final int UWB_CHANNEL_13 = 13;
82     public static final int UWB_CHANNEL_14 = 14;
83 
84     /** UWB Channel selections */
85     @Retention(RetentionPolicy.SOURCE)
86     @IntDef(
87             value = {
88                 UWB_PREAMBLE_CODE_INDEX_9,
89                 UWB_PREAMBLE_CODE_INDEX_10,
90                 UWB_PREAMBLE_CODE_INDEX_11,
91                 UWB_PREAMBLE_CODE_INDEX_12,
92                 UWB_PREAMBLE_CODE_INDEX_25,
93                 UWB_PREAMBLE_CODE_INDEX_26,
94                 UWB_PREAMBLE_CODE_INDEX_27,
95                 UWB_PREAMBLE_CODE_INDEX_28,
96                 UWB_PREAMBLE_CODE_INDEX_29,
97                 UWB_PREAMBLE_CODE_INDEX_30,
98                 UWB_PREAMBLE_CODE_INDEX_31,
99                 UWB_PREAMBLE_CODE_INDEX_32,
100             })
101     public @interface UwbPreambleCodeIndex {}
102 
103     public static final int UWB_PREAMBLE_CODE_INDEX_9 = 9;
104     public static final int UWB_PREAMBLE_CODE_INDEX_10 = 10;
105     public static final int UWB_PREAMBLE_CODE_INDEX_11 = 11;
106     public static final int UWB_PREAMBLE_CODE_INDEX_12 = 12;
107     public static final int UWB_PREAMBLE_CODE_INDEX_25 = 25;
108     public static final int UWB_PREAMBLE_CODE_INDEX_26 = 26;
109     public static final int UWB_PREAMBLE_CODE_INDEX_27 = 27;
110     public static final int UWB_PREAMBLE_CODE_INDEX_28 = 28;
111     public static final int UWB_PREAMBLE_CODE_INDEX_29 = 29;
112     public static final int UWB_PREAMBLE_CODE_INDEX_30 = 30;
113     public static final int UWB_PREAMBLE_CODE_INDEX_31 = 31;
114     public static final int UWB_PREAMBLE_CODE_INDEX_32 = 32;
115 
116     /** Ranging frame type */
117     @Retention(RetentionPolicy.SOURCE)
118     @IntDef(
119             value = {
120                 RFRAME_CONFIG_SP0,
121                 RFRAME_CONFIG_SP1,
122                 RFRAME_CONFIG_SP3,
123             })
124     public @interface RframeConfig {}
125 
126     /** Ranging frame without STS */
127     public static final int RFRAME_CONFIG_SP0 = 0;
128 
129     /** Ranging frame with STS following SFD */
130     public static final int RFRAME_CONFIG_SP1 = 1;
131 
132     /** Ranging frame with STS following SFD, no data */
133     public static final int RFRAME_CONFIG_SP3 = 3;
134 
135     /** Device type defined in FiRa */
136     @IntDef(
137             value = {
138                 RANGING_DEVICE_TYPE_CONTROLEE,
139                 RANGING_DEVICE_TYPE_CONTROLLER,
140                 RANGING_DEVICE_TYPE_DT_TAG,
141             })
142     public @interface RangingDeviceType {}
143 
144     public static final int RANGING_DEVICE_TYPE_CONTROLEE = 0;
145 
146     public static final int RANGING_DEVICE_TYPE_CONTROLLER = 1;
147 
148     public static final int RANGING_DEVICE_TYPE_DT_TAG = 2;
149 
150     /** Device role defined in FiRa */
151     @IntDef(
152             value = {
153                 RANGING_DEVICE_ROLE_RESPONDER,
154                 RANGING_DEVICE_ROLE_INITIATOR,
155                 RANGING_DEVICE_UT_TAG,
156                 RANGING_DEVICE_ROLE_ADVERTISER,
157                 RANGING_DEVICE_ROLE_OBSERVER,
158                 RANGING_DEVICE_DT_ANCHOR,
159                 RANGING_DEVICE_DT_TAG,
160             })
161     public @interface RangingDeviceRole {}
162 
163     public static final int RANGING_DEVICE_ROLE_RESPONDER = 0;
164 
165     public static final int RANGING_DEVICE_ROLE_INITIATOR = 1;
166 
167     public static final int RANGING_DEVICE_UT_TAG = 4;
168 
169     public static final int RANGING_DEVICE_ROLE_ADVERTISER = 5;
170 
171     public static final int RANGING_DEVICE_ROLE_OBSERVER = 6;
172 
173     public static final int RANGING_DEVICE_DT_ANCHOR = 7;
174 
175     public static final int RANGING_DEVICE_DT_TAG = 8;
176 
177     /** Ranging Round Usage */
178     @IntDef(
179             value = {
180                 RANGING_ROUND_USAGE_UL_TDOA,
181                 RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE,
182                 RANGING_ROUND_USAGE_DS_TWR_DEFERRED_MODE,
183                 RANGING_ROUND_USAGE_SS_TWR_NON_DEFERRED_MODE,
184                 RANGING_ROUND_USAGE_DS_TWR_NON_DEFERRED_MODE,
185                 RANGING_ROUND_USAGE_OWR_AOA_MEASUREMENT,
186                 RANGING_ROUND_USAGE_DL_TDOA,
187                 RANGING_ROUND_USAGE_DATA_TRANSFER_MODE,
188                 RANGING_ROUND_USAGE_HYBRID_RANGING_MODE,
189             })
190     public @interface RangingRoundUsage {}
191 
192     /** Uplink Time Difference of Arrival (OWR) */
193     public static final int RANGING_ROUND_USAGE_UL_TDOA = 0;
194 
195     /** Single-sided two-way ranging, deferred */
196     public static final int RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE = 1;
197 
198     /** Double-sided two-way ranging, deferred */
199     public static final int RANGING_ROUND_USAGE_DS_TWR_DEFERRED_MODE = 2;
200 
201     /** Single-sided two-way ranging, non-deferred */
202     public static final int RANGING_ROUND_USAGE_SS_TWR_NON_DEFERRED_MODE = 3;
203 
204     /** Double-sided two-way ranging, non-deferred */
205     public static final int RANGING_ROUND_USAGE_DS_TWR_NON_DEFERRED_MODE = 4;
206 
207     /** Downlink Time Difference of Arrival */
208     public static final int RANGING_ROUND_USAGE_DL_TDOA = 5;
209 
210     /** OWR for AoA measurement */
211     public static final int RANGING_ROUND_USAGE_OWR_AOA_MEASUREMENT = 6;
212 
213     /** Data transfer mode */
214     public static final int RANGING_ROUND_USAGE_DATA_TRANSFER_MODE = 9;
215 
216     /** Hybrid ranging mode */
217     public static final int RANGING_ROUND_USAGE_HYBRID_RANGING_MODE = 0x0A;
218 
219     /** Multi-Node mode */
220     @IntDef(
221             value = {
222                 MULTI_NODE_MODE_UNICAST,
223                 MULTI_NODE_MODE_ONE_TO_MANY,
224                 MULTI_NODE_MODE_MANY_TO_MANY,
225             })
226     public @interface MultiNodeMode {}
227 
228     public static final int MULTI_NODE_MODE_UNICAST = 0;
229 
230     public static final int MULTI_NODE_MODE_ONE_TO_MANY = 1;
231 
232     /** Unuported in Fira 1.1 */
233     public static final int MULTI_NODE_MODE_MANY_TO_MANY = 2;
234 
235     /** Scheduling Mode */
236     @IntDef(
237             value = {
238                 CONTENTION_BASED_RANGING,
239                 TIME_SCHEDULED_RANGING,
240                 HYBRID_SCHEDULED_RANGING,
241             })
242     public @interface SchedulingMode {}
243 
244     public static final int CONTENTION_BASED_RANGING = 0;
245 
246     public static final int TIME_SCHEDULED_RANGING = 1;
247 
248     public static final int HYBRID_SCHEDULED_RANGING = 2;
249 
250     /** Ranging Time Struct */
251     @IntDef(
252             value = {
253                 INTERVAL_BASED_SCHEDULING,
254                 BLOCK_BASED_SCHEDULING,
255             })
256     public @interface RangingTimeStruct {}
257 
258     public static final int INTERVAL_BASED_SCHEDULING = 0;
259 
260     public static final int BLOCK_BASED_SCHEDULING = 1;
261 
262     /** Hybrid session controller phase participation */
263     @IntDef(
264             value = {
265                 PARTICIPATION_AS_DEFINED_DEVICE_ROLE,
266                 NO_PARTICIPATION_IN_THE_PHASE,
267                 PARTICIPATION_AS_INITIATOR,
268                 PARTICIPATION_AS_RESPONDER,
269             })
270     public @interface PhaseParticipationHybridSessionController {}
271 
272     public static final int PARTICIPATION_AS_DEFINED_DEVICE_ROLE = 0;
273 
274     public static final int NO_PARTICIPATION_IN_THE_PHASE = 1;
275 
276     public static final int PARTICIPATION_AS_INITIATOR = 2;
277 
278     public static final int PARTICIPATION_AS_RESPONDER = 3;
279 
280     /** Cc Constraint Length */
281     @IntDef(
282             value = {
283                 CONSTRAINT_LENGTH_3,
284                 CONSTRAINT_LENGTH_7,
285             })
286     public @interface CcConstraintLength {}
287 
288     public static final int CONSTRAINT_LENGTH_3 = 3;
289 
290     public static final int CONSTRAINT_LENGTH_7 = 7;
291 
292     /** Measurement Report Type */
293     @IntDef(
294             value = {
295                 MEASUREMENT_REPORT_TYPE_INITIATOR_TO_RESPONDER,
296                 MEASUREMENT_REPORT_TYPE_RESPONDER_TO_INITIATOR,
297             })
298     public @interface MeasurementReportType {}
299 
300     public static final int MEASUREMENT_REPORT_TYPE_INITIATOR_TO_RESPONDER = 0;
301 
302     public static final int MEASUREMENT_REPORT_TYPE_RESPONDER_TO_INITIATOR = 1;
303 
304     /** Measurement Report Phase */
305     @IntDef(
306             value = {
307                 MEASUREMENT_REPORT_PHASE_NOTSET,
308                 MEASUREMENT_REPORT_PHASE_SET,
309             })
310     public @interface MeasurementReportPhase {}
311 
312     public static final int MEASUREMENT_REPORT_PHASE_NOTSET = 0;
313 
314     public static final int MEASUREMENT_REPORT_PHASE_SET = 1;
315 
316     /** PRF Mode */
317     @IntDef(
318             value = {
319                 PRF_MODE_BPRF,
320                 PRF_MODE_HPRF,
321                 PRF_MODE_HPRF_HIGH_DATA_RATE,
322             })
323     public @interface PrfMode {}
324 
325     public static final int PRF_MODE_BPRF = 0;
326 
327     public static final int PRF_MODE_HPRF = 1;
328 
329     public static final int PRF_MODE_HPRF_HIGH_DATA_RATE = 2;
330 
331     /** Preamble duration: BPRF always uses 64 symbols */
332     @IntDef(
333             value = {
334                 PREAMBLE_DURATION_T32_SYMBOLS,
335                 PREAMBLE_DURATION_T64_SYMBOLS,
336             })
337     public @interface PreambleDuration {}
338 
339     /** HPRF only */
340     public static final int PREAMBLE_DURATION_T32_SYMBOLS = 0;
341 
342     public static final int PREAMBLE_DURATION_T64_SYMBOLS = 1;
343 
344     /** PSDU data Rate */
345     @IntDef(
346             value = {
347                 PSDU_DATA_RATE_6M81,
348                 PSDU_DATA_RATE_7M80,
349                 PSDU_DATA_RATE_27M2,
350                 PSDU_DATA_RATE_31M2,
351             })
352     public @interface PsduDataRate {}
353 
354     /** 6.81 Mbps, default BPRF rate */
355     public static final int PSDU_DATA_RATE_6M81 = 0;
356 
357     /** 7.80 Mbps, BPRF rate with convolutional encoding K = 7 */
358     public static final int PSDU_DATA_RATE_7M80 = 1;
359 
360     /** 27.2 Mbps, default HPRF rate */
361     public static final int PSDU_DATA_RATE_27M2 = 2;
362 
363     /** 31.2 Mbps, HPRF rate with convolutional encoding K = 7 */
364     public static final int PSDU_DATA_RATE_31M2 = 3;
365 
366     /** BPRF PHY Header data rate */
367     @IntDef(
368             value = {
369                 BPRF_PHR_DATA_RATE_850K,
370                 BPRF_PHR_DATA_RATE_6M81,
371             })
372     public @interface BprfPhrDataRate {}
373 
374     /** 850 kbps */
375     public static final int BPRF_PHR_DATA_RATE_850K = 0;
376 
377     /** 6.81 Mbps */
378     public static final int BPRF_PHR_DATA_RATE_6M81 = 1;
379 
380     /** MAC FCS type */
381     @IntDef(
382             value = {
383                 MAC_FCS_TYPE_CRC_16,
384                 MAC_FCS_TYPE_CRC_32,
385             })
386     public @interface MacFcsType {}
387 
388     public static final int MAC_FCS_TYPE_CRC_16 = 0;
389     /** HPRF only */
390     public static final int MAC_FCS_TYPE_CRC_32 = 1;
391 
392     /** STS Config */
393     @IntDef(
394             value = {
395                 STS_CONFIG_STATIC,
396                 STS_CONFIG_DYNAMIC,
397                 STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY,
398                 STS_CONFIG_PROVISIONED,
399                 STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY,
400             })
401     public @interface StsConfig {}
402 
403     public static final int STS_CONFIG_STATIC = 0;
404 
405     public static final int STS_CONFIG_DYNAMIC = 1;
406 
407     public static final int STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY = 2;
408 
409     public static final int STS_CONFIG_PROVISIONED = 3;
410 
411     public static final int STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY = 4;
412 
413     /** AoA request */
414     @IntDef(
415             value = {
416                 AOA_RESULT_REQUEST_MODE_NO_AOA_REPORT,
417                 AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS,
418                 AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_AZIMUTH_ONLY,
419                 AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_ELEVATION_ONLY,
420                 AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_INTERLEAVED,
421             })
422     public @interface AoaResultRequestMode {}
423 
424     public static final int AOA_RESULT_REQUEST_MODE_NO_AOA_REPORT = 0;
425 
426     public static final int AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS = 1;
427 
428     public static final int AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_AZIMUTH_ONLY = 2;
429 
430     public static final int AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_ELEVATION_ONLY = 3;
431 
432     public static final int AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_INTERLEAVED = 0xF0;
433 
434     /** STS Segment count */
435     @IntDef(
436             value = {
437                 STS_SEGMENT_COUNT_VALUE_0,
438                 STS_SEGMENT_COUNT_VALUE_1,
439                 STS_SEGMENT_COUNT_VALUE_2,
440             })
441     public @interface StsSegmentCountValue {}
442 
443     public static final int STS_SEGMENT_COUNT_VALUE_0 = 0;
444 
445     public static final int STS_SEGMENT_COUNT_VALUE_1 = 1;
446 
447     public static final int STS_SEGMENT_COUNT_VALUE_2 = 2;
448 
449     /** SFD ID */
450     @IntDef(
451             value = {
452                 SFD_ID_VALUE_0,
453                 SFD_ID_VALUE_1,
454                 SFD_ID_VALUE_2,
455                 SFD_ID_VALUE_3,
456                 SFD_ID_VALUE_4,
457             })
458     public @interface SfdIdValue {}
459 
460     public static final int SFD_ID_VALUE_0 = 0;
461     public static final int SFD_ID_VALUE_1 = 1;
462     public static final int SFD_ID_VALUE_2 = 2;
463     public static final int SFD_ID_VALUE_3 = 3;
464     public static final int SFD_ID_VALUE_4 = 4;
465 
466     /**
467      * Hopping mode (Since FiRa supports vendor-specific values. This annotation is not enforced.)
468      */
469     @IntDef(
470             value = {
471                 HOPPING_MODE_DISABLE,
472                 HOPPING_MODE_FIRA_HOPPING_ENABLE,
473             })
474     public @interface HoppingMode {}
475 
476       /** UCI spec default: 25 slots per ranging round. */
477     public static final int SLOTS_PER_RR = 25;
478     public static final int MIN_CAP_SIZE = 5;
479     public static final int HOPPING_MODE_DISABLE = 0;
480     public static final int HOPPING_MODE_FIRA_HOPPING_ENABLE = 1;
481 
482     /** STS Length */
483     @IntDef(
484             value = {
485                 STS_LENGTH_32_SYMBOLS,
486                 STS_LENGTH_64_SYMBOLS,
487                 STS_LENGTH_128_SYMBOLS,
488             })
489     public @interface StsLength {}
490 
491     public static final int STS_LENGTH_32_SYMBOLS = 0;
492     public static final int STS_LENGTH_64_SYMBOLS = 1;
493     public static final int STS_LENGTH_128_SYMBOLS = 2;
494 
495     /** Range Data Notification Config */
496     @IntDef(
497             value = {
498                 RANGE_DATA_NTF_CONFIG_DISABLE,
499                 RANGE_DATA_NTF_CONFIG_ENABLE,
500                 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_LEVEL_TRIG,
501                 RANGE_DATA_NTF_CONFIG_ENABLE_AOA_LEVEL_TRIG,
502                 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG,
503                 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_EDGE_TRIG,
504                 RANGE_DATA_NTF_CONFIG_ENABLE_AOA_EDGE_TRIG,
505                 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_EDGE_TRIG,
506             })
507     public @interface RangeDataNtfConfig {}
508 
509     public static final int RANGE_DATA_NTF_CONFIG_DISABLE = 0;
510     public static final int RANGE_DATA_NTF_CONFIG_ENABLE = 1;
511     public static final int RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_LEVEL_TRIG = 2;
512     public static final int RANGE_DATA_NTF_CONFIG_ENABLE_AOA_LEVEL_TRIG = 3;
513     public static final int RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG = 4;
514     public static final int RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_EDGE_TRIG = 5;
515     public static final int RANGE_DATA_NTF_CONFIG_ENABLE_AOA_EDGE_TRIG = 6;
516     public static final int RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_EDGE_TRIG = 7;
517 
518     /** MAC address mode: short (2 bytes) or extended (8 bytes) */
519     @IntDef(
520             value = {
521                 MAC_ADDRESS_MODE_2_BYTES,
522                 MAC_ADDRESS_MODE_8_BYTES_2_BYTES_HEADER,
523                 MAC_ADDRESS_MODE_8_BYTES,
524             })
525     public @interface MacAddressMode {}
526 
527     public static final int MAC_ADDRESS_MODE_2_BYTES = 0;
528 
529     /** Not supported by UCI 1.0 */
530     public static final int MAC_ADDRESS_MODE_8_BYTES_2_BYTES_HEADER = 1;
531 
532     public static final int MAC_ADDRESS_MODE_8_BYTES = 2;
533 
534     /** AoA type is not defined in UCI. This decides what AoA result we want to get */
535     @IntDef(
536             value = {
537                 AOA_TYPE_AZIMUTH,
538                 AOA_TYPE_ELEVATION,
539                 AOA_TYPE_AZIMUTH_AND_ELEVATION,
540             })
541     public @interface AoaType {}
542 
543     public static final int AOA_TYPE_AZIMUTH = 0;
544     public static final int AOA_TYPE_ELEVATION = 1;
545 
546     /**
547      * How to get both angles is hardware dependent. Some hardware can get both angle in one round,
548      * some needs two rounds.
549      */
550     public static final int AOA_TYPE_AZIMUTH_AND_ELEVATION = 2;
551 
552     /** Status codes defined in UCI */
553     @IntDef(
554             value = {
555                 STATUS_CODE_OK,
556                 STATUS_CODE_REJECTED,
557                 STATUS_CODE_FAILED,
558                 STATUS_CODE_SYNTAX_ERROR,
559                 STATUS_CODE_INVALID_PARAM,
560                 STATUS_CODE_INVALID_RANGE,
561                 STATUS_CODE_INVALID_MESSAGE_SIZE,
562                 STATUS_CODE_UNKNOWN_GID,
563                 STATUS_CODE_UNKNOWN_OID,
564                 STATUS_CODE_READ_ONLY,
565                 STATUS_CODE_COMMAND_RETRY,
566                 STATUS_CODE_UNKNOWN,
567                 STATUS_CODE_ERROR_SESSION_NOT_EXIST,
568                 STATUS_CODE_ERROR_SESSION_DUPLICATE,
569                 STATUS_CODE_ERROR_SESSION_ACTIVE,
570                 STATUS_CODE_ERROR_MAX_SESSIONS_EXCEEDED,
571                 STATUS_CODE_ERROR_SESSION_NOT_CONFIGURED,
572                 STATUS_CODE_ERROR_ACTIVE_SESSIONS_ONGOING,
573                 STATUS_CODE_ERROR_MULTICAST_LIST_FULL,
574                 STATUS_CODE_ERROR_ADDRESS_NOT_FOUND,
575                 STATUS_CODE_ERROR_ADDRESS_ALREADY_PRESENT,
576                 STATUS_CODE_OK_NEGATIVE_DISTANCE_REPORT,
577                 STATUS_CODE_RANGING_TX_FAILED,
578                 STATUS_CODE_RANGING_RX_TIMEOUT,
579                 STATUS_CODE_RANGING_RX_PHY_DEC_FAILED,
580                 STATUS_CODE_RANGING_RX_PHY_TOA_FAILED,
581                 STATUS_CODE_RANGING_RX_PHY_STS_FAILED,
582                 STATUS_CODE_RANGING_RX_MAC_DEC_FAILED,
583                 STATUS_CODE_RANGING_RX_MAC_IE_DEC_FAILED,
584                 STATUS_CODE_RANGING_RX_MAC_IE_MISSING,
585                 STATUS_CODE_ERROR_ROUND_INDEX_NOT_ACTIVATED,
586                 STATUS_CODE_ERROR_NUMBER_OF_ACTIVE_RANGING_ROUNDS_EXCEEDED,
587                 STATUS_CODE_ERROR_ROUND_INDEX_NOT_SET_AS_INITIATOR,
588                 STATUS_CODE_ERROR_DL_TDOA_DEVICE_ADDRESS_NOT_MATCHING_IN_REPLY_TIME_LIST,
589             })
590     public @interface StatusCode {}
591 
592     public static final int STATUS_CODE_OK = 0x00;
593     public static final int STATUS_CODE_REJECTED = 0x01;
594     public static final int STATUS_CODE_FAILED = 0x02;
595     public static final int STATUS_CODE_SYNTAX_ERROR = 0x03;
596     public static final int STATUS_CODE_INVALID_PARAM = 0x04;
597     public static final int STATUS_CODE_INVALID_RANGE = 0x05;
598     public static final int STATUS_CODE_INVALID_MESSAGE_SIZE = 0x06;
599     public static final int STATUS_CODE_UNKNOWN_GID = 0x07;
600     public static final int STATUS_CODE_UNKNOWN_OID = 0x08;
601     public static final int STATUS_CODE_READ_ONLY = 0x09;
602     public static final int STATUS_CODE_COMMAND_RETRY = 0x0A;
603     public static final int STATUS_CODE_UNKNOWN = 0x0B;
604     public static final int STATUS_CODE_ERROR_SESSION_NOT_EXIST = 0x11;
605     public static final int STATUS_CODE_ERROR_SESSION_DUPLICATE = 0x12;
606     public static final int STATUS_CODE_ERROR_SESSION_ACTIVE = 0x13;
607     public static final int STATUS_CODE_ERROR_MAX_SESSIONS_EXCEEDED = 0x14;
608     public static final int STATUS_CODE_ERROR_SESSION_NOT_CONFIGURED = 0x15;
609     public static final int STATUS_CODE_ERROR_ACTIVE_SESSIONS_ONGOING = 0x16;
610     public static final int STATUS_CODE_ERROR_MULTICAST_LIST_FULL = 0x17;
611     public static final int STATUS_CODE_ERROR_ADDRESS_NOT_FOUND = 0x18;
612     public static final int STATUS_CODE_ERROR_ADDRESS_ALREADY_PRESENT = 0x19;
613     public static final int STATUS_CODE_OK_NEGATIVE_DISTANCE_REPORT = 0x1B;
614     public static final int STATUS_CODE_RANGING_TX_FAILED = 0x20;
615     public static final int STATUS_CODE_RANGING_RX_TIMEOUT = 0x21;
616     public static final int STATUS_CODE_RANGING_RX_PHY_DEC_FAILED = 0x22;
617     public static final int STATUS_CODE_RANGING_RX_PHY_TOA_FAILED = 0x23;
618     public static final int STATUS_CODE_RANGING_RX_PHY_STS_FAILED = 0x24;
619     public static final int STATUS_CODE_RANGING_RX_MAC_DEC_FAILED = 0x25;
620     public static final int STATUS_CODE_RANGING_RX_MAC_IE_DEC_FAILED = 0x26;
621     public static final int STATUS_CODE_RANGING_RX_MAC_IE_MISSING = 0x27;
622     public static final int STATUS_CODE_ERROR_ROUND_INDEX_NOT_ACTIVATED = 0X28;
623     public static final int STATUS_CODE_ERROR_NUMBER_OF_ACTIVE_RANGING_ROUNDS_EXCEEDED = 0X29;
624     public static final int STATUS_CODE_ERROR_ROUND_INDEX_NOT_SET_AS_INITIATOR = 0X2A;
625     public static final int
626             STATUS_CODE_ERROR_DL_TDOA_DEVICE_ADDRESS_NOT_MATCHING_IN_REPLY_TIME_LIST = 0X2B;
627 
628     /**
629      * Table 28: Status codes in the DATA_TRANSFER_STATUS_NTF.
630      */
631     @IntDef(
632             value = {
633                     STATUS_CODE_DATA_TRANSFER_NTF_REPETITION_OK,
634                     STATUS_CODE_DATA_TRANSFER_NTF_OK,
635                     STATUS_CODE_DATA_TRANSFER_NTF_ERROR_DATA_TRANSFER,
636                     STATUS_CODE_DATA_TRANSFER_NTF_ERROR_NO_CREDIT_AVAILABLE,
637                     STATUS_CODE_DATA_TRANSFER_NTF_ERROR_REJECTED,
638                     STATUS_CODE_DATA_TRANSFER_NTF_SESSION_TYPE_NOT_SUPPORTED,
639                     STATUS_CODE_DATA_TRANSFER_NTF_ERROR_DATA_TRANSFER_IS_ONGOING,
640                     STATUS_CODE_DATA_TRANSFER_NTF_STATUS_INVALID_FORMAT
641             })
642     public @interface DataTransferStatusNtfCode {}
643 
644     public static final int STATUS_CODE_DATA_TRANSFER_NTF_REPETITION_OK = 0;
645     public static final int STATUS_CODE_DATA_TRANSFER_NTF_OK = 1;
646     public static final int STATUS_CODE_DATA_TRANSFER_NTF_ERROR_DATA_TRANSFER = 2;
647     public static final int STATUS_CODE_DATA_TRANSFER_NTF_ERROR_NO_CREDIT_AVAILABLE = 3;
648     public static final int STATUS_CODE_DATA_TRANSFER_NTF_ERROR_REJECTED = 4;
649     public static final int STATUS_CODE_DATA_TRANSFER_NTF_SESSION_TYPE_NOT_SUPPORTED = 5;
650     public static final int STATUS_CODE_DATA_TRANSFER_NTF_ERROR_DATA_TRANSFER_IS_ONGOING = 6;
651     public static final int STATUS_CODE_DATA_TRANSFER_NTF_STATUS_INVALID_FORMAT = 7;
652 
653     /**
654      * Table TBD: Status codes in the SESSION_DATA_TRANSFER_PHASE_CONFIGURATION_NTF.
655      */
656     @IntDef(
657             value = {
658                     STATUS_CODE_DATA_TRANSFER_PHASE_CONFIG_DTPCM_CONFIG_SUCCESS,
659                     STATUS_CODE_DATA_TRANSFER_PHASE_CONFIG_ERROR_DUPLICATE_SLOT_ASSIGNMENT
660             })
661     public @interface DataTransferPhaseConfigNtfStatusCode {}
662 
663     public static final int STATUS_CODE_DATA_TRANSFER_PHASE_CONFIG_DTPCM_CONFIG_SUCCESS = 0;
664     public static final int
665             STATUS_CODE_DATA_TRANSFER_PHASE_CONFIG_ERROR_DUPLICATE_SLOT_ASSIGNMENT = 1;
666 
667     /** State change reason codes defined in UCI table-15 */
668     @IntDef(
669             value = {
670                 STATE_CHANGE_REASON_CODE_BY_COMMANDS,
671                 STATE_CHANGE_REASON_CODE_MAX_RR_RETRY_REACHED,
672                 STATE_CHANGE_REASON_CODE_ERROR_SLOT_LENGTH_NOT_SUPPORTED,
673                 STATE_CHANGE_REASON_CODE_ERROR_INSUFFICIENT_SLOTS_PER_RR,
674                 STATE_CHANGE_REASON_CODE_ERROR_MAC_ADDRESS_MODE_NOT_SUPPORTED,
675                 STATE_CHANGE_REASON_CODE_ERROR_INVALID_RANGING_INTERVAL,
676                 STATE_CHANGE_REASON_CODE_ERROR_INVALID_STS_CONFIG,
677                 STATE_CHANGE_REASON_CODE_ERROR_INVALID_RFRAME_CONFIG,
678                 STATE_CHANGE_REASON_CODE_ERROR_HUS_NOT_ENOUGH_SLOTS,
679                 STATE_CHANGE_REASON_CODE_ERROR_HUS_CFP_PHASE_TOO_SHORT,
680                 STATE_CHANGE_REASON_CODE_ERROR_HUS_CAP_PHASE_TOO_SHORT,
681                 STATE_CHANGE_REASON_CODE_ERROR_HUS_OTHERS,
682             })
683     public @interface StateChangeReasonCode {}
684 
685     public static final int STATE_CHANGE_REASON_CODE_BY_COMMANDS = 0;
686     public static final int STATE_CHANGE_REASON_CODE_MAX_RR_RETRY_REACHED = 1;
687     public static final int STATE_CHANGE_REASON_CODE_ERROR_SLOT_LENGTH_NOT_SUPPORTED = 0x20;
688     public static final int STATE_CHANGE_REASON_CODE_ERROR_INSUFFICIENT_SLOTS_PER_RR = 0x21;
689     public static final int STATE_CHANGE_REASON_CODE_ERROR_MAC_ADDRESS_MODE_NOT_SUPPORTED = 0x22;
690     public static final int STATE_CHANGE_REASON_CODE_ERROR_INVALID_RANGING_INTERVAL = 0x23;
691     public static final int STATE_CHANGE_REASON_CODE_ERROR_INVALID_STS_CONFIG = 0x24;
692     public static final int STATE_CHANGE_REASON_CODE_ERROR_INVALID_RFRAME_CONFIG = 0x25;
693     public static final int STATE_CHANGE_REASON_CODE_ERROR_HUS_NOT_ENOUGH_SLOTS = 0x26;
694     public static final int STATE_CHANGE_REASON_CODE_ERROR_HUS_CFP_PHASE_TOO_SHORT = 0x27;
695     public static final int STATE_CHANGE_REASON_CODE_ERROR_HUS_CAP_PHASE_TOO_SHORT = 0x28;
696     public static final int STATE_CHANGE_REASON_CODE_ERROR_HUS_OTHERS = 0x29;
697 
698     /** Multicast controlee add/delete actions defined in UCI */
699     @IntDef(
700             value = {
701                 MULTICAST_LIST_UPDATE_ACTION_ADD,
702                 MULTICAST_LIST_UPDATE_ACTION_DELETE,
703                 P_STS_MULTICAST_LIST_UPDATE_ACTION_ADD_16_BYTE,
704                 P_STS_MULTICAST_LIST_UPDATE_ACTION_ADD_32_BYTE,
705             })
706     public @interface MulticastListUpdateAction {}
707 
708     public static final int MULTICAST_LIST_UPDATE_ACTION_ADD = 0x0;
709     public static final int MULTICAST_LIST_UPDATE_ACTION_DELETE = 0x1;
710     public static final int P_STS_MULTICAST_LIST_UPDATE_ACTION_ADD_16_BYTE = 0x2;
711     public static final int P_STS_MULTICAST_LIST_UPDATE_ACTION_ADD_32_BYTE = 0x3;
712 
713     @IntDef(
714             value = {
715                 MULTICAST_LIST_UPDATE_STATUS_OK,
716                 MULTICAST_LIST_UPDATE_STATUS_ERROR_MULTICAST_LIST_FULL,
717                 MULTICAST_LIST_UPDATE_STATUS_ERROR_KEY_FETCH_FAIL,
718                 MULTICAST_LIST_UPDATE_STATUS_ERROR_SUB_SESSION_ID_NOT_FOUND,
719                 MULTICAST_LIST_UPDATE_STATUS_ERROR_SUB_SESSION_KEY_NOT_FOUND,
720                 MULTICAST_LIST_UPDATE_STATUS_ERROR_SUB_SESSION_KEY_NOT_APPLICABLE,
721                 MULTICAST_LIST_UPDATE_STATUS_ERROR_SESSION_KEY_NOT_FOUND,
722                 MULTICAST_LIST_UPDATE_STATUS_ERROR_ADDRESS_NOT_FOUND,
723                 MULTICAST_LIST_UPDATE_STATUS_ERROR_ADDRESS_ALREADY_PRESENT,
724             })
725     public @interface MulticastListUpdateStatus {}
726 
727     public static final int MULTICAST_LIST_UPDATE_STATUS_OK = 0;
728     public static final int MULTICAST_LIST_UPDATE_STATUS_ERROR_MULTICAST_LIST_FULL = 1;
729     public static final int MULTICAST_LIST_UPDATE_STATUS_ERROR_KEY_FETCH_FAIL = 2;
730     public static final int MULTICAST_LIST_UPDATE_STATUS_ERROR_SUB_SESSION_ID_NOT_FOUND = 3;
731     public static final int MULTICAST_LIST_UPDATE_STATUS_ERROR_SUB_SESSION_KEY_NOT_FOUND = 4;
732     public static final int MULTICAST_LIST_UPDATE_STATUS_ERROR_SUB_SESSION_KEY_NOT_APPLICABLE = 5;
733     public static final int MULTICAST_LIST_UPDATE_STATUS_ERROR_SESSION_KEY_NOT_FOUND = 6;
734     public static final int MULTICAST_LIST_UPDATE_STATUS_ERROR_ADDRESS_NOT_FOUND = 7;
735     public static final int MULTICAST_LIST_UPDATE_STATUS_ERROR_ADDRESS_ALREADY_PRESENT = 8;
736 
737     /** Capability related definitions starts from here */
738     @IntDef(
739             value = {
740                 DEVICE_CLASS_1,
741                 DEVICE_CLASS_2,
742                 DEVICE_CLASS_3,
743             })
744     public @interface DeviceClass {}
745 
746     public static final int DEVICE_CLASS_1 = 1; // Controller & controlee
747     public static final int DEVICE_CLASS_2 = 2; // Controller
748     public static final int DEVICE_CLASS_3 = 3; // Controlee
749 
750     /** Length of UL-TDoA Device ID */
751     @IntDef(
752             value = {
753                     UL_TDOA_DEVICE_ID_NONE,
754                     UL_TDOA_DEVICE_ID_16_BIT,
755                     UL_TDOA_DEVICE_ID_32_BIT,
756                     UL_TDOA_DEVICE_ID_64_BIT,
757             })
758     public @interface UlTdoaDeviceIdType {}
759 
760     public static final int UL_TDOA_DEVICE_ID_NONE = 0;
761     public static final int UL_TDOA_DEVICE_ID_16_BIT = 1;
762     public static final int UL_TDOA_DEVICE_ID_32_BIT = 2;
763     public static final int UL_TDOA_DEVICE_ID_64_BIT = 3;
764 
765     /** TX Timestamp of UL-TDoA */
766     @IntDef(
767             value = {
768                     TX_TIMESTAMP_NONE,
769                     TX_TIMESTAMP_40_BIT,
770                     TX_TIMESTAMP_64_BIT,
771             })
772     public @interface UlTdoaTxTimestampType {}
773 
774     public static final int TX_TIMESTAMP_NONE = 0;
775     public static final int TX_TIMESTAMP_40_BIT = 1;
776     public static final int TX_TIMESTAMP_64_BIT = 2;
777 
778     public static final int RANGE_DATA_NTF_PROXIMITY_NEAR_DEFAULT = 0;
779     public static final int RANGE_DATA_NTF_PROXIMITY_FAR_DEFAULT = 20000;
780     public static final double RANGE_DATA_NTF_AOA_AZIMUTH_LOWER_DEFAULT = -Math.PI;
781     public static final double RANGE_DATA_NTF_AOA_AZIMUTH_UPPER_DEFAULT = Math.PI;
782     public static final double RANGE_DATA_NTF_AOA_ELEVATION_LOWER_DEFAULT = -Math.PI / 2;
783     public static final double RANGE_DATA_NTF_AOA_ELEVATION_UPPER_DEFAULT = Math.PI / 2;
784 
785     public enum AoaCapabilityFlag implements FlagEnum {
786         HAS_AZIMUTH_SUPPORT(1),
787         HAS_ELEVATION_SUPPORT(1 << 1),
788         HAS_FOM_SUPPORT(1 << 2),
789         HAS_FULL_AZIMUTH_SUPPORT(1 << 3),
790         HAS_INTERLEAVING_SUPPORT(1 << 4);
791 
792         private final long mValue;
793 
AoaCapabilityFlag(long value)794         private AoaCapabilityFlag(long value) {
795             mValue = value;
796         }
797 
798         @Override
getValue()799         public long getValue() {
800             return mValue;
801         }
802     }
803 
804     public enum DeviceRoleCapabilityFlag implements FlagEnum {
805         HAS_CONTROLEE_INITIATOR_SUPPORT(1),
806         HAS_CONTROLEE_RESPONDER_SUPPORT(1 << 1),
807         HAS_CONTROLLER_INITIATOR_SUPPORT(1 << 2),
808         HAS_CONTROLLER_RESPONDER_SUPPORT(1 << 3),
809         HAS_UT_SYNCHRONIZATION_SUPPORT(1 << 4),
810         HAS_UT_ANCHOR_SUPPORT(1 << 5),
811         HAS_UT_TAG_SUPPORT(1 << 6),
812         HAS_ADVERTISER_SUPPORT(1 << 7),
813         HAS_OBSERVER_SUPPORT(1 << 8),
814         HAS_DT_ANCHOR_SUPPORT(1 << 9),
815         HAS_DT_TAG_SUPPORT(1 << 10);
816 
817         private final long mValue;
818 
DeviceRoleCapabilityFlag(long value)819         private DeviceRoleCapabilityFlag(long value) {
820             mValue = value;
821         }
822 
823         @Override
getValue()824         public long getValue() {
825             return mValue;
826         }
827     }
828 
829     public enum MultiNodeCapabilityFlag implements FlagEnum {
830         HAS_UNICAST_SUPPORT(1),
831         HAS_ONE_TO_MANY_SUPPORT(1 << 1),
832         HAS_MANY_TO_MANY_SUPPORT(1 << 2);
833 
834         private final long mValue;
835 
MultiNodeCapabilityFlag(long value)836         private MultiNodeCapabilityFlag(long value) {
837             mValue = value;
838         }
839 
840         @Override
getValue()841         public long getValue() {
842             return mValue;
843         }
844     }
845 
846     public enum RangingTimeStructCapabilitiesFlag implements FlagEnum {
847         HAS_INTERVAL_BASED_SCHEDULING_SUPPORT(1),
848         HAS_BLOCK_BASED_SCHEDULING_SUPPORT(1 << 1);
849 
850         private final long mValue;
851 
RangingTimeStructCapabilitiesFlag(long value)852         private RangingTimeStructCapabilitiesFlag(long value) {
853             mValue = value;
854         }
855 
856         @Override
getValue()857         public long getValue() {
858             return mValue;
859         }
860     }
861 
862     public enum SchedulingModeCapabilitiesFlag implements FlagEnum {
863         HAS_CONTENTION_BASED_RANGING_SUPPORT(1),
864         HAS_TIME_SCHEDULED_RANGING_SUPPORT(1 << 1),
865         HAS_HYBRID_SCHEDULED_RANGING_SUPPORT(1 << 2);
866 
867         private final long mValue;
868 
SchedulingModeCapabilitiesFlag(long value)869         private SchedulingModeCapabilitiesFlag(long value) {
870             mValue = value;
871         }
872 
873         @Override
getValue()874         public long getValue() {
875             return mValue;
876         }
877     }
878 
879     public enum CcConstraintLengthCapabilitiesFlag implements FlagEnum {
880         HAS_CONSTRAINT_LENGTH_3_SUPPORT(1),
881         HAS_CONSTRAINT_LENGTH_7_SUPPORT(1 << 1);
882 
883         private final long mValue;
884 
CcConstraintLengthCapabilitiesFlag(long value)885         private CcConstraintLengthCapabilitiesFlag(long value) {
886             mValue = value;
887         }
888 
889         @Override
getValue()890         public long getValue() {
891             return mValue;
892         }
893     }
894 
895     public enum PrfCapabilityFlag implements FlagEnum {
896         HAS_BPRF_SUPPORT(1),
897         HAS_HPRF_SUPPORT(1 << 1);
898 
899         private final long mValue;
900 
PrfCapabilityFlag(long value)901         private PrfCapabilityFlag(long value) {
902             mValue = value;
903         }
904 
905         @Override
getValue()906         public long getValue() {
907             return mValue;
908         }
909     }
910 
911     public enum RangingRoundCapabilityFlag implements FlagEnum {
912         HAS_DS_TWR_SUPPORT(1),
913         HAS_SS_TWR_SUPPORT(1 << 1),
914         // TODO(b/265047064) : Check if addition of non-deferred mode is needed.
915         HAS_OWR_UL_TDOA_SUPPORT(1 << 2),
916         HAS_OWR_DL_TDOA_SUPPORT(1 << 3),
917         HAS_OWR_AOA_SUPPORT(1 << 4),
918         HAS_ESS_TWR_SUPPORT(1 << 5),
919         HAS_ADS_TWR_SUPPORT(1 << 6);
920 
921         private final long mValue;
922 
RangingRoundCapabilityFlag(long value)923         private RangingRoundCapabilityFlag(long value) {
924             mValue = value;
925         }
926 
927         @Override
getValue()928         public long getValue() {
929             return mValue;
930         }
931     }
932 
933     public enum RframeCapabilityFlag implements FlagEnum {
934         HAS_SP0_RFRAME_SUPPORT(1),
935         HAS_SP1_RFRAME_SUPPORT(1 << 1),
936         HAS_SP3_RFRAME_SUPPORT(1 << 3);
937 
938         private final long mValue;
939 
RframeCapabilityFlag(long value)940         private RframeCapabilityFlag(long value) {
941             mValue = value;
942         }
943 
944         @Override
getValue()945         public long getValue() {
946             return mValue;
947         }
948     }
949 
950     public enum StsCapabilityFlag implements FlagEnum {
951         HAS_STATIC_STS_SUPPORT(1),
952         HAS_DYNAMIC_STS_SUPPORT(1 << 1),
953         HAS_DYNAMIC_STS_INDIVIDUAL_CONTROLEE_KEY_SUPPORT(1 << 2),
954         HAS_PROVISIONED_STS_SUPPORT(1 << 3),
955         HAS_PROVISIONED_STS_INDIVIDUAL_CONTROLEE_KEY_SUPPORT(1 << 4);
956 
957         private final long mValue;
958 
StsCapabilityFlag(long value)959         private StsCapabilityFlag(long value) {
960             mValue = value;
961         }
962 
963         @Override
getValue()964         public long getValue() {
965             return mValue;
966         }
967     }
968 
969     public enum PsduDataRateCapabilityFlag implements FlagEnum {
970         HAS_6M81_SUPPORT(1),
971         HAS_7M80_SUPPORT(1 << 1),
972         HAS_27M2_SUPPORT(1 << 2),
973         HAS_31M2_SUPPORT(1 << 3);
974 
975         private final long mValue;
976 
PsduDataRateCapabilityFlag(long value)977         private PsduDataRateCapabilityFlag(long value) {
978             mValue = value;
979         }
980 
981         @Override
getValue()982         public long getValue() {
983             return mValue;
984         }
985     }
986 
987     public enum BprfParameterSetCapabilityFlag implements FlagEnum {
988         HAS_SET_1_SUPPORT(1),
989         HAS_SET_2_SUPPORT(1 << 1),
990         HAS_SET_3_SUPPORT(1 << 2),
991         HAS_SET_4_SUPPORT(1 << 3),
992         HAS_SET_5_SUPPORT(1 << 4),
993         HAS_SET_6_SUPPORT(1 << 5);
994 
995         private final long mValue;
996 
BprfParameterSetCapabilityFlag(long value)997         private BprfParameterSetCapabilityFlag(long value) {
998             mValue = value;
999         }
1000 
1001         @Override
getValue()1002         public long getValue() {
1003             return mValue;
1004         }
1005     }
1006 
1007     public enum HprfParameterSetCapabilityFlag implements FlagEnum {
1008         HAS_SET_1_SUPPORT(1L),
1009         HAS_SET_2_SUPPORT(1L << 1),
1010         HAS_SET_3_SUPPORT(1L << 2),
1011         HAS_SET_4_SUPPORT(1L << 3),
1012         HAS_SET_5_SUPPORT(1L << 4),
1013         HAS_SET_6_SUPPORT(1L << 5),
1014         HAS_SET_7_SUPPORT(1L << 6),
1015         HAS_SET_8_SUPPORT(1L << 7),
1016         HAS_SET_9_SUPPORT(1L << 8),
1017         HAS_SET_10_SUPPORT(1L << 9),
1018         HAS_SET_11_SUPPORT(1L << 10),
1019         HAS_SET_12_SUPPORT(1L << 11),
1020         HAS_SET_13_SUPPORT(1L << 12),
1021         HAS_SET_14_SUPPORT(1L << 13),
1022         HAS_SET_15_SUPPORT(1L << 14),
1023         HAS_SET_16_SUPPORT(1L << 15),
1024         HAS_SET_17_SUPPORT(1L << 16),
1025         HAS_SET_18_SUPPORT(1L << 17),
1026         HAS_SET_19_SUPPORT(1L << 18),
1027         HAS_SET_20_SUPPORT(1L << 19),
1028         HAS_SET_21_SUPPORT(1L << 20),
1029         HAS_SET_22_SUPPORT(1L << 21),
1030         HAS_SET_23_SUPPORT(1L << 22),
1031         HAS_SET_24_SUPPORT(1L << 23),
1032         HAS_SET_25_SUPPORT(1L << 24),
1033         HAS_SET_26_SUPPORT(1L << 25),
1034         HAS_SET_27_SUPPORT(1L << 26),
1035         HAS_SET_28_SUPPORT(1L << 27),
1036         HAS_SET_29_SUPPORT(1L << 28),
1037         HAS_SET_30_SUPPORT(1L << 29),
1038         HAS_SET_31_SUPPORT(1L << 30),
1039         HAS_SET_32_SUPPORT(1L << 31),
1040         HAS_SET_33_SUPPORT(1L << 32),
1041         HAS_SET_34_SUPPORT(1L << 33),
1042         HAS_SET_35_SUPPORT(1L << 34);
1043 
1044         private final long mValue;
1045 
HprfParameterSetCapabilityFlag(long value)1046         private HprfParameterSetCapabilityFlag(long value) {
1047             mValue = value;
1048         }
1049 
1050         @Override
getValue()1051         public long getValue() {
1052             return mValue;
1053         }
1054     }
1055 
1056     public enum RangeDataNtfConfigCapabilityFlag implements FlagEnum {
1057         HAS_RANGE_DATA_NTF_CONFIG_DISABLE(1 << RANGE_DATA_NTF_CONFIG_DISABLE),
1058         HAS_RANGE_DATA_NTF_CONFIG_ENABLE(1 << RANGE_DATA_NTF_CONFIG_ENABLE),
1059         HAS_RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_LEVEL_TRIG(
1060                 1 << RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_LEVEL_TRIG),
1061         HAS_RANGE_DATA_NTF_CONFIG_ENABLE_AOA_LEVEL_TRIG(
1062                 1 << RANGE_DATA_NTF_CONFIG_ENABLE_AOA_LEVEL_TRIG),
1063         HAS_RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG(
1064                 1 << RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG),
1065         HAS_RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_EDGE_TRIG(
1066                 1 << RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_EDGE_TRIG),
1067         HAS_RANGE_DATA_NTF_CONFIG_ENABLE_AOA_EDGE_TRIG(
1068                 1 << RANGE_DATA_NTF_CONFIG_ENABLE_AOA_EDGE_TRIG),
1069         HAS_RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_EDGE_TRIG(
1070                 1 << RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_EDGE_TRIG);
1071 
1072 
1073 
1074         private final long mValue;
1075 
RangeDataNtfConfigCapabilityFlag(long value)1076         private RangeDataNtfConfigCapabilityFlag(long value) {
1077             mValue = value;
1078         }
1079 
1080         @Override
getValue()1081         public long getValue() {
1082             return mValue;
1083         }
1084     }
1085 
1086     /**
1087      * Suspend Ranging Support (FiRa 2.0)
1088      */
1089     @IntDef(
1090             value = {
1091                     SUSPEND_RANGING_DISABLED,
1092                     SUSPEND_RANGING_ENABLED,
1093             })
1094     public @interface SuspendRanging {}
1095 
1096     public static final int SUSPEND_RANGING_DISABLED = 0;
1097     public static final int SUSPEND_RANGING_ENABLED = 1;
1098 
1099     /**
1100      * Session Key length supported (FiRa 2.0)
1101      */
1102     @IntDef(
1103             value = {
1104                     KEY_LENGTH_256_BITS_NOT_SUPPORTED,
1105                     KEY_LENGTH_256_BITS_SUPPORTED,
1106             })
1107     public @interface SessionKeyLength {}
1108 
1109     public static final int KEY_LENGTH_256_BITS_NOT_SUPPORTED = 0;
1110     public static final int KEY_LENGTH_256_BITS_SUPPORTED = 1;
1111 
1112     /**
1113      * Session Type (for SESSION_INIT_CMD)
1114      */
1115     @IntDef(
1116             value = {
1117                     SESSION_TYPE_RANGING,
1118                     SESSION_TYPE_RANGING_AND_IN_BAND_DATA,
1119                     SESSION_TYPE_DATA_TRANSFER,
1120                     SESSION_TYPE_RANGING_ONLY_PHASE,
1121                     SESSION_TYPE_IN_BAND_DATA_PHASE,
1122                     SESSION_TYPE_RANGING_WITH_DATA_PHASE,
1123                     SESSION_TYPE_HUS_PRIMARY_SESSION,
1124                     SESSION_TYPE_DEVICE_TEST_MODE,
1125             })
1126     public @interface SessionType{}
1127 
1128     public static final int SESSION_TYPE_RANGING = 0;
1129     public static final int SESSION_TYPE_RANGING_AND_IN_BAND_DATA = 1;
1130     public static final int SESSION_TYPE_DATA_TRANSFER = 2;
1131     public static final int SESSION_TYPE_RANGING_ONLY_PHASE = 3;
1132     public static final int SESSION_TYPE_IN_BAND_DATA_PHASE = 4;
1133     public static final int SESSION_TYPE_RANGING_WITH_DATA_PHASE = 5;
1134     public static final int SESSION_TYPE_HUS_PRIMARY_SESSION = 0x9F;
1135     public static final int SESSION_TYPE_DEVICE_TEST_MODE = 0xD0;
1136 
1137     /** Which type of filter to use for filtering AoA/distance readings. */
1138     @IntDef(
1139             value = {
1140                     FILTER_TYPE_NONE,
1141                     FILTER_TYPE_DEFAULT,
1142                     FILTER_TYPE_APPLICATION,
1143             })
1144     public @interface FilterType {}
1145     public static final int FILTER_TYPE_NONE = 0;
1146     public static final int FILTER_TYPE_DEFAULT = 1;
1147     public static final int FILTER_TYPE_APPLICATION = 2;
1148 
1149     // Default value (Unlimited)
1150     public static final int MAX_NUMBER_OF_MEASUREMENTS_DEFAULT = 0;
1151 
1152     public static final int SESSION_TIME_BASE_PARAM_LEN = 9;
1153     public static final int SESSION_HANDLE_LEN = 4;
1154     public static final int SESSION_OFFSET_TIME_LEN = 4;
1155     public static final int SEQUENCE_NUMBER_LENGTH = 2;
1156     public static final int DATA_MSG_LENGTH = 2;
1157 
1158     // Default value (Host as the both secure & non-secure endpoint).
1159     public static final int APPLICATION_DATA_ENDPOINT_DEFAULT = 0;
1160 
1161     //Reference time base feature mask.
1162     public static final int SESSION_TIME_BASE_REFERENCE_FEATURE_ENABLED = 1;
1163     /**
1164      * Antenna Mode (Android-specific app config)
1165      */
1166     @IntDef(
1167             value = {
1168                     ANTENNA_MODE_OMNI,
1169                     ANTENNA_MODE_DIRECTIONAL,
1170             })
1171     public @interface AntennaMode {}
1172 
1173     /** (Default) The ranging antenna is used for both Tx and Rx. **/
1174     public static final int ANTENNA_MODE_OMNI = 0;
1175     /** The patch antenna is used for both Tx and Rx. **/
1176     public static final int ANTENNA_MODE_DIRECTIONAL = 1;
1177 
1178     private static final byte[] sShortForbiddenUwbAddress = {(byte) 0xFF, (byte) 0xFF};
1179     private static final byte[] sExtendedForbiddenUwbAddress = {
1180             (byte) 0xFF,
1181             (byte) 0xFF,
1182             (byte) 0xFF,
1183             (byte) 0xFF,
1184             (byte) 0xFF,
1185             (byte) 0xFF,
1186             (byte) 0xFF,
1187             (byte) 0xFF
1188     };
1189 
getShortForbiddenAddress()1190     public static byte[] getShortForbiddenAddress() {
1191         return sShortForbiddenUwbAddress;
1192     }
1193 
getExtendedForbiddenAddress()1194     public static byte[] getExtendedForbiddenAddress() {
1195         return sExtendedForbiddenUwbAddress;
1196     }
1197 
1198     /** Helper function to covert long value to UwbAddress. */
longToUwbAddress(long value, int length)1199     public static UwbAddress longToUwbAddress(long value, int length) {
1200         ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
1201         buffer.putLong(value);
1202         return UwbAddress.fromBytes(Arrays.copyOf(buffer.array(), length));
1203     }
1204 
1205     /** Helper functions to convert UwbAddress in long value. */
uwbAddressToLong(UwbAddress address)1206     public static long uwbAddressToLong(UwbAddress address) {
1207         ByteBuffer buffer = ByteBuffer.wrap(Arrays.copyOf(address.toBytes(), Long.BYTES));
1208         return buffer.getLong();
1209     }
1210 }
1211