Coverage for src / bluetooth_sig / gatt / characteristics / date_of_birth.py: 100%

18 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-01-11 20:14 +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(self, data: bytearray, ctx: CharacteristicContext | None = None) -> DateOfBirthData: 

22 """Decode Date of Birth from raw bytes. 

23 

24 Args: 

25 data: Raw bytes from BLE characteristic (exactly 4 bytes) 

26 ctx: Optional context for parsing 

27 

28 Returns: 

29 DateOfBirthData: Parsed date of birth 

30 """ 

31 # Year is uint16 (little-endian) 

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

33 

34 # Month is uint8 

35 month = data[2] 

36 

37 # Day is uint8 

38 day = data[3] 

39 

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

41 

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

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

44 

45 Args: 

46 data: DateOfBirthData to encode 

47 

48 Returns: 

49 bytearray: Encoded bytes 

50 """ 

51 result = bytearray() 

52 

53 # Encode year (uint16, little-endian) 

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

55 

56 # Encode month (uint8) 

57 result.append(data.month) 

58 

59 # Encode day (uint8) 

60 result.append(data.day) 

61 

62 return result