• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"""Class for UWB ranging parameters."""
2
3import dataclasses
4from typing import Any, Dict, List, Optional
5
6
7class FiraParamEnums:
8  """Class for Fira parameter constants."""
9
10  # channels
11  UWB_CHANNEL_5 = 5
12  UWB_CHANNEL_9 = 9
13
14  # preamble codes
15  UWB_PREAMBLE_CODE_INDEX_9 = 9
16  UWB_PREAMBLE_CODE_INDEX_10 = 10
17  UWB_PREAMBLE_CODE_INDEX_11 = 11
18  UWB_PREAMBLE_CODE_INDEX_12 = 12
19
20  # ranging device types
21  DEVICE_TYPE_CONTROLEE = 0
22  DEVICE_TYPE_CONTROLLER = 1
23
24  # ranging device roles
25  DEVICE_ROLE_RESPONDER = 0
26  DEVICE_ROLE_INITIATOR = 1
27
28  # multi node modes
29  MULTI_NODE_MODE_UNICAST = 0
30  MULTI_NODE_MODE_ONE_TO_MANY = 1
31
32  # hopping modes
33  HOPPING_MODE_DISABLE = 0
34  HOPPING_MODE_FIRA_HOPPING_ENABLE = 1
35
36  # ranging round usage
37  RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE = 1
38  RANGING_ROUND_USAGE_DS_TWR_DEFERRED_MODE = 2
39  RANGING_ROUND_USAGE_SS_TWR_NON_DEFERRED_MODE = 3
40  RANGING_ROUND_USAGE_DS_TWR_NON_DEFERRED_MODE = 4
41
42  # mac address mode
43  MAC_ADDRESS_MODE_2_BYTES = 0
44  MAC_ADDRESS_MODE_8_BYTES = 2
45
46  # initiation time in ms
47  INITIATION_TIME_MS = 0
48
49  # slot duration rstu
50  SLOT_DURATION_RSTU = 2400
51
52  # ranging interval ms
53  RANGING_INTERVAL_MS = 200
54
55  # slots per ranging round
56  SLOTS_PER_RR = 30
57
58  # in band termination attempt count
59  IN_BAND_TERMINATION_ATTEMPT_COUNT = 1
60
61  # aoa report request
62  AOA_RESULT_REQUEST_MODE_NO_AOA_REPORT = 0
63  AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS = 1
64
65  # ranging round retries
66  MAX_RANGING_ROUND_RETRIES = 0
67
68  # block stride
69  BLOCK_STRIDE_LENGTH = 0
70
71  # list update actions
72  MULTICAST_LIST_UPDATE_ACTION_ADD = 0
73  MULTICAST_LIST_UPDATE_ACTION_DELETE = 1
74  P_STS_MULTICAST_LIST_UPDATE_ACTION_ADD_16_BYTE = 2
75  P_STS_MULTICAST_LIST_UPDATE_ACTION_ADD_32_BYTE = 3
76
77  # sts config
78  STS_CONFIG_STATIC = 0
79  STS_CONFIG_PROVISIONED = 3
80  STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY = 4
81
82  # rfrmae config
83  RFRAME_CONFIG_SP0 = 0
84  RFRAME_CONFIG_SP1 = 1
85  RFRAME_CONFIG_SP3 = 3
86
87  # ranging ntf config
88  RANGE_DATA_NTF_CONFIG_DISABLE = 0
89  RANGE_DATA_NTF_CONFIG_ENABLE = 1
90
91@dataclasses.dataclass
92class UwbRangingReconfigureParams():
93  """Class for UWB ranging reconfigure parameters.
94
95  Attributes:
96    action: Type of reconfigure action.
97    address_list: new address list.
98    block_stride_length: block stride length
99    sub_session_id_list: provisioned sts sub session id list.
100    sub_session_key_list: provisioned sts sub session key list.
101  """
102  action: Optional[int] = None
103  address_list: Optional[List[List[int]]] = None
104  block_stride_length: Optional[int] = None
105  sub_session_id_list: Optional[List[int]] = None
106  sub_session_key_list: Optional[List[int]] = None
107
108  def to_dict(self) -> Dict[str, Any]:
109    """Returns UWB ranging reconfigure parameters in dictionary for sl4a.
110
111    Returns:
112      UWB ranging reconfigure parameters in dictionary.
113    """
114    reconfigure_params = {}
115    if self.address_list is not None:
116      reconfigure_params["action"] = self.action
117      reconfigure_params["addressList"] = self.address_list
118      if self.sub_session_id_list is not None:
119        reconfigure_params["subSessionIdList"] = self.sub_session_id_list
120      if self.sub_session_key_list is not None:
121        reconfigure_params["subSessionKeyList"] = self.sub_session_key_list
122    elif self.block_stride_length is not None:
123      reconfigure_params["blockStrideLength"] = self.block_stride_length
124    return reconfigure_params
125
126
127@dataclasses.dataclass
128class UwbRangingControleeParams():
129  """Class for UWB ranging controlee parameters.
130
131  Attributes:
132    action: Type of reconfigure action.
133    address_list: new address list.
134    sub_session_id_list: provisioned sts sub session id list.
135    sub_session_key_list: provisioned sts sub session key list.
136  """
137  action: Optional[int] = None
138  address_list: Optional[List[List[int]]] = None
139  sub_session_id_list: Optional[List[int]] = None
140  sub_session_key_list: Optional[List[int]] = None
141
142  def to_dict(self) -> Dict[str, Any]:
143    """Returns UWB ranging controlee parameters in dictionary for sl4a.
144
145    Returns:
146      UWB ranging controlee parameters in dictionary.
147    """
148    controlee_params = {}
149    if self.action is not None:
150      controlee_params["action"] = self.action
151    if self.address_list is not None:
152      controlee_params["addressList"] = self.address_list
153    if self.sub_session_id_list is not None:
154      controlee_params["subSessionIdList"] = self.sub_session_id_list
155    if self.sub_session_key_list is not None:
156      controlee_params["subSessionKeyList"] = self.sub_session_key_list
157    return controlee_params
158
159
160@dataclasses.dataclass
161class UwbRangingParams():
162  """Class for Uwb ranging parameters.
163
164  Attributes:
165    device_type: Type of ranging device - Controller or Controlee.
166    device_role: Role of ranging device - Initiator or Responder.
167    device_address: Address of the UWB device.
168    destination_addresses: List of UWB peer addresses.
169    channel: Channel for ranging. Possible values 5 or 9.
170    preamble: Preamble for ranging.
171    ranging_round_usage : Ranging Round Usage values.
172    hopping_mode : Hopping modes.
173    mac_address_mode : MAC address modes.
174    initiation_time_ms : Initiation Time in ms.
175    slot_duration_rstu : Slot duration RSTU.
176    ranging_interval_ms : Ranging interval in ms.
177    slots_per_ranging_round : Slots per Ranging Round.
178    in_band_termination_attempt_count : In Band Termination Attempt count.
179    aoa_result_request : AOA report request.
180    max_ranging_round_retries : Max Ranging round retries.
181    block_stride_length: Block Stride Length
182    session_id: Ranging session ID.
183    multi_node_mode: Ranging mode. Possible values 1 to 1 or 1 to many.
184    vendor_id: Ranging device vendor ID.
185    static_sts_iv: Static STS value.
186    sts_config: STS config.
187    session_key: Provisioned sts session key.
188    sub_session_id: Ranging sub session ID.
189    sub_session_key: Ranging sub session key.
190    range_data_ntf_config: Range data ntf config.
191
192  Example:
193      An example of UWB ranging parameters passed to sl4a is below.
194
195      self.initiator_params = {
196        "sessionId": 10,
197        "deviceType": FiraParamEnums.RANGING_DEVICE_TYPE_CONTROLLER,
198        "deviceRole": FiraParamEnums.RANGING_DEVICE_ROLE_INITIATOR,
199        "multiNodeMode": FiraParamEnums.MULTI_NODE_MODE_ONE_TO_MANY,
200        "channel": FiraParamEnums.UWB_CHANNEL_9,
201        "deviceAddress": [1, 2],
202        "destinationAddresses": [[3, 4],],
203        "vendorId": [5, 6],
204        "staticStsIV": [5, 6, 7, 8, 9, 10],
205      }
206
207      The UwbRangingParams are passed to UwbManagerFacade#openRaningSession()
208      from the open_ranging() method as a JSONObject.
209      These are converted to FiraOpenSessionParams using
210      UwbManagerFacade#generateFiraOpenSessionParams().
211      If some of the values are skipped in the params, default values are used.
212      Please see com/google/uwb/support/fira/FiraParams.java for more details
213      on the default values.
214
215      If the passed params are invalid, then open_ranging() will fail.
216  """
217
218  device_type: int
219  device_role: int
220  device_address: List[int]
221  destination_addresses: List[List[int]]
222  session_id: int = 10
223  channel: int = FiraParamEnums.UWB_CHANNEL_9
224  preamble: int = FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_10
225  multi_node_mode: int = FiraParamEnums.MULTI_NODE_MODE_ONE_TO_MANY
226  ranging_round_usage: int = (
227      FiraParamEnums.RANGING_ROUND_USAGE_DS_TWR_DEFERRED_MODE
228  )
229  mac_address_mode: int = FiraParamEnums.MAC_ADDRESS_MODE_2_BYTES
230  initiation_time_ms: int = FiraParamEnums.INITIATION_TIME_MS
231  slot_duration_rstu: int = FiraParamEnums.SLOT_DURATION_RSTU
232  ranging_interval_ms: int = FiraParamEnums.RANGING_INTERVAL_MS
233  slots_per_ranging_round: int = FiraParamEnums.SLOTS_PER_RR
234  in_band_termination_attempt_count: int = (
235      FiraParamEnums.IN_BAND_TERMINATION_ATTEMPT_COUNT
236  )
237  aoa_result_request: int = (
238      FiraParamEnums.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS
239  )
240  hopping_mode: int = FiraParamEnums.HOPPING_MODE_FIRA_HOPPING_ENABLE
241  max_ranging_round_retries: int = FiraParamEnums.MAX_RANGING_ROUND_RETRIES
242  block_stride_length: int = FiraParamEnums.BLOCK_STRIDE_LENGTH
243  vendor_id: List[int] = dataclasses.field(default_factory=lambda: [5, 6])
244  static_sts_iv: List[int] = dataclasses.field(
245      default_factory=lambda: [5, 6, 7, 8, 9, 10])
246  sts_config: int = FiraParamEnums.STS_CONFIG_STATIC
247  session_key: List[int] = dataclasses.field(
248      default_factory=lambda: [1, 2, 3, 4, 5, 6, 7, 8, 8, 7, 6, 5, 4, 3, 2, 1]
249  )
250  sub_session_id: Optional[int] = None
251  sub_session_key: Optional[List[int]] = None
252  rframe_config: int = FiraParamEnums.RFRAME_CONFIG_SP3
253  range_data_ntf_config: int = FiraParamEnums.RANGE_DATA_NTF_CONFIG_ENABLE
254
255  def to_dict(self) -> Dict[str, Any]:
256    """Returns UWB ranging parameters in dictionary for sl4a.
257
258    Returns:
259      UWB ranging parameters in dictionary.
260    """
261    dict = {
262        "deviceType": self.device_type,
263        "deviceRole": self.device_role,
264        "deviceAddress": self.device_address,
265        "destinationAddresses": self.destination_addresses,
266        "channel": self.channel,
267        "preamble": self.preamble,
268        "rangingRoundUsage": self.ranging_round_usage,
269        "macAddressMode": self.mac_address_mode,
270        "initiationTimeMs": self.initiation_time_ms,
271        "slotDurationRstu": self.slot_duration_rstu,
272        "slotsPerRangingRound": self.slots_per_ranging_round,
273        "rangingIntervalMs": self.ranging_interval_ms,
274        "hoppingMode": self.hopping_mode,
275        "rframeConfig": self.rframe_config,
276        "maxRangingRoundRetries": self.max_ranging_round_retries,
277        "inBandTerminationAttemptCount": self.in_band_termination_attempt_count,
278        "aoaResultRequest": self.aoa_result_request,
279        "blockStrideLength": self.block_stride_length,
280        "sessionId": self.session_id,
281        "multiNodeMode": self.multi_node_mode,
282        "vendorId": self.vendor_id,
283        "staticStsIV": self.static_sts_iv,
284        "stsConfig": self.sts_config,
285        "sessionKey": self.session_key,
286        "rangeDataNtfConfig": self.range_data_ntf_config,
287    }
288    if self.sub_session_id is not None:
289      dict["subSessionId"] = self.sub_session_id
290    if self.sub_session_key is not None:
291      dict["subSessionKey"] = self.sub_session_key
292    return dict
293
294  def update(self, **kwargs: Any):
295    """Updates the UWB parameters with the new values.
296
297    Args:
298      **kwargs: uwb attributes with new values.
299    """
300    for key, value in kwargs.items():
301      if hasattr(self, key):
302        setattr(self, key, value)
303