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

12 statements  

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

1"""Acceleration characteristic implementation.""" 

2 

3from __future__ import annotations 

4 

5from ..context import CharacteristicContext 

6from .base import BaseCharacteristic 

7from .utils.data_parser import DataParser 

8 

9 

10class AccelerationCharacteristic(BaseCharacteristic[float]): 

11 """Acceleration characteristic (0x2C06). 

12 

13 org.bluetooth.characteristic.acceleration 

14 

15 The Acceleration characteristic is used to represent the acceleration of an object 

16 along a given axis as determined by the service. 

17 """ 

18 

19 _manual_unit: str | None = "m/s²" # Manual override due to YAML typo (metres_per_seconds_squared) 

20 

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

22 """Decode acceleration characteristic. 

23 

24 Decodes a 32-bit signed integer representing acceleration in 0.001 m/s² increments 

25 per Bluetooth SIG Acceleration characteristic specification. 

26 

27 Args: 

28 data: Raw bytes from BLE characteristic (exactly 4 bytes, little-endian) 

29 ctx: Optional context for parsing (device info, flags, etc.) 

30 

31 Returns: 

32 Acceleration in meters per second squared 

33 

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 * 0.001 

39 

40 def _encode_value(self, data: float) -> bytearray: 

41 """Encode acceleration value.""" 

42 raw_value = int(data / 0.001) 

43 return DataParser.encode_int32(raw_value, signed=True)