Coverage for src / bluetooth_sig / gatt / characteristics / linear_position.py: 100%
12 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"""Linear Position characteristic implementation."""
3from __future__ import annotations
5from ..context import CharacteristicContext
6from .base import BaseCharacteristic
7from .utils.data_parser import DataParser
10class LinearPositionCharacteristic(BaseCharacteristic[float]):
11 """Linear Position characteristic (0x2C08).
13 org.bluetooth.characteristic.linear_position
15 The Linear Position characteristic is used to represent the linear position of an object
16 along a given axis and referencing to the device-specific zero point.
17 """
19 expected_length: int = 4 # sint32
21 def _decode_value(self, data: bytearray, ctx: CharacteristicContext | None = None) -> float | None:
22 """Decode linear position characteristic.
24 Decodes a 32-bit signed integer representing position in 10^-7 m increments
25 per Bluetooth SIG Linear Position characteristic specification.
27 Args:
28 data: Raw bytes from BLE characteristic (exactly 4 bytes, little-endian)
29 ctx: Optional context for parsing (device info, flags, etc.)
31 Returns:
32 Position in meters, or None if value is not known
34 Raises:
35 InsufficientDataError: If data is not exactly 4 bytes
36 """
37 raw_value = DataParser.parse_int32(data, 0, signed=True)
38 return raw_value * 1e-7
40 def _encode_value(self, data: float) -> bytearray:
41 """Encode linear position value."""
42 raw_value = int(data / 1e-7)
43 return DataParser.encode_int32(raw_value, signed=True)