Coverage for src / bluetooth_sig / types / registry / class_of_device.py: 100%

25 statements  

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

1"""Class of Device data structures for Classic Bluetooth. 

2 

3This module provides data structures for representing and decoding the 24-bit 

4Class of Device (CoD) field used in Classic Bluetooth for device classification. 

5""" 

6 

7from __future__ import annotations 

8 

9import msgspec 

10 

11 

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

13 """Service class information from Class of Device field. 

14 

15 Attributes: 

16 bit_position: Bit position in the CoD field (13-23) 

17 name: Human-readable service class name 

18 """ 

19 

20 bit_position: int 

21 name: str 

22 

23 

24class MajorDeviceClassInfo(msgspec.Struct, frozen=True, kw_only=True): 

25 """Major device class information from Class of Device field. 

26 

27 Attributes: 

28 value: Major device class value (0-31, 5 bits) 

29 name: Human-readable major device class name 

30 """ 

31 

32 value: int 

33 name: str 

34 

35 

36class MinorDeviceClassInfo(msgspec.Struct, frozen=True, kw_only=True): 

37 """Minor device class information from Class of Device field. 

38 

39 Attributes: 

40 value: Minor device class value (0-63, 6 bits) 

41 name: Human-readable minor device class name 

42 major_class: Major device class this minor class belongs to 

43 """ 

44 

45 value: int 

46 name: str 

47 major_class: int 

48 

49 

50class ClassOfDeviceInfo(msgspec.Struct, frozen=True, kw_only=True): 

51 """Decoded Class of Device information. 

52 

53 Represents the decoded classification information from a 24-bit CoD field, 

54 including major/minor device classes and service classes. 

55 

56 Attributes: 

57 major_class: Major device class name (e.g., "Computer", "Phone") 

58 minor_class: Minor device class name (e.g., "Laptop", "Smartphone"), or None 

59 service_classes: List of service class names (e.g., ["Networking", "Audio"]) 

60 raw_value: Original 24-bit CoD value 

61 """ 

62 

63 major_class: list[MajorDeviceClassInfo] | None 

64 minor_class: list[MinorDeviceClassInfo] | None 

65 service_classes: list[str] 

66 raw_value: int 

67 

68 @property 

69 def full_description(self) -> str: 

70 """Get full device description combining major, minor, and services. 

71 

72 Returns: 

73 Human-readable description like "Computer: Laptop (Networking, Audio)" 

74 

75 Examples: 

76 >>> info = ClassOfDeviceInfo( 

77 ... major_class=[MajorDeviceClassInfo(value=1, name="Computer")], 

78 ... minor_class=[MinorDeviceClassInfo(value=3, name="Laptop", major_class=1)], 

79 ... service_classes=["Networking"], 

80 ... raw_value=0x02010C, 

81 ... ) 

82 >>> info.full_description 

83 'Computer: Laptop (Networking)' 

84 """ 

85 desc = self.major_class[0].name if self.major_class else "Unknown" 

86 if self.minor_class: 

87 desc += f": {self.minor_class[0].name}" 

88 if self.service_classes: 

89 desc += f" ({', '.join(self.service_classes)})" 

90 return desc