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

20 statements  

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

1"""Available Audio Contexts characteristic (0x2BCD).""" 

2 

3from __future__ import annotations 

4 

5import msgspec 

6 

7from bluetooth_sig.types.audio_context_type import AudioContextType 

8 

9from ..context import CharacteristicContext 

10from .base import BaseCharacteristic 

11from .utils import DataParser 

12 

13 

14class AvailableAudioContextsData(msgspec.Struct, frozen=True, kw_only=True): # pylint: disable=too-few-public-methods 

15 """Parsed data from Available Audio Contexts characteristic. 

16 

17 Contains the currently available sink and source audio contexts. 

18 """ 

19 

20 sink_audio_contexts: AudioContextType 

21 source_audio_contexts: AudioContextType 

22 

23 

24class AvailableAudioContextsCharacteristic(BaseCharacteristic[AvailableAudioContextsData]): 

25 """Available Audio Contexts characteristic (0x2BCD). 

26 

27 org.bluetooth.characteristic.available_audio_contexts 

28 

29 Reports the currently available audio contexts for sink and source. 

30 """ 

31 

32 expected_length = 4 

33 

34 def _decode_value( 

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

36 ) -> AvailableAudioContextsData: 

37 """Parse Available Audio Contexts data. 

38 

39 Format: sink_audio_contexts (uint16 LE) + source_audio_contexts (uint16 LE). 

40 """ 

41 sink = AudioContextType(DataParser.parse_int16(data, 0, signed=False)) 

42 source = AudioContextType(DataParser.parse_int16(data, 2, signed=False)) 

43 return AvailableAudioContextsData( 

44 sink_audio_contexts=sink, 

45 source_audio_contexts=source, 

46 ) 

47 

48 def _encode_value(self, data: AvailableAudioContextsData) -> bytearray: 

49 """Encode Available Audio Contexts data to bytes.""" 

50 result = bytearray() 

51 result += DataParser.encode_int16(int(data.sink_audio_contexts)) 

52 result += DataParser.encode_int16(int(data.source_audio_contexts)) 

53 return result