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

30 statements  

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

1"""IMD Control characteristic (0x2C12). 

2 

3Control point for Industrial Monitoring Device operations. 

4 

5References: 

6 Bluetooth SIG Industrial Monitoring Device Service 

7""" 

8 

9from __future__ import annotations 

10 

11from enum import IntEnum 

12 

13import msgspec 

14 

15from ...types.gatt_enums import CharacteristicRole 

16from ..context import CharacteristicContext 

17from .base import BaseCharacteristic 

18from .utils import DataParser 

19 

20 

21class IMDControlOpCode(IntEnum): 

22 """IMD Control operation codes.""" 

23 

24 RESET_DEVICE = 0x01 

25 START_MEASUREMENT = 0x02 

26 STOP_MEASUREMENT = 0x03 

27 CLEAR_STATUS = 0x04 

28 SET_CONFIGURATION = 0x05 

29 RESPONSE = 0xFF 

30 

31 

32class IMDControlData(msgspec.Struct, frozen=True, kw_only=True): 

33 """Parsed data from IMD Control characteristic. 

34 

35 Attributes: 

36 opcode: IMD Control operation code. 

37 parameters: Raw parameter bytes. 

38 """ 

39 

40 opcode: IMDControlOpCode 

41 parameters: bytes = b"" 

42 

43 

44class IMDControlCharacteristic(BaseCharacteristic[IMDControlData]): 

45 """IMD Control characteristic (0x2C12). 

46 

47 org.bluetooth.characteristic.imd_control 

48 

49 Control point for Industrial Monitoring Device operations. 

50 """ 

51 

52 _manual_role = CharacteristicRole.CONTROL 

53 min_length = 1 

54 allow_variable_length = True 

55 

56 def _decode_value( 

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

58 ) -> IMDControlData: 

59 """Parse IMD Control data. 

60 

61 Format: OpCode (uint8) + Parameters (variable). 

62 """ 

63 opcode = IMDControlOpCode(DataParser.parse_int8(data, 0, signed=False)) 

64 parameters = bytes(data[1:]) 

65 

66 return IMDControlData( 

67 opcode=opcode, 

68 parameters=parameters, 

69 ) 

70 

71 def _encode_value(self, data: IMDControlData) -> bytearray: 

72 """Encode IMD Control data.""" 

73 result = bytearray() 

74 result.extend(DataParser.encode_int8(int(data.opcode), signed=False)) 

75 result.extend(data.parameters) 

76 return result