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
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-03 16:41 +0000
1"""Gain Settings Attribute characteristic (0x2B78)."""
3from __future__ import annotations
5import msgspec
7from ..context import CharacteristicContext
8from .base import BaseCharacteristic
9from .utils import DataParser
12class GainSettingsAttributeData(msgspec.Struct, frozen=True, kw_only=True): # pylint: disable=too-few-public-methods
13 """Parsed data from Gain Settings Attribute characteristic.
15 Contains gain settings units (step size in 0.1 dB), minimum, and maximum values.
16 """
18 gain_setting_units: int
19 gain_setting_minimum: int
20 gain_setting_maximum: int
23class GainSettingsAttributeCharacteristic(BaseCharacteristic[GainSettingsAttributeData]):
24 """Gain Settings Attribute characteristic (0x2B78).
26 org.bluetooth.characteristic.gain_settings_attribute
28 Reports the gain settings properties including units, minimum,
29 and maximum values.
30 """
32 expected_length = 3
34 def _decode_value(
35 self, data: bytearray, ctx: CharacteristicContext | None = None, *, validate: bool = True
36 ) -> GainSettingsAttributeData:
37 """Parse Gain Settings Attribute data.
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 )
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