Coverage for src / bluetooth_sig / gatt / characteristics / call_friendly_name.py: 100%

20 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-03 16:41 +0000

1"""Call Friendly Name characteristic (0x2BC2).""" 

2 

3from __future__ import annotations 

4 

5import msgspec 

6 

7from ..context import CharacteristicContext 

8from .base import BaseCharacteristic 

9from .utils import DataParser 

10 

11 

12class CallFriendlyNameData(msgspec.Struct, frozen=True, kw_only=True): 

13 """Parsed data from Call Friendly Name characteristic.""" 

14 

15 call_index: int 

16 friendly_name: str 

17 

18 

19class CallFriendlyNameCharacteristic(BaseCharacteristic[CallFriendlyNameData]): 

20 """Call Friendly Name characteristic (0x2BC2). 

21 

22 org.bluetooth.characteristic.call_friendly_name 

23 

24 Call Index (uint8) followed by a UTF-8 friendly name string. 

25 

26 References: 

27 Telephone Bearer Service 1.0, Section 3.15 

28 """ 

29 

30 min_length = 1 

31 allow_variable_length = True 

32 

33 def _decode_value( 

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

35 ) -> CallFriendlyNameData: 

36 call_index = DataParser.parse_int8(data, 0, signed=False) 

37 friendly_name = DataParser.parse_utf8_string(data[1:]) if len(data) > 1 else "" 

38 

39 return CallFriendlyNameData(call_index=call_index, friendly_name=friendly_name) 

40 

41 def _encode_value(self, data: CallFriendlyNameData) -> bytearray: 

42 result = bytearray() 

43 result.extend(DataParser.encode_int8(data.call_index, signed=False)) 

44 result.extend(data.friendly_name.encode("utf-8")) 

45 return result