1from abc import ABC, abstractmethod
2import dataclasses
3from enum import IntEnum
4from typing import List, Optional
5from lib.cs import CsRangingParams
6from lib.rtt import RttRangingParams
7from lib.uwb import UwbRangingParams
8from lib.rssi import BleRssiRangingParams
9
10
11class DeviceRole(IntEnum):
12  RESPONDER = 0
13  INITIATOR = 1
14
15
16class RangingSessionType(IntEnum):
17  RAW = 0
18  OOB = 1
19
20
21@dataclasses.dataclass(kw_only=True, frozen=True)
22class DeviceParams:
23  peer_id: str
24  uwb_params: Optional[UwbRangingParams] = None
25  cs_params: Optional[CsRangingParams] = None
26  rtt_params: Optional[RttRangingParams] = None
27  rssi_params: Optional[BleRssiRangingParams] = None
28
29
30@dataclasses.dataclass(kw_only=True, frozen=True)
31class RangingParams(ABC):
32  session_type: RangingSessionType
33
34
35@dataclasses.dataclass(kw_only=True, frozen=True)
36class RawInitiatorRangingParams(RangingParams):
37  session_type: RangingSessionType = RangingSessionType.RAW
38  peer_params: List[DeviceParams]
39
40
41@dataclasses.dataclass(kw_only=True, frozen=True)
42class RawResponderRangingParams(RangingParams):
43  session_type: RangingSessionType = RangingSessionType.RAW
44  peer_params: DeviceParams
45
46
47@dataclasses.dataclass(kw_only=True, frozen=True)
48class SensorFusionParams:
49  is_sensor_fusion_enabled: bool = True
50
51
52@dataclasses.dataclass(kw_only=True, frozen=True)
53class RangingPreference:
54  device_role: DeviceRole
55  ranging_params: RangingParams
56  sensor_fusion_params: SensorFusionParams = dataclasses.field(
57      default_factory=SensorFusionParams
58  )
59  enable_range_data_notifications: bool = True
60