Coverage for src / bluetooth_sig / gatt / characteristics / four_zone_heart_rate_limits.py: 100%
21 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"""Four Zone Heart Rate Limits characteristic (0x2B4C)."""
3from __future__ import annotations
5import msgspec
7from ..context import CharacteristicContext
8from .base import BaseCharacteristic
9from .utils.data_parser import DataParser
12class FourZoneHeartRateLimitsData(msgspec.Struct, frozen=True, kw_only=True):
13 """Four Zone Heart Rate Limits data structure."""
15 light_moderate_limit: int
16 moderate_hard_limit: int
17 hard_maximum_limit: int
20class FourZoneHeartRateLimitsCharacteristic(BaseCharacteristic[FourZoneHeartRateLimitsData]):
21 """Four Zone Heart Rate Limits characteristic (0x2B4C).
23 org.bluetooth.characteristic.four_zone_heart_rate_limits
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 """
30 def _decode_value(
31 self, data: bytearray, ctx: CharacteristicContext | None = None, *, validate: bool = True
32 ) -> FourZoneHeartRateLimitsData:
33 """Decode Four Zone Heart Rate Limits from raw bytes.
35 Args:
36 data: Raw bytes from BLE characteristic (3 bytes)
37 ctx: Optional context for parsing
38 validate: Whether to validate ranges (default True)
40 Returns:
41 FourZoneHeartRateLimitsData: Parsed heart rate limits
42 """
43 light_moderate_limit = DataParser.parse_int8(data, 0, signed=False)
44 moderate_hard_limit = DataParser.parse_int8(data, 1, signed=False)
45 hard_maximum_limit = DataParser.parse_int8(data, 2, signed=False)
47 return FourZoneHeartRateLimitsData(
48 light_moderate_limit=light_moderate_limit,
49 moderate_hard_limit=moderate_hard_limit,
50 hard_maximum_limit=hard_maximum_limit,
51 )
53 def _encode_value(self, data: FourZoneHeartRateLimitsData) -> bytearray:
54 """Encode Four Zone Heart Rate Limits to raw bytes.
56 Args:
57 data: FourZoneHeartRateLimitsData to encode
59 Returns:
60 bytearray: Encoded bytes
61 """
62 result = bytearray()
63 result.extend(DataParser.encode_int8(data.light_moderate_limit, signed=False))
64 result.extend(DataParser.encode_int8(data.moderate_hard_limit, signed=False))
65 result.extend(DataParser.encode_int8(data.hard_maximum_limit, signed=False))
66 return result