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

22 statements  

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

1"""Gain Settings Attribute characteristic (0x2B78).""" 

2 

3from __future__ import annotations 

4 

5import msgspec 

6 

7from ..context import CharacteristicContext 

8from .base import BaseCharacteristic 

9from .utils import DataParser 

10 

11 

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

13 """Parsed data from Gain Settings Attribute characteristic. 

14 

15 Contains gain settings units (step size in 0.1 dB), minimum, and maximum values. 

16 """ 

17 

18 gain_setting_units: int 

19 gain_setting_minimum: int 

20 gain_setting_maximum: int 

21 

22 

23class GainSettingsAttributeCharacteristic(BaseCharacteristic[GainSettingsAttributeData]): 

24 """Gain Settings Attribute characteristic (0x2B78). 

25 

26 org.bluetooth.characteristic.gain_settings_attribute 

27 

28 Reports the gain settings properties including units, minimum, 

29 and maximum values. 

30 """ 

31 

32 expected_length = 3 

33 

34 def _decode_value( 

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

36 ) -> GainSettingsAttributeData: 

37 """Parse Gain Settings Attribute data. 

38 

39 Format: units (uint8) + minimum (sint8) + maximum (sint8). 

40 """ 

41 units = DataParser.parse_int8(data, 0, signed=False) 

42 minimum = DataParser.parse_int8(data, 1, signed=True) 

43 maximum = DataParser.parse_int8(data, 2, signed=True) 

44 return GainSettingsAttributeData( 

45 gain_setting_units=units, 

46 gain_setting_minimum=minimum, 

47 gain_setting_maximum=maximum, 

48 ) 

49 

50 def _encode_value(self, data: GainSettingsAttributeData) -> bytearray: 

51 """Encode Gain Settings Attribute data to bytes.""" 

52 result = bytearray() 

53 result += DataParser.encode_int8(data.gain_setting_units) 

54 result += DataParser.encode_int8(data.gain_setting_minimum, signed=True) 

55 result += DataParser.encode_int8(data.gain_setting_maximum, signed=True) 

56 return result