Coverage for src / bluetooth_sig / gatt / characteristics / peripheral_preferred_connection_parameters.py: 100%

27 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-18 11:17 +0000

1"""Peripheral Preferred Connection Parameters characteristic implementation.""" 

2 

3from __future__ import annotations 

4 

5import msgspec 

6 

7from ...types.gatt_enums import CharacteristicRole 

8from ..context import CharacteristicContext 

9from .base import BaseCharacteristic 

10from .utils import DataParser 

11 

12 

13class ConnectionParametersData(msgspec.Struct, frozen=True, kw_only=True): 

14 """Connection parameters data.""" 

15 

16 min_interval: float # Minimum connection interval in ms 

17 max_interval: float # Maximum connection interval in ms 

18 latency: int # Slave latency (number of events) 

19 timeout: int # Connection supervision timeout in ms 

20 

21 

22class PeripheralPreferredConnectionParametersCharacteristic(BaseCharacteristic[ConnectionParametersData]): 

23 """Peripheral Preferred Connection Parameters characteristic (0x2A04). 

24 

25 org.bluetooth.characteristic.gap.peripheral_preferred_connection_parameters 

26 

27 Contains the preferred connection parameters (8 bytes). 

28 """ 

29 

30 _manual_role = CharacteristicRole.INFO 

31 expected_length = 8 

32 

33 def _decode_value( 

34 self, data: bytearray, ctx: CharacteristicContext | None = None, *, validate: bool = True 

35 ) -> ConnectionParametersData: 

36 """Parse connection parameters. 

37 

38 Args: 

39 data: Raw bytearray (8 bytes). 

40 ctx: Optional CharacteristicContext. 

41 validate: Whether to validate ranges (default True) 

42 

43 Returns: 

44 ConnectionParametersData with min_interval, max_interval, latency, timeout. 

45 """ 

46 min_interval_raw = DataParser.parse_int16(data, 0, signed=False) 

47 max_interval_raw = DataParser.parse_int16(data, 2, signed=False) 

48 latency = DataParser.parse_int16(data, 4, signed=False) 

49 timeout_raw = DataParser.parse_int16(data, 6, signed=False) 

50 

51 return ConnectionParametersData( 

52 min_interval=min_interval_raw * 1.25, 

53 max_interval=max_interval_raw * 1.25, 

54 latency=latency, 

55 timeout=timeout_raw * 10, 

56 ) 

57 

58 def _encode_value(self, data: ConnectionParametersData) -> bytearray: 

59 """Encode connection parameters. 

60 

61 Args: 

62 data: ConnectionParametersData to encode 

63 

64 Returns: 

65 Encoded bytes 

66 """ 

67 result = bytearray() 

68 result.extend(DataParser.encode_int16(int(data.min_interval / 1.25), signed=False)) 

69 result.extend(DataParser.encode_int16(int(data.max_interval / 1.25), signed=False)) 

70 result.extend(DataParser.encode_int16(data.latency, signed=False)) 

71 result.extend(DataParser.encode_int16(int(data.timeout / 10), signed=False)) 

72 return result