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
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-03 16:41 +0000
1"""IMD Status characteristic (0x2C0C).
3Reports current status flags and additional status data from an
4Industrial Monitoring Device.
6References:
7 Bluetooth SIG Industrial Monitoring Device Service
8"""
10from __future__ import annotations
12from enum import IntFlag
14import msgspec
16from ...types.gatt_enums import CharacteristicRole
17from ..context import CharacteristicContext
18from .base import BaseCharacteristic
19from .utils import DataParser
22class IMDStatusFlags(IntFlag):
23 """IMD Status flags (uint8)."""
25 DEVICE_OPERATING = 0x01
26 ALARM_ACTIVE = 0x02
27 WARNING_ACTIVE = 0x04
28 MAINTENANCE_REQUIRED = 0x08
29 BATTERY_LOW = 0x10
30 COMMUNICATION_ERROR = 0x20
33class IMDStatusData(msgspec.Struct, frozen=True, kw_only=True):
34 """Parsed data from IMD Status characteristic.
36 Attributes:
37 flags: IMD status flags.
38 additional_data: Raw additional status bytes.
39 """
41 flags: IMDStatusFlags
42 additional_data: bytes = b""
45class IMDStatusCharacteristic(BaseCharacteristic[IMDStatusData]):
46 """IMD Status characteristic (0x2C0C).
48 org.bluetooth.characteristic.imd_status
50 Reports current status from an Industrial Monitoring Device.
51 """
53 _manual_role = CharacteristicRole.STATUS
54 min_length = 1
55 allow_variable_length = True
57 def _decode_value(
58 self, data: bytearray, ctx: CharacteristicContext | None = None, *, validate: bool = True
59 ) -> IMDStatusData:
60 """Parse IMD Status data.
62 Format: Flags (uint8) + AdditionalData (variable).
63 """
64 flags = IMDStatusFlags(DataParser.parse_int8(data, 0, signed=False))
65 additional_data = bytes(data[1:])
67 return IMDStatusData(
68 flags=flags,
69 additional_data=additional_data,
70 )
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