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
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-03 16:41 +0000
1"""Call Friendly Name characteristic (0x2BC2)."""
3from __future__ import annotations
5import msgspec
7from ..context import CharacteristicContext
8from .base import BaseCharacteristic
9from .utils import DataParser
12class CallFriendlyNameData(msgspec.Struct, frozen=True, kw_only=True):
13 """Parsed data from Call Friendly Name characteristic."""
15 call_index: int
16 friendly_name: str
19class CallFriendlyNameCharacteristic(BaseCharacteristic[CallFriendlyNameData]):
20 """Call Friendly Name characteristic (0x2BC2).
22 org.bluetooth.characteristic.call_friendly_name
24 Call Index (uint8) followed by a UTF-8 friendly name string.
26 References:
27 Telephone Bearer Service 1.0, Section 3.15
28 """
30 min_length = 1
31 allow_variable_length = True
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 ""
39 return CallFriendlyNameData(call_index=call_index, friendly_name=friendly_name)
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