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

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): 

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 if len(data) < 1: 

53 raise ValueError("Ringer Setting data must be at least 1 byte") 

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])