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

26 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-01-11 20:14 +0000

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

2 

3from __future__ import annotations 

4 

5import msgspec 

6 

7from ..context import CharacteristicContext 

8from .base import BaseCharacteristic 

9from .utils import DataParser 

10 

11 

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

13 """Connection parameters data.""" 

14 

15 min_interval: float # Minimum connection interval in ms 

16 max_interval: float # Maximum connection interval in ms 

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

18 timeout: int # Connection supervision timeout in ms 

19 

20 

21class PeripheralPreferredConnectionParametersCharacteristic(BaseCharacteristic[ConnectionParametersData]): 

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

23 

24 org.bluetooth.characteristic.gap.peripheral_preferred_connection_parameters 

25 

26 Contains the preferred connection parameters (8 bytes). 

27 """ 

28 

29 _manual_value_type = "ConnectionParametersData" 

30 expected_length = 8 

31 

32 def _decode_value(self, data: bytearray, ctx: CharacteristicContext | None = None) -> ConnectionParametersData: 

33 """Parse connection parameters. 

34 

35 Args: 

36 data: Raw bytearray (8 bytes). 

37 ctx: Optional CharacteristicContext. 

38 

39 Returns: 

40 ConnectionParametersData with min_interval, max_interval, latency, timeout. 

41 """ 

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

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

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

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

46 

47 return ConnectionParametersData( 

48 min_interval=min_interval_raw * 1.25, 

49 max_interval=max_interval_raw * 1.25, 

50 latency=latency, 

51 timeout=timeout_raw * 10, 

52 ) 

53 

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

55 """Encode connection parameters. 

56 

57 Args: 

58 data: ConnectionParametersData to encode 

59 

60 Returns: 

61 Encoded bytes 

62 """ 

63 result = bytearray() 

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

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

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

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

68 return result