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
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-11 20:14 +0000
1"""Peripheral Preferred Connection Parameters characteristic implementation."""
3from __future__ import annotations
5import msgspec
7from ..context import CharacteristicContext
8from .base import BaseCharacteristic
9from .utils import DataParser
12class ConnectionParametersData(msgspec.Struct, frozen=True, kw_only=True):
13 """Connection parameters data."""
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
21class PeripheralPreferredConnectionParametersCharacteristic(BaseCharacteristic[ConnectionParametersData]):
22 """Peripheral Preferred Connection Parameters characteristic (0x2A04).
24 org.bluetooth.characteristic.gap.peripheral_preferred_connection_parameters
26 Contains the preferred connection parameters (8 bytes).
27 """
29 _manual_value_type = "ConnectionParametersData"
30 expected_length = 8
32 def _decode_value(self, data: bytearray, ctx: CharacteristicContext | None = None) -> ConnectionParametersData:
33 """Parse connection parameters.
35 Args:
36 data: Raw bytearray (8 bytes).
37 ctx: Optional CharacteristicContext.
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)
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 )
54 def _encode_value(self, data: ConnectionParametersData) -> bytearray:
55 """Encode connection parameters.
57 Args:
58 data: ConnectionParametersData to encode
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