Coverage for src / bluetooth_sig / gatt / characteristics / ringer_setting.py: 67%

21 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-01-11 20:14 +0000

1"""Ringer Setting characteristic implementation.""" 

2 

3from __future__ import annotations 

4 

5from enum import IntEnum 

6 

7import msgspec 

8 

9from ..context import CharacteristicContext 

10from .base import BaseCharacteristic 

11from .utils import DataParser 

12 

13 

14class RingerSetting(IntEnum): 

15 """Ringer Setting enumeration values.""" 

16 

17 RINGER_SILENT = 0 

18 RINGER_NORMAL = 1 

19 

20 

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

22 """Parsed data from Ringer Setting characteristic.""" 

23 

24 setting: RingerSetting 

25 

26 

27class RingerSettingCharacteristic(BaseCharacteristic[RingerSettingData]): 

28 """Ringer Setting characteristic (0x2A41). 

29 

30 org.bluetooth.characteristic.ringer_setting 

31 

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 """ 

37 

38 def _decode_value(self, data: bytearray, ctx: CharacteristicContext | None = None) -> RingerSettingData: 

39 """Parse ringer setting data according to Bluetooth specification. 

40 

41 Args: 

42 data: Raw bytearray from BLE characteristic. 

43 ctx: Optional CharacteristicContext (unused) 

44 

45 Returns: 

46 RingerSettingData containing parsed ringer setting. 

47 

48 Raises: 

49 ValueError: If data format is invalid. 

50 

51 """ 

52 setting_byte = DataParser.parse_int8(data, 0, signed=False) 

53 

54 try: 

55 setting = RingerSetting(setting_byte) 

56 except ValueError as e: 

57 raise ValueError(f"Invalid ringer setting value: {setting_byte}") from e 

58 

59 return RingerSettingData(setting=setting) 

60 

61 def _encode_value(self, data: RingerSettingData) -> bytearray: 

62 """Encode RingerSettingData back to bytes. 

63 

64 Args: 

65 data: RingerSettingData instance to encode 

66 

67 Returns: 

68 Encoded bytes representing the ringer setting 

69 

70 """ 

71 return bytearray([data.setting.value])