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