Coverage for src / bluetooth_sig / gatt / characteristics / system_id.py: 100%
18 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-18 11:17 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-18 11:17 +0000
1"""System ID characteristic implementation."""
3from __future__ import annotations
5import msgspec
7from ...types.gatt_enums import CharacteristicRole
8from ..context import CharacteristicContext
9from .base import BaseCharacteristic
12class SystemIdData(msgspec.Struct, frozen=True, kw_only=True):
13 """System ID data.
15 Attributes:
16 manufacturer_id: 40-bit manufacturer identifier
17 oui: 24-bit organizationally unique identifier
18 """
20 manufacturer_id: bytes
21 oui: bytes
24class SystemIdCharacteristic(BaseCharacteristic[SystemIdData]):
25 """System ID characteristic (0x2A23).
27 org.bluetooth.characteristic.system_id
29 Represents a 64-bit system identifier: 40-bit manufacturer ID + 24-bit organizationally unique ID.
30 """
32 _manual_role = CharacteristicRole.INFO
33 expected_length = 8
35 def _decode_value(
36 self, data: bytearray, ctx: CharacteristicContext | None = None, *, validate: bool = True
37 ) -> SystemIdData:
38 """Parse System ID.
40 Args:
41 data: Raw bytearray (8 bytes).
42 ctx: Optional CharacteristicContext.
43 validate: Whether to validate ranges (default True)
45 Returns:
46 SystemIdData with manufacturer_id (5 bytes) and oui (3 bytes).
47 """
48 return SystemIdData(
49 manufacturer_id=bytes(data[0:5]),
50 oui=bytes(data[5:8]),
51 )
53 def _encode_value(self, data: SystemIdData) -> bytearray:
54 """Encode System ID.
56 Args:
57 data: SystemIdData to encode
59 Returns:
60 Encoded bytes
61 """
62 result = bytearray()
63 result.extend(data.manufacturer_id)
64 result.extend(data.oui)
65 return result