• 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 = 2
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
83@dataclasses.dataclass
84class UwbRangingReconfigureParams():
85    """Class for UWB ranging reconfigure parameters.
86
87    Attributes:
88      action: Type of reconfigure action.
89      address_list: new address list.
90      block_stride_length: block stride length
91      sub_session_id_list: provisioned sts sub session id list.
92      sub_session_key_list: provisioned sts sub session key list.
93    """
94    action: Optional[int] = None
95    address_list: Optional[List[List[int]]] = None
96    block_stride_length: Optional[int] = None
97    sub_session_id_list: Optional[List[int]] = None
98    sub_session_key_list: Optional[List[int]] = None
99
100    def to_dict(self) -> Dict[str, Any]:
101        """Returns UWB ranging reconfigure parameters in dictionary for sl4a.
102
103        Returns:
104          UWB ranging reconfigure parameters in dictionary.
105        """
106        reconfigure_params = {}
107        if self.address_list is not None:
108            reconfigure_params["action"] = self.action
109            reconfigure_params["addressList"] = self.address_list
110            if self.sub_session_id_list is not None:
111                reconfigure_params["subSessionIdList"] = self.sub_session_id_list
112            if self.sub_session_key_list is not None:
113                reconfigure_params["subSessionKeyList"] = self.sub_session_key_list
114        elif self.block_stride_length is not None:
115            reconfigure_params["blockStrideLength"] = self.block_stride_length
116        return reconfigure_params
117
118
119@dataclasses.dataclass
120class UwbRangingControleeParams():
121    """Class for UWB ranging controlee parameters.
122
123    Attributes:
124      action: Type of reconfigure action.
125      address_list: new address list.
126      sub_session_id_list: provisioned sts sub session id list.
127      sub_session_key_list: provisioned sts sub session key list.
128    """
129    action: Optional[int] = None
130    address_list: Optional[List[List[int]]] = None
131    sub_session_id_list: Optional[List[int]] = None
132    sub_session_key_list: Optional[List[int]] = None
133
134    def to_dict(self) -> Dict[str, Any]:
135        """Returns UWB ranging controlee parameters in dictionary for sl4a.
136
137        Returns:
138          UWB ranging controlee parameters in dictionary.
139        """
140        controlee_params = {}
141        if self.action is not None:
142            controlee_params["action"] = self.action
143        if self.address_list is not None:
144            controlee_params["addressList"] = self.address_list
145        if self.sub_session_id_list is not None:
146            controlee_params["subSessionIdList"] = self.sub_session_id_list
147        if self.sub_session_key_list is not None:
148            controlee_params["subSessionKeyList"] = self.sub_session_key_list
149        return controlee_params
150
151
152@dataclasses.dataclass
153class UwbRangingParams():
154    """Class for Uwb ranging parameters.
155
156    Attributes:
157      device_type: Type of ranging device - Controller or Controlee.
158      device_role: Role of ranging device - Initiator or Responder.
159      device_address: Address of the UWB device.
160      destination_addresses: List of UWB peer addresses.
161      channel: Channel for ranging. Possible values 5 or 9.
162      preamble: Preamble for ranging.
163      ranging_round_usage : Ranging Round Usage values.
164      hopping_mode : Hopping modes.
165      mac_address_mode : MAC address modes.
166      initiation_time_ms : Initiation Time in ms.
167      slot_duration_rstu : Slot duration RSTU.
168      ranging_interval_ms : Ranging interval in ms.
169      slots_per_ranging_round : Slots per Ranging Round.
170      in_band_termination_attempt_count : In Band Termination Attempt count.
171      aoa_result_request : AOA report request.
172      max_ranging_round_retries : Max Ranging round retries.
173      block_stride_length: Block Stride Length
174      session_id: Ranging session ID.
175      multi_node_mode: Ranging mode. Possible values 1 to 1 or 1 to many.
176      vendor_id: Ranging device vendor ID.
177      static_sts_iv: Static STS value.
178      sts_config: STS config.
179      session_key: Provisioned sts session key.
180      sub_session_id: Ranging sub session ID.
181      sub_session_key: Ranging sub session key.
182
183    Example:
184        An example of UWB ranging parameters passed to sl4a is below.
185
186        self.initiator_params = {
187          "sessionId": 10,
188          "deviceType": FiraParamEnums.RANGING_DEVICE_TYPE_CONTROLLER,
189          "deviceRole": FiraParamEnums.RANGING_DEVICE_ROLE_INITIATOR,
190          "multiNodeMode": FiraParamEnums.MULTI_NODE_MODE_ONE_TO_MANY,
191          "channel": FiraParamEnums.UWB_CHANNEL_9,
192          "deviceAddress": [1, 2],
193          "destinationAddresses": [[3, 4],],
194          "vendorId": [5, 6],
195          "staticStsIV": [5, 6, 7, 8, 9, 10],
196        }
197
198        The UwbRangingParams are passed to UwbManagerFacade#openRaningSession()
199        from the open_ranging() method as a JSONObject.
200        These are converted to FiraOpenSessionParams using
201        UwbManagerFacade#generateFiraOpenSessionParams().
202        If some of the values are skipped in the params, default values are used.
203        Please see com/google/uwb/support/fira/FiraParams.java for more details
204        on the default values.
205
206        If the passed params are invalid, then open_ranging() will fail.
207    """
208
209    config_id: int
210    device_type: int
211    device_role: int
212    device_address: List[int]
213    destination_addresses: List[List[int]]
214    session_id: int = 10
215    channel: int = FiraParamEnums.UWB_CHANNEL_9
216    preamble: int = FiraParamEnums.UWB_PREAMBLE_CODE_INDEX_11
217    multi_node_mode: int = FiraParamEnums.MULTI_NODE_MODE_ONE_TO_MANY
218    ranging_round_usage: int = (
219        FiraParamEnums.RANGING_ROUND_USAGE_DS_TWR_DEFERRED_MODE
220    )
221    mac_address_mode: int = FiraParamEnums.MAC_ADDRESS_MODE_2_BYTES
222    initiation_time_ms: int = FiraParamEnums.INITIATION_TIME_MS
223    slot_duration: int = FiraParamEnums.SLOT_DURATION
224    ranging_update_rate: int = 1
225    slots_per_ranging_round: int = FiraParamEnums.SLOTS_PER_RR
226    in_band_termination_attempt_count: int = (
227        FiraParamEnums.IN_BAND_TERMINATION_ATTEMPT_COUNT
228    )
229    aoa_result_request: int = (
230        FiraParamEnums.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS
231    )
232    hopping_mode: int = FiraParamEnums.HOPPING_MODE_FIRA_HOPPING_ENABLE
233    max_ranging_round_retries: int = FiraParamEnums.MAX_RANGING_ROUND_RETRIES
234    block_stride_length: int = FiraParamEnums.BLOCK_STRIDE_LENGTH
235    vendor_id: List[int] = dataclasses.field(default_factory=lambda: [5, 6])
236    static_sts_iv: List[int] = dataclasses.field(
237        default_factory=lambda: [5, 6, 7, 8, 9, 10])
238    sts_config: int = FiraParamEnums.STS_CONFIG_STATIC
239    session_key: List[int] = dataclasses.field(
240        default_factory=lambda: [1, 2, 3, 4, 5, 6, 7, 8, 8, 7, 6, 5, 4, 3, 2, 1]
241    )
242    sub_session_id: Optional[int] = None
243    sub_session_key: Optional[List[int]] = None
244    is_aoa_disabled: bool = False
245
246    def to_dict(self) -> Dict[str, Any]:
247        """Returns UWB ranging parameters in dictionary for sl4a.
248
249        Returns:
250          UWB ranging parameters in dictionary.
251        """
252        dict = {
253            "configId": self.config_id,
254            "deviceType": self.device_type,
255            "deviceRole": self.device_role,
256            "deviceAddress": self.device_address,
257            "destinationAddresses": self.destination_addresses,
258            "channel": self.channel,
259            "preamble": self.preamble,
260            "slotDuration": self.slot_duration,
261            "rangingUpdateRate": self.ranging_update_rate,
262            "sessionId": self.session_id,
263            "subSessionId": self.sub_session_id,
264            "multiNodeMode": self.multi_node_mode,
265            "vendorId": self.vendor_id,
266            "staticStsIV": self.static_sts_iv,
267            "stsConfig": self.sts_config,
268            "sessionKey": self.session_key,
269            "isAoaDisabled": self.is_aoa_disabled,
270        }
271        if self.sub_session_id is not None:
272            dict["subSessionId"] = self.sub_session_id
273        if self.sub_session_key is not None:
274            dict["subSessionKey"] = self.sub_session_key
275        return dict
276
277    def update(self, **kwargs: Any):
278        """Updates the UWB parameters with the new values.
279
280        Args:
281          **kwargs: uwb attributes with new values.
282        """
283        for key, value in kwargs.items():
284            if hasattr(self, key):
285                setattr(self, key, value)
286