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
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-18 11:17 +0000
1"""Peripheral Preferred Connection Parameters characteristic implementation."""
3from __future__ import annotations
5import msgspec
7from ...types.gatt_enums import CharacteristicRole
8from ..context import CharacteristicContext
9from .base import BaseCharacteristic
10from .utils import DataParser
13class ConnectionParametersData(msgspec.Struct, frozen=True, kw_only=True):
14 """Connection parameters data."""
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
22class PeripheralPreferredConnectionParametersCharacteristic(BaseCharacteristic[ConnectionParametersData]):
23 """Peripheral Preferred Connection Parameters characteristic (0x2A04).
25 org.bluetooth.characteristic.gap.peripheral_preferred_connection_parameters
27 Contains the preferred connection parameters (8 bytes).
28 """
30 _manual_role = CharacteristicRole.INFO
31 expected_length = 8
33 def _decode_value(
34 self, data: bytearray, ctx: CharacteristicContext | None = None, *, validate: bool = True
35 ) -> ConnectionParametersData:
36 """Parse connection parameters.
38 Args:
39 data: Raw bytearray (8 bytes).
40 ctx: Optional CharacteristicContext.
41 validate: Whether to validate ranges (default True)
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)
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 )
58 def _encode_value(self, data: ConnectionParametersData) -> bytearray:
59 """Encode connection parameters.
61 Args:
62 data: ConnectionParametersData to encode
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