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
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-18 11:17 +0000
1"""Five Zone Heart Rate Limits characteristic (0x2A8B)."""
3from __future__ import annotations
5import msgspec
7from ..context import CharacteristicContext
8from .base import BaseCharacteristic
9from .utils.data_parser import DataParser
12class FiveZoneHeartRateLimitsData(msgspec.Struct, frozen=True, kw_only=True):
13 """Five Zone Heart Rate Limits data structure."""
15 very_light_light_limit: int
16 light_moderate_limit: int
17 moderate_hard_limit: int
18 hard_maximum_limit: int
21class FiveZoneHeartRateLimitsCharacteristic(BaseCharacteristic[FiveZoneHeartRateLimitsData]):
22 """Five Zone Heart Rate Limits characteristic (0x2A8B).
24 org.bluetooth.characteristic.five_zone_heart_rate_limits
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 """
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.
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)
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)
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 )
56 def _encode_value(self, data: FiveZoneHeartRateLimitsData) -> bytearray:
57 """Encode Five Zone Heart Rate Limits to raw bytes.
59 Args:
60 data: FiveZoneHeartRateLimitsData to encode
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