1from abc import ABC, abstractmethod 2import dataclasses 3from enum import IntEnum 4from typing import Tuple, 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 20class SecurityLevel(IntEnum): 21 BASIC = 0 22 SECURE = 1 23 24class RangingMode(IntEnum): 25 AUTO = 0 26 HIGH_ACCURACY = 1 27 HIGH_ACCURACY_PREFERRED = 2 28 FUSED = 3 29 30@dataclasses.dataclass(kw_only=True, frozen=True) 31class DeviceParams: 32 peer_id: str 33 uwb_params: Optional[UwbRangingParams] = None 34 cs_params: Optional[CsRangingParams] = None 35 rtt_params: Optional[RttRangingParams] = None 36 rssi_params: Optional[BleRssiRangingParams] = None 37 38 39@dataclasses.dataclass(kw_only=True, frozen=True) 40class RangingParams(ABC): 41 session_type: RangingSessionType 42 43@dataclasses.dataclass(kw_only=True, frozen=True) 44class OobInitiatorRangingParams(RangingParams): 45 session_type: RangingSessionType = RangingSessionType.OOB 46 ranging_interval_ms: Tuple[int, int] = (100, 5000) 47 security_level: SecurityLevel = SecurityLevel.BASIC 48 ranging_mode: RangingMode = RangingMode.AUTO 49 peer_ids: List[str] 50 51@dataclasses.dataclass(kw_only=True, frozen=True) 52class OobResponderRangingParams(RangingParams): 53 session_type: RangingSessionType = RangingSessionType.OOB 54 peer_id: str 55 56@dataclasses.dataclass(kw_only=True, frozen=True) 57class RawInitiatorRangingParams(RangingParams): 58 session_type: RangingSessionType = RangingSessionType.RAW 59 peer_params: List[DeviceParams] 60 61 62@dataclasses.dataclass(kw_only=True, frozen=True) 63class RawResponderRangingParams(RangingParams): 64 session_type: RangingSessionType = RangingSessionType.RAW 65 peer_params: DeviceParams 66 67 68@dataclasses.dataclass(kw_only=True, frozen=True) 69class SensorFusionParams: 70 is_sensor_fusion_enabled: bool = True 71 72 73@dataclasses.dataclass(kw_only=True, frozen=True) 74class RangingPreference: 75 device_role: DeviceRole 76 ranging_params: RangingParams 77 sensor_fusion_params: SensorFusionParams = dataclasses.field( 78 default_factory=SensorFusionParams 79 ) 80 enable_range_data_notifications: bool = True 81 measurement_limit: int = 0 82