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

18 statements  

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

1"""Three Zone Heart Rate Limits characteristic (0x2A94).""" 

2 

3from __future__ import annotations 

4 

5import msgspec 

6 

7from ..context import CharacteristicContext 

8from .base import BaseCharacteristic 

9from .utils.data_parser import DataParser 

10 

11 

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

13 """Three Zone Heart Rate Limits data structure.""" 

14 

15 light_moderate_limit: int 

16 moderate_hard_limit: int 

17 

18 

19class ThreeZoneHeartRateLimitsCharacteristic(BaseCharacteristic[ThreeZoneHeartRateLimitsData]): 

20 """Three Zone Heart Rate Limits characteristic (0x2A94). 

21 

22 org.bluetooth.characteristic.three_zone_heart_rate_limits 

23 

24 The Three Zone Heart Rate Limits characteristic is used to represent the limits 

25 between the heart rate zones for the three-zone heart rate definition 

26 (Hard, Moderate, and Light) of a user. 

27 """ 

28 

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

30 """Decode Three Zone Heart Rate Limits from raw bytes. 

31 

32 Args: 

33 data: Raw bytes from BLE characteristic (2 bytes) 

34 ctx: Optional context for parsing 

35 

36 Returns: 

37 ThreeZoneHeartRateLimitsData: Parsed heart rate limits 

38 """ 

39 light_moderate_limit = DataParser.parse_int8(data, 0, signed=False) 

40 moderate_hard_limit = DataParser.parse_int8(data, 1, signed=False) 

41 

42 return ThreeZoneHeartRateLimitsData( 

43 light_moderate_limit=light_moderate_limit, 

44 moderate_hard_limit=moderate_hard_limit, 

45 ) 

46 

47 def _encode_value(self, data: ThreeZoneHeartRateLimitsData) -> bytearray: 

48 """Encode Three Zone Heart Rate Limits to raw bytes. 

49 

50 Args: 

51 data: ThreeZoneHeartRateLimitsData to encode 

52 

53 Returns: 

54 bytearray: Encoded bytes 

55 """ 

56 result = bytearray() 

57 result.extend(DataParser.encode_int8(data.light_moderate_limit, signed=False)) 

58 result.extend(DataParser.encode_int8(data.moderate_hard_limit, signed=False)) 

59 return result