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

1"""Date of Birth characteristic (0x2A85).""" 

2 

3from __future__ import annotations 

4 

5from ...types import DateData 

6from ..context import CharacteristicContext 

7from .base import BaseCharacteristic 

8from .utils import DataParser 

9 

10DateOfBirthData = DateData 

11 

12 

13class DateOfBirthCharacteristic(BaseCharacteristic[DateOfBirthData]): 

14 """Date of Birth characteristic (0x2A85). 

15 

16 org.bluetooth.characteristic.date_of_birth 

17 

18 Date of Birth characteristic. 

19 """ 

20 

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. 

25 

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) 

30 

31 Returns: 

32 DateOfBirthData: Parsed date of birth 

33 """ 

34 year = DataParser.parse_int16(data, offset=0, signed=False) 

35 

36 # Month is uint8 

37 month = data[2] 

38 

39 # Day is uint8 

40 day = data[3] 

41 

42 return DateOfBirthData(year=year, month=month, day=day) 

43 

44 def _encode_value(self, data: DateOfBirthData) -> bytearray: 

45 """Encode Date of Birth to raw bytes. 

46 

47 Args: 

48 data: DateOfBirthData to encode 

49 

50 Returns: 

51 bytearray: Encoded bytes 

52 """ 

53 result = bytearray() 

54 

55 # Encode year (uint16, little-endian) 

56 result.extend(data.year.to_bytes(2, byteorder="little", signed=False)) 

57 

58 # Encode month (uint8) 

59 result.append(data.month) 

60 

61 # Encode day (uint8) 

62 result.append(data.day) 

63 

64 return result