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

18 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-18 11:17 +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( 

30 self, data: bytearray, ctx: CharacteristicContext | None = None, *, validate: bool = True 

31 ) -> ThreeZoneHeartRateLimitsData: 

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

33 

34 Args: 

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

36 ctx: Optional context for parsing 

37 validate: Whether to validate ranges (default True) 

38 

39 Returns: 

40 ThreeZoneHeartRateLimitsData: Parsed heart rate limits 

41 """ 

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

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

44 

45 return ThreeZoneHeartRateLimitsData( 

46 light_moderate_limit=light_moderate_limit, 

47 moderate_hard_limit=moderate_hard_limit, 

48 ) 

49 

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

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

52 

53 Args: 

54 data: ThreeZoneHeartRateLimitsData to encode 

55 

56 Returns: 

57 bytearray: Encoded bytes 

58 """ 

59 result = bytearray() 

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

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

62 return result