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
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-11 20:14 +0000
1"""Three Zone Heart Rate Limits characteristic (0x2A94)."""
3from __future__ import annotations
5import msgspec
7from ..context import CharacteristicContext
8from .base import BaseCharacteristic
9from .utils.data_parser import DataParser
12class ThreeZoneHeartRateLimitsData(msgspec.Struct, frozen=True, kw_only=True):
13 """Three Zone Heart Rate Limits data structure."""
15 light_moderate_limit: int
16 moderate_hard_limit: int
19class ThreeZoneHeartRateLimitsCharacteristic(BaseCharacteristic[ThreeZoneHeartRateLimitsData]):
20 """Three Zone Heart Rate Limits characteristic (0x2A94).
22 org.bluetooth.characteristic.three_zone_heart_rate_limits
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 """
29 def _decode_value(self, data: bytearray, ctx: CharacteristicContext | None = None) -> ThreeZoneHeartRateLimitsData:
30 """Decode Three Zone Heart Rate Limits from raw bytes.
32 Args:
33 data: Raw bytes from BLE characteristic (2 bytes)
34 ctx: Optional context for parsing
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)
42 return ThreeZoneHeartRateLimitsData(
43 light_moderate_limit=light_moderate_limit,
44 moderate_hard_limit=moderate_hard_limit,
45 )
47 def _encode_value(self, data: ThreeZoneHeartRateLimitsData) -> bytearray:
48 """Encode Three Zone Heart Rate Limits to raw bytes.
50 Args:
51 data: ThreeZoneHeartRateLimitsData to encode
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