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

30 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-03 16:41 +0000

1"""IMD Status characteristic (0x2C0C). 

2 

3Reports current status flags and additional status data from an 

4Industrial Monitoring Device. 

5 

6References: 

7 Bluetooth SIG Industrial Monitoring Device Service 

8""" 

9 

10from __future__ import annotations 

11 

12from enum import IntFlag 

13 

14import msgspec 

15 

16from ...types.gatt_enums import CharacteristicRole 

17from ..context import CharacteristicContext 

18from .base import BaseCharacteristic 

19from .utils import DataParser 

20 

21 

22class IMDStatusFlags(IntFlag): 

23 """IMD Status flags (uint8).""" 

24 

25 DEVICE_OPERATING = 0x01 

26 ALARM_ACTIVE = 0x02 

27 WARNING_ACTIVE = 0x04 

28 MAINTENANCE_REQUIRED = 0x08 

29 BATTERY_LOW = 0x10 

30 COMMUNICATION_ERROR = 0x20 

31 

32 

33class IMDStatusData(msgspec.Struct, frozen=True, kw_only=True): 

34 """Parsed data from IMD Status characteristic. 

35 

36 Attributes: 

37 flags: IMD status flags. 

38 additional_data: Raw additional status bytes. 

39 """ 

40 

41 flags: IMDStatusFlags 

42 additional_data: bytes = b"" 

43 

44 

45class IMDStatusCharacteristic(BaseCharacteristic[IMDStatusData]): 

46 """IMD Status characteristic (0x2C0C). 

47 

48 org.bluetooth.characteristic.imd_status 

49 

50 Reports current status from an Industrial Monitoring Device. 

51 """ 

52 

53 _manual_role = CharacteristicRole.STATUS 

54 min_length = 1 

55 allow_variable_length = True 

56 

57 def _decode_value( 

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

59 ) -> IMDStatusData: 

60 """Parse IMD Status data. 

61 

62 Format: Flags (uint8) + AdditionalData (variable). 

63 """ 

64 flags = IMDStatusFlags(DataParser.parse_int8(data, 0, signed=False)) 

65 additional_data = bytes(data[1:]) 

66 

67 return IMDStatusData( 

68 flags=flags, 

69 additional_data=additional_data, 

70 ) 

71 

72 def _encode_value(self, data: IMDStatusData) -> bytearray: 

73 """Encode IMD Status data.""" 

74 result = bytearray() 

75 result.extend(DataParser.encode_int8(int(data.flags), signed=False)) 

76 result.extend(data.additional_data) 

77 return result