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

21 statements  

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

1"""Four Zone Heart Rate Limits characteristic (0x2B4C).""" 

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

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

14 

15 light_moderate_limit: int 

16 moderate_hard_limit: int 

17 hard_maximum_limit: int 

18 

19 

20class FourZoneHeartRateLimitsCharacteristic(BaseCharacteristic[FourZoneHeartRateLimitsData]): 

21 """Four Zone Heart Rate Limits characteristic (0x2B4C). 

22 

23 org.bluetooth.characteristic.four_zone_heart_rate_limits 

24 

25 The Four Zone Heart Rate Limits characteristic is used to represent the limits 

26 between the heart rate zones for the four-zone heart rate definition 

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

28 """ 

29 

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

31 """Decode Four Zone Heart Rate Limits from raw bytes. 

32 

33 Args: 

34 data: Raw bytes from BLE characteristic (3 bytes) 

35 ctx: Optional context for parsing 

36 

37 Returns: 

38 FourZoneHeartRateLimitsData: Parsed heart rate limits 

39 """ 

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

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

42 hard_maximum_limit = DataParser.parse_int8(data, 2, signed=False) 

43 

44 return FourZoneHeartRateLimitsData( 

45 light_moderate_limit=light_moderate_limit, 

46 moderate_hard_limit=moderate_hard_limit, 

47 hard_maximum_limit=hard_maximum_limit, 

48 ) 

49 

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

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

52 

53 Args: 

54 data: FourZoneHeartRateLimitsData 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 result.extend(DataParser.encode_int8(data.hard_maximum_limit, signed=False)) 

63 return result