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