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

21 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-18 11:17 +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( 

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

40 ) -> RingerSettingData: 

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

42 

43 Args: 

44 data: Raw bytearray from BLE characteristic. 

45 ctx: Optional CharacteristicContext (unused) 

46 validate: Whether to validate ranges (default True) 

47 

48 Returns: 

49 RingerSettingData containing parsed ringer setting. 

50 

51 Raises: 

52 ValueError: If data format is invalid. 

53 

54 """ 

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

56 

57 try: 

58 setting = RingerSetting(setting_byte) 

59 except ValueError as e: 

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

61 

62 return RingerSettingData(setting=setting) 

63 

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

65 """Encode RingerSettingData back to bytes. 

66 

67 Args: 

68 data: RingerSettingData instance to encode 

69 

70 Returns: 

71 Encoded bytes representing the ringer setting 

72 

73 """ 

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