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

18 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-18 11:17 +0000

1"""System ID characteristic implementation.""" 

2 

3from __future__ import annotations 

4 

5import msgspec 

6 

7from ...types.gatt_enums import CharacteristicRole 

8from ..context import CharacteristicContext 

9from .base import BaseCharacteristic 

10 

11 

12class SystemIdData(msgspec.Struct, frozen=True, kw_only=True): 

13 """System ID data. 

14 

15 Attributes: 

16 manufacturer_id: 40-bit manufacturer identifier 

17 oui: 24-bit organizationally unique identifier 

18 """ 

19 

20 manufacturer_id: bytes 

21 oui: bytes 

22 

23 

24class SystemIdCharacteristic(BaseCharacteristic[SystemIdData]): 

25 """System ID characteristic (0x2A23). 

26 

27 org.bluetooth.characteristic.system_id 

28 

29 Represents a 64-bit system identifier: 40-bit manufacturer ID + 24-bit organizationally unique ID. 

30 """ 

31 

32 _manual_role = CharacteristicRole.INFO 

33 expected_length = 8 

34 

35 def _decode_value( 

36 self, data: bytearray, ctx: CharacteristicContext | None = None, *, validate: bool = True 

37 ) -> SystemIdData: 

38 """Parse System ID. 

39 

40 Args: 

41 data: Raw bytearray (8 bytes). 

42 ctx: Optional CharacteristicContext. 

43 validate: Whether to validate ranges (default True) 

44 

45 Returns: 

46 SystemIdData with manufacturer_id (5 bytes) and oui (3 bytes). 

47 """ 

48 return SystemIdData( 

49 manufacturer_id=bytes(data[0:5]), 

50 oui=bytes(data[5:8]), 

51 ) 

52 

53 def _encode_value(self, data: SystemIdData) -> bytearray: 

54 """Encode System ID. 

55 

56 Args: 

57 data: SystemIdData to encode 

58 

59 Returns: 

60 Encoded bytes 

61 """ 

62 result = bytearray() 

63 result.extend(data.manufacturer_id) 

64 result.extend(data.oui) 

65 return result