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

24 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-18 11:17 +0000

1"""Five Zone Heart Rate Limits characteristic (0x2A8B).""" 

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 FiveZoneHeartRateLimitsData(msgspec.Struct, frozen=True, kw_only=True): 

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

14 

15 very_light_light_limit: int 

16 light_moderate_limit: int 

17 moderate_hard_limit: int 

18 hard_maximum_limit: int 

19 

20 

21class FiveZoneHeartRateLimitsCharacteristic(BaseCharacteristic[FiveZoneHeartRateLimitsData]): 

22 """Five Zone Heart Rate Limits characteristic (0x2A8B). 

23 

24 org.bluetooth.characteristic.five_zone_heart_rate_limits 

25 

26 The Five Zone Heart Rate Limits characteristic is used to represent the limits 

27 between the heart rate zones for the five-zone heart rate definition 

28 (Maximum, Hard, Moderate, Light, and Very Light) of a user. 

29 """ 

30 

31 def _decode_value( 

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

33 ) -> FiveZoneHeartRateLimitsData: 

34 """Decode Five Zone Heart Rate Limits from raw bytes. 

35 

36 Args: 

37 data: Raw bytes from BLE characteristic (4 bytes) 

38 ctx: Optional context for parsing 

39 validate: Whether to validate ranges (default True) 

40 

41 Returns: 

42 FiveZoneHeartRateLimitsData: Parsed heart rate limits 

43 """ 

44 very_light_light_limit = DataParser.parse_int8(data, 0, signed=False) 

45 light_moderate_limit = DataParser.parse_int8(data, 1, signed=False) 

46 moderate_hard_limit = DataParser.parse_int8(data, 2, signed=False) 

47 hard_maximum_limit = DataParser.parse_int8(data, 3, signed=False) 

48 

49 return FiveZoneHeartRateLimitsData( 

50 very_light_light_limit=very_light_light_limit, 

51 light_moderate_limit=light_moderate_limit, 

52 moderate_hard_limit=moderate_hard_limit, 

53 hard_maximum_limit=hard_maximum_limit, 

54 ) 

55 

56 def _encode_value(self, data: FiveZoneHeartRateLimitsData) -> bytearray: 

57 """Encode Five Zone Heart Rate Limits to raw bytes. 

58 

59 Args: 

60 data: FiveZoneHeartRateLimitsData to encode 

61 

62 Returns: 

63 bytearray: Encoded bytes 

64 """ 

65 result = bytearray() 

66 result.extend(DataParser.encode_int8(data.very_light_light_limit, signed=False)) 

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

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

69 result.extend(DataParser.encode_int8(data.hard_maximum_limit, signed=False)) 

70 return result