Coverage for src / bluetooth_sig / gatt / characteristics / physical_activity_monitor_control_point.py: 100%
35 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"""Physical Activity Monitor Control Point characteristic (0x2B43).
3Control point for Physical Activity Monitor session management.
5References:
6 Bluetooth SIG Physical Activity Monitor Service 1.0
7"""
9from __future__ import annotations
11from enum import IntEnum
13import msgspec
15from ..context import CharacteristicContext
16from .base import BaseCharacteristic
17from .utils import DataParser
20class PAMControlPointOpCode(IntEnum):
21 """Physical Activity Monitor Control Point Op Codes (Table 3.22)."""
23 ENQUIRE_SESSIONS = 0x01
24 ENQUIRE_SUB_SESSIONS = 0x02
25 GET_ENDED_SESSION_DATA = 0x03
26 START_SESSION_SUB_SESSION = 0x04
27 STOP_SESSION = 0x05
28 DELETE_ENDED_SESSION = 0x06
29 SET_AVERAGE_ACTIVITY_TYPE = 0x07
30 GET_ENDED_SESSION_DATA_SUCCESS_RESPONSE = 0xFA
31 ENQUIRE_SUB_SESSIONS_SUCCESS_RESPONSE = 0xFB
32 ENQUIRE_SESSIONS_SUCCESS_RESPONSE = 0xFC
33 GET_ENDED_SESSION_DATA_ERROR_RESPONSE = 0xFD
34 ENQUIRE_SUB_SESSIONS_ERROR_RESPONSE = 0xFE
35 ENQUIRE_SESSIONS_ERROR_RESPONSE = 0xFF
38class PhysicalActivityMonitorControlPointData(msgspec.Struct, frozen=True, kw_only=True):
39 """Parsed data from Physical Activity Monitor Control Point.
41 Attributes:
42 opcode: The operation code.
43 parameter: Raw parameter bytes (variable per opcode). Empty if none.
45 """
47 opcode: PAMControlPointOpCode
48 parameter: bytes = b""
51class PhysicalActivityMonitorControlPointCharacteristic(
52 BaseCharacteristic[PhysicalActivityMonitorControlPointData],
53):
54 """Physical Activity Monitor Control Point characteristic (0x2B43).
56 org.bluetooth.characteristic.physical_activity_monitor_control_point
58 Control point for session management of the Physical Activity Monitor.
59 ROLE: CONTROL
60 """
62 min_length = 1
63 allow_variable_length = True
65 def _decode_value(
66 self, data: bytearray, ctx: CharacteristicContext | None = None, *, validate: bool = True
67 ) -> PhysicalActivityMonitorControlPointData:
68 """Parse Physical Activity Monitor Control Point data.
70 Format: OpCode (uint8) + Parameter (variable).
71 """
72 opcode = PAMControlPointOpCode(DataParser.parse_int8(data, 0, signed=False))
73 parameter = bytes(data[1:])
75 return PhysicalActivityMonitorControlPointData(
76 opcode=opcode,
77 parameter=parameter,
78 )
80 def _encode_value(self, data: PhysicalActivityMonitorControlPointData) -> bytearray:
81 """Encode Physical Activity Monitor Control Point data."""
82 result = bytearray()
83 result.extend(DataParser.encode_int8(int(data.opcode), signed=False))
84 result.extend(data.parameter)
85 return result