Coverage for src/bluetooth_sig/gatt/characteristics/ringer_setting.py: 61%
23 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-30 00:10 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-30 00:10 +0000
1"""Ringer Setting characteristic implementation."""
3from __future__ import annotations
5from enum import IntEnum
7import msgspec
9from ..context import CharacteristicContext
10from .base import BaseCharacteristic
11from .utils import DataParser
14class RingerSetting(IntEnum):
15 """Ringer Setting enumeration values."""
17 RINGER_SILENT = 0
18 RINGER_NORMAL = 1
21class RingerSettingData(msgspec.Struct, frozen=True, kw_only=True): # pylint: disable=too-few-public-methods
22 """Parsed data from Ringer Setting characteristic."""
24 setting: RingerSetting
27class RingerSettingCharacteristic(BaseCharacteristic):
28 """Ringer Setting characteristic (0x2A41).
30 org.bluetooth.characteristic.ringer_setting
32 The Ringer Setting characteristic defines the Setting of the Ringer.
33 Value 0: Ringer Silent
34 Value 1: Ringer Normal
35 Values 2-255: Reserved for future use
36 """
38 def decode_value(self, data: bytearray, ctx: CharacteristicContext | None = None) -> RingerSettingData:
39 """Parse ringer setting data according to Bluetooth specification.
41 Args:
42 data: Raw bytearray from BLE characteristic.
43 ctx: Optional CharacteristicContext (unused)
45 Returns:
46 RingerSettingData containing parsed ringer setting.
48 Raises:
49 ValueError: If data format is invalid.
51 """
52 if len(data) < 1:
53 raise ValueError("Ringer Setting data must be at least 1 byte")
55 setting_byte = DataParser.parse_int8(data, 0, signed=False)
57 try:
58 setting = RingerSetting(setting_byte)
59 except ValueError as e:
60 raise ValueError(f"Invalid ringer setting value: {setting_byte}") from e
62 return RingerSettingData(setting=setting)
64 def encode_value(self, data: RingerSettingData) -> bytearray:
65 """Encode RingerSettingData back to bytes.
67 Args:
68 data: RingerSettingData instance to encode
70 Returns:
71 Encoded bytes representing the ringer setting
73 """
74 return bytearray([data.setting.value])