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

17 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-01-11 20:14 +0000

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

2 

3from __future__ import annotations 

4 

5import msgspec 

6 

7from ..context import CharacteristicContext 

8from .base import BaseCharacteristic 

9 

10 

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

12 """System ID data. 

13 

14 Attributes: 

15 manufacturer_id: 40-bit manufacturer identifier 

16 oui: 24-bit organizationally unique identifier 

17 """ 

18 

19 manufacturer_id: bytes 

20 oui: bytes 

21 

22 

23class SystemIdCharacteristic(BaseCharacteristic[SystemIdData]): 

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

25 

26 org.bluetooth.characteristic.system_id 

27 

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

29 """ 

30 

31 _manual_value_type = "SystemIdData" 

32 expected_length = 8 

33 

34 def _decode_value(self, data: bytearray, ctx: CharacteristicContext | None = None) -> SystemIdData: 

35 """Parse System ID. 

36 

37 Args: 

38 data: Raw bytearray (8 bytes). 

39 ctx: Optional CharacteristicContext. 

40 

41 Returns: 

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

43 """ 

44 return SystemIdData( 

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

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

47 ) 

48 

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

50 """Encode System ID. 

51 

52 Args: 

53 data: SystemIdData to encode 

54 

55 Returns: 

56 Encoded bytes 

57 """ 

58 result = bytearray() 

59 result.extend(data.manufacturer_id) 

60 result.extend(data.oui) 

61 return result