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

1"""Physical Activity Monitor Control Point characteristic (0x2B43). 

2 

3Control point for Physical Activity Monitor session management. 

4 

5References: 

6 Bluetooth SIG Physical Activity Monitor Service 1.0 

7""" 

8 

9from __future__ import annotations 

10 

11from enum import IntEnum 

12 

13import msgspec 

14 

15from ..context import CharacteristicContext 

16from .base import BaseCharacteristic 

17from .utils import DataParser 

18 

19 

20class PAMControlPointOpCode(IntEnum): 

21 """Physical Activity Monitor Control Point Op Codes (Table 3.22).""" 

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 

36 

37 

38class PhysicalActivityMonitorControlPointData(msgspec.Struct, frozen=True, kw_only=True): 

39 """Parsed data from Physical Activity Monitor Control Point. 

40 

41 Attributes: 

42 opcode: The operation code. 

43 parameter: Raw parameter bytes (variable per opcode). Empty if none. 

44 

45 """ 

46 

47 opcode: PAMControlPointOpCode 

48 parameter: bytes = b"" 

49 

50 

51class PhysicalActivityMonitorControlPointCharacteristic( 

52 BaseCharacteristic[PhysicalActivityMonitorControlPointData], 

53): 

54 """Physical Activity Monitor Control Point characteristic (0x2B43). 

55 

56 org.bluetooth.characteristic.physical_activity_monitor_control_point 

57 

58 Control point for session management of the Physical Activity Monitor. 

59 ROLE: CONTROL 

60 """ 

61 

62 min_length = 1 

63 allow_variable_length = True 

64 

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. 

69 

70 Format: OpCode (uint8) + Parameter (variable). 

71 """ 

72 opcode = PAMControlPointOpCode(DataParser.parse_int8(data, 0, signed=False)) 

73 parameter = bytes(data[1:]) 

74 

75 return PhysicalActivityMonitorControlPointData( 

76 opcode=opcode, 

77 parameter=parameter, 

78 ) 

79 

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