Coverage for src / bluetooth_sig / gatt / characteristics / date_of_birth.py: 100%
18 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"""Date of Birth characteristic (0x2A85)."""
3from __future__ import annotations
5from ...types import DateData
6from ..context import CharacteristicContext
7from .base import BaseCharacteristic
8from .utils import DataParser
10DateOfBirthData = DateData
13class DateOfBirthCharacteristic(BaseCharacteristic[DateOfBirthData]):
14 """Date of Birth characteristic (0x2A85).
16 org.bluetooth.characteristic.date_of_birth
18 Date of Birth characteristic.
19 """
21 def _decode_value(
22 self, data: bytearray, ctx: CharacteristicContext | None = None, *, validate: bool = True
23 ) -> DateOfBirthData:
24 """Decode Date of Birth from raw bytes.
26 Args:
27 data: Raw bytes from BLE characteristic (exactly 4 bytes)
28 ctx: Optional context for parsing
29 validate: Whether to validate ranges (default True)
31 Returns:
32 DateOfBirthData: Parsed date of birth
33 """
34 year = DataParser.parse_int16(data, offset=0, signed=False)
36 # Month is uint8
37 month = data[2]
39 # Day is uint8
40 day = data[3]
42 return DateOfBirthData(year=year, month=month, day=day)
44 def _encode_value(self, data: DateOfBirthData) -> bytearray:
45 """Encode Date of Birth to raw bytes.
47 Args:
48 data: DateOfBirthData to encode
50 Returns:
51 bytearray: Encoded bytes
52 """
53 result = bytearray()
55 # Encode year (uint16, little-endian)
56 result.extend(data.year.to_bytes(2, byteorder="little", signed=False))
58 # Encode month (uint8)
59 result.append(data.month)
61 # Encode day (uint8)
62 result.append(data.day)
64 return result