libmdr 0.1.0__py3-none-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,342 @@
1
+ """Generated from SonyHeadphonesClient
2
+
3
+ Do not edit this file directly; run ``python tooling/generate_bindings.py``.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ PROPERTY_CURRENT = 0
9
+ PROPERTY_DESIRED = 1
10
+ PROTOCOL_V1 = 1
11
+ PROTOCOL_V2 = 2
12
+ FALSE = 0
13
+ TRUE = 1
14
+ AVAILABILITY_UNKNOWN = 0
15
+ AVAILABILITY_UNAVAILABLE = 1
16
+ AVAILABILITY_AVAILABLE = 2
17
+ TIMEOUT_DEFAULT = 0
18
+ TIMEOUT_ACK = 1
19
+ TIMEOUT_ACK_RETRIES = 2
20
+ HEADPHONES_INIT_NONE = 0
21
+ HEADPHONES_INIT_IDENTITY = 1
22
+ HEADPHONES_INIT_SUPPORT_FUNCTIONS = 2
23
+ HEADPHONES_INIT_GENERAL_SETTINGS = 4
24
+ HEADPHONES_INIT_EQUALIZER = 8
25
+ HEADPHONES_INIT_DSEE = 16
26
+ HEADPHONES_INIT_PLAYBACK = 32
27
+ HEADPHONES_INIT_NOISE_CONTROL = 64
28
+ HEADPHONES_INIT_ASSIGNABLE_CONTROLS = 128
29
+ HEADPHONES_INIT_PERIPHERALS = 256
30
+ HEADPHONES_INIT_SPEAK_TO_CHAT = 512
31
+ HEADPHONES_INIT_LISTENING_MODE = 1024
32
+ HEADPHONES_INIT_POWER = 2048
33
+ HEADPHONES_INIT_WEARING_STATUS = 4096
34
+ HEADPHONES_INIT_VOICE_GUIDANCE = 8192
35
+ HEADPHONES_INIT_CONNECTION = 16384
36
+ HEADPHONES_INIT_BATTERY = 32768
37
+ HEADPHONES_INIT_FIRMWARE_UPDATE = 65536
38
+ HEADPHONES_INIT_ALERT = 131072
39
+ HEADPHONES_INIT_LOG = 262144
40
+ HEADPHONES_INIT_VOICE_ASSISTANT = 524288
41
+ HEADPHONES_INIT_DISCOVERY = 3
42
+ HEADPHONES_INIT_DEFAULT = 1048575
43
+ HEADPHONES_SYNC_NONE = 0
44
+ HEADPHONES_SYNC_BATTERY = 1
45
+ HEADPHONES_SYNC_SAFE_LISTENING = 2
46
+ HEADPHONES_SYNC_PLAYBACK = 4
47
+ HEADPHONES_SYNC_WEARING_STATUS = 8
48
+ HEADPHONES_SYNC_DEFAULT = 15
49
+ FEATURE_IDENTITY = 1
50
+ FEATURE_BATTERY_SINGLE = 2
51
+ FEATURE_BATTERY_LEFT_RIGHT = 3
52
+ FEATURE_BATTERY_CASE = 4
53
+ FEATURE_PLAYBACK_METADATA = 5
54
+ FEATURE_PLAYBACK_CONTROL = 6
55
+ FEATURE_PLAYBACK_VOLUME = 7
56
+ FEATURE_NOISE_CANCELLING = 8
57
+ FEATURE_AMBIENT_SOUND = 9
58
+ FEATURE_ADAPTIVE_AMBIENT_SOUND = 10
59
+ FEATURE_SPEAK_TO_CHAT = 11
60
+ FEATURE_LISTENING_MODE = 12
61
+ FEATURE_EQUALIZER = 13
62
+ FEATURE_DSEE = 14
63
+ FEATURE_PAIRED_DEVICE_MANAGEMENT = 15
64
+ FEATURE_PAIRING_MODE = 16
65
+ FEATURE_GENERAL_SETTINGS = 17
66
+ FEATURE_ASSIGNABLE_CONTROLS = 18
67
+ FEATURE_NOISE_CONTROL_BUTTON = 19
68
+ FEATURE_AUTO_POWER_OFF = 20
69
+ FEATURE_WEARING_DETECTION = 21
70
+ FEATURE_AUTO_PAUSE = 22
71
+ FEATURE_HEAD_GESTURE = 23
72
+ FEATURE_VOICE_GUIDANCE = 24
73
+ FEATURE_VOICE_GUIDANCE_VOLUME = 25
74
+ FEATURE_SHUTDOWN = 26
75
+ FEATURE_CONNECTION_MODE = 27
76
+ FEATURE_SAFE_LISTENING = 28
77
+ FEATURE_SOURCE_SWITCH_CONTROL = 29
78
+ FEATURE_LISTENING_BACKGROUND_MUSIC = 30
79
+ FEATURE_LISTENING_CINEMA = 31
80
+ FEATURE_LISTENING_VOICE_BOOST = 32
81
+ FEATURE_LISTENING_SOUND_LEAKAGE_REDUCTION = 33
82
+ FEATURE_WEARING_STATUS = 34
83
+ FEATURE_VOICE_ASSISTANT = 35
84
+ FEATURE_MAX_VALUE = 35
85
+ EVENT_NONE = 0
86
+ EVENT_IDENTITY_CHANGED = 1
87
+ EVENT_BATTERY_CHANGED = 2
88
+ EVENT_PLAYBACK_CHANGED = 3
89
+ EVENT_NOISE_CONTROL_CHANGED = 4
90
+ EVENT_SPEAK_TO_CHAT_CHANGED = 5
91
+ EVENT_LISTENING_MODE_CHANGED = 6
92
+ EVENT_EQUALIZER_CHANGED = 7
93
+ EVENT_PAIRED_DEVICES_CHANGED = 8
94
+ EVENT_PAIRING_CHANGED = 9
95
+ EVENT_GENERAL_SETTINGS_CHANGED = 10
96
+ EVENT_ASSIGNABLE_CONTROLS_CHANGED = 11
97
+ EVENT_POWER_CHANGED = 12
98
+ EVENT_VOICE_GUIDANCE_CHANGED = 13
99
+ EVENT_CONNECTION_MODE_CHANGED = 14
100
+ EVENT_SAFE_LISTENING_CHANGED = 15
101
+ EVENT_INITIALIZE_COMPLETE = 16
102
+ EVENT_SYNC_COMPLETE = 17
103
+ EVENT_APPLY_COMPLETE = 18
104
+ EVENT_ALERT = 19
105
+ EVENT_INTERACTION = 20
106
+ EVENT_DEVICE_MESSAGE = 21
107
+ EVENT_NEED_SYNC = 22
108
+ EVENT_UNHANDLED = 23
109
+ EVENT_WEARING_STATUS_CHANGED = 24
110
+ EVENT_VOICE_ASSISTANT_CHANGED = 25
111
+ PACKET_DIRECTION_RX = 0
112
+ PACKET_DIRECTION_TX = 1
113
+ TEXT_MODEL_NAME = 1
114
+ TEXT_UNIQUE_ID = 2
115
+ TEXT_FIRMWARE_VERSION = 3
116
+ TEXT_MODEL_SERIES = 4
117
+ TEXT_MODEL_COLOR = 5
118
+ TEXT_TRACK_TITLE = 6
119
+ TEXT_TRACK_ALBUM = 7
120
+ TEXT_TRACK_ARTIST = 8
121
+ TEXT_PAIRED_DEVICE_ID = 9
122
+ TEXT_PAIRED_DEVICE_NAME = 10
123
+ TEXT_GENERAL_SETTING_SUBJECT = 11
124
+ TEXT_GENERAL_SETTING_SUMMARY = 12
125
+ TEXT_LAST_ERROR = 13
126
+ TEXT_LAST_ALERT = 14
127
+ TEXT_LAST_INTERACTION = 15
128
+ TEXT_LAST_DEVICE_MESSAGE = 16
129
+ TEXT_EQUALIZER_PRESET_NAME = 17
130
+ AUDIO_CODEC_UNKNOWN = 0
131
+ AUDIO_CODEC_SBC = 1
132
+ AUDIO_CODEC_AAC = 2
133
+ AUDIO_CODEC_LDAC = 3
134
+ AUDIO_CODEC_APTX = 4
135
+ AUDIO_CODEC_APTX_HD = 5
136
+ AUDIO_CODEC_LC3 = 6
137
+ AUDIO_CODEC_OTHER = 255
138
+ BATTERY_MAIN = 0
139
+ BATTERY_LEFT = 1
140
+ BATTERY_RIGHT = 2
141
+ BATTERY_CASE = 3
142
+ CHARGING_UNKNOWN = 0
143
+ CHARGING_NO = 1
144
+ CHARGING_YES = 2
145
+ CHARGING_COMPLETE = 3
146
+ PLAYBACK_UNKNOWN = 0
147
+ PLAYBACK_STOPPED = 1
148
+ PLAYBACK_PLAYING = 2
149
+ PLAYBACK_PAUSED = 3
150
+ PLAYBACK_PLAY = 1
151
+ PLAYBACK_PAUSE = 2
152
+ PLAYBACK_NEXT = 3
153
+ PLAYBACK_PREVIOUS = 4
154
+ SOURCE_SWITCH_CONTROL_SUCCESS = 0
155
+ SOURCE_SWITCH_CONTROL_FAILED = 1
156
+ SOURCE_SWITCH_CONTROL_FAILED_ON_CALL = 2
157
+ SOURCE_SWITCH_CONTROL_FAILED_NOT_CONNECTED = 3
158
+ SOURCE_SWITCH_CONTROL_FAILED_VOICE_ASSISTANT = 4
159
+ NOISE_MODE_OFF = 0
160
+ NOISE_MODE_CANCELLING = 1
161
+ NOISE_MODE_V1_ON = 1
162
+ NOISE_MODE_AMBIENT = 2
163
+ NOISE_AMBIENT_LEVEL_V1_NOISE_CANCELLING = 255
164
+ ADAPTIVE_SENSITIVITY_UNKNOWN = 0
165
+ ADAPTIVE_SENSITIVITY_LOW = 1
166
+ ADAPTIVE_SENSITIVITY_STANDARD = 2
167
+ ADAPTIVE_SENSITIVITY_HIGH = 3
168
+ NOISE_BUTTON_NONE = 0
169
+ NOISE_BUTTON_NOISE_AMBIENT_OFF = 1
170
+ NOISE_BUTTON_NOISE_AMBIENT = 2
171
+ NOISE_BUTTON_NOISE_OFF = 3
172
+ NOISE_BUTTON_AMBIENT_OFF = 4
173
+ SPEECH_SENSITIVITY_UNKNOWN = 0
174
+ SPEECH_SENSITIVITY_AUTO = 1
175
+ SPEECH_SENSITIVITY_LOW = 2
176
+ SPEECH_SENSITIVITY_HIGH = 3
177
+ SPEAK_TIMEOUT_UNKNOWN = 0
178
+ SPEAK_TIMEOUT_SHORT = 1
179
+ SPEAK_TIMEOUT_MEDIUM = 2
180
+ SPEAK_TIMEOUT_LONG = 3
181
+ SPEAK_TIMEOUT_MANUAL = 4
182
+ LISTENING_STANDARD = 0
183
+ LISTENING_BACKGROUND_MUSIC = 1
184
+ LISTENING_CINEMA = 2
185
+ LISTENING_VOICE_BOOST = 3
186
+ LISTENING_SOUND_LEAKAGE_REDUCTION = 4
187
+ LISTENING_BLOCKER_NONE = 0
188
+ LISTENING_BLOCKER_CALL = 1
189
+ LISTENING_BLOCKER_LE_AUDIO = 2
190
+ LISTENING_BLOCKER_VOICE_ASSISTANT = 4
191
+ LISTENING_BLOCKER_LISTENING_MODE = 8
192
+ LISTENING_BLOCKER_OTHER = 16
193
+ VOICE_ASSISTANT_NONE = 0
194
+ VOICE_ASSISTANT_VOICE_RECOGNITION = 1
195
+ VOICE_ASSISTANT_GOOGLE_ASSISTANT = 2
196
+ VOICE_ASSISTANT_AMAZON_ALEXA = 3
197
+ VOICE_ASSISTANT_TENCENT_XIAOWEI = 4
198
+ VOICE_ASSISTANT_SONY_VOICE_CONTROL = 5
199
+ VOICE_ASSISTANT_OTHER_DEVICE = 6
200
+ VOICE_ASSISTANT_UNKNOWN = 255
201
+ VOICE_ASSISTANT_KEY_UNKNOWN = 0
202
+ VOICE_ASSISTANT_KEY_FIXED_BUTTON = 1
203
+ VOICE_ASSISTANT_KEY_TOUCH_PANEL = 2
204
+ VOICE_ASSISTANT_KEY_ASSIGNABLE_BUTTON = 3
205
+ VOICE_ASSISTANT_KEY_ASSIGNABLE_SENSOR = 4
206
+ ROOM_UNKNOWN = 0
207
+ ROOM_SMALL = 1
208
+ ROOM_MEDIUM = 2
209
+ ROOM_LARGE = 3
210
+ EQ_OFF = 0
211
+ EQ_ROCK = 1
212
+ EQ_POP = 2
213
+ EQ_JAZZ = 3
214
+ EQ_DANCE = 4
215
+ EQ_EDM = 5
216
+ EQ_R_AND_B_HIP_HOP = 6
217
+ EQ_ACOUSTIC = 7
218
+ EQ_BRIGHT = 8
219
+ EQ_EXCITED = 9
220
+ EQ_MELLOW = 10
221
+ EQ_RELAXED = 11
222
+ EQ_VOCAL = 12
223
+ EQ_TREBLE = 13
224
+ EQ_BASS = 14
225
+ EQ_SPEECH = 15
226
+ EQ_HEAVY = 16
227
+ EQ_CLEAR = 17
228
+ EQ_HARD = 18
229
+ EQ_SOFT = 19
230
+ EQ_GAMING = 20
231
+ EQ_FPS_1 = 21
232
+ EQ_FPS_2 = 22
233
+ EQ_FPS_3 = 23
234
+ EQ_CUSTOM = 24
235
+ EQ_USER_1 = 25
236
+ EQ_USER_2 = 26
237
+ EQ_USER_3 = 27
238
+ EQ_USER_4 = 28
239
+ EQ_USER_5 = 29
240
+ EQ_UNKNOWN = 255
241
+ DSEE_UNKNOWN = 0
242
+ DSEE_STANDARD = 1
243
+ DSEE_HX = 2
244
+ DSEE_HX_AI = 3
245
+ DSEE_ULTIMATE = 4
246
+ PAIRED_DEVICE_CONNECT = 1
247
+ PAIRED_DEVICE_DISCONNECT = 2
248
+ PAIRED_DEVICE_SELECT_PLAYBACK = 3
249
+ PAIRED_DEVICE_UNPAIR = 4
250
+ ALERT_ACTION_NEGATIVE = 0
251
+ ALERT_ACTION_POSITIVE = 1
252
+ GENERAL_SETTING_UNKNOWN = 0
253
+ GENERAL_SETTING_BOOLEAN = 1
254
+ ASSIGNABLE_NONE = 0
255
+ ASSIGNABLE_PLAYBACK = 1
256
+ ASSIGNABLE_NOISE_CONTROL = 2
257
+ ASSIGNABLE_NOISE_CONTROL_QUICK_ACCESS = 3
258
+ ASSIGNABLE_TRACK_CONTROL = 4
259
+ ASSIGNABLE_VOICE_RECOGNITION = 5
260
+ ASSIGNABLE_GOOGLE_ASSISTANT = 6
261
+ ASSIGNABLE_AMAZON_ALEXA = 7
262
+ ASSIGNABLE_TENCENT_XIAOWEI = 8
263
+ ASSIGNABLE_MICROSOFT_CORTANA = 9
264
+ ASSIGNABLE_QUICK_ACCESS = 10
265
+ ASSIGNABLE_VOLUME = 11
266
+ ASSIGNABLE_PLAYBACK_VOICE_ASSISTANT_LIMITATION = 12
267
+ ASSIGNABLE_TENCENT_XIAOWEI_Q_MSC = 13
268
+ ASSIGNABLE_TEAMS = 14
269
+ ASSIGNABLE_GOOGLE_ASSISTANT_BT_CLASSIC_CAUTION = 15
270
+ ASSIGNABLE_AMAZON_ALEXA_BT_CLASSIC_CAUTION = 16
271
+ ASSIGNABLE_TENCENT_XIAOWEI_BT_CLASSIC_CAUTION = 17
272
+ ASSIGNABLE_QUICK_ACCESS_BT_CLASSIC_CAUTION = 18
273
+ ASSIGNABLE_NOISE_CONTROL_QUICK_ACCESS_BT_CLASSIC_CAUTION = 19
274
+ ASSIGNABLE_TENCENT_XIAOWEI_Q_MSC_BT_CLASSIC_CAUTION = 20
275
+ ASSIGNABLE_NOISE_CONTROL_MIC = 21
276
+ ASSIGNABLE_LISTENING_MODE_QUICK_ACCESS = 22
277
+ ASSIGNABLE_NOISE_CONTROL_LISTENING_MODE = 23
278
+ ASSIGNABLE_CHAT_MIX = 24
279
+ ASSIGNABLE_CUSTOM1 = 25
280
+ ASSIGNABLE_CUSTOM2 = 26
281
+ ASSIGNABLE_UNKNOWN = 27
282
+ WEARING_POWER_UNAVAILABLE = 0
283
+ WEARING_POWER_DISABLED = 1
284
+ WEARING_POWER_WHEN_REMOVED = 2
285
+ WEARING_STATUS_UNKNOWN = 0
286
+ WEARING_STATUS_WORN = 1
287
+ WEARING_STATUS_LEFT_REMOVED = 2
288
+ WEARING_STATUS_RIGHT_REMOVED = 3
289
+ WEARING_STATUS_REMOVED = 4
290
+ AUDIO_PRIORITY_UNKNOWN = 0
291
+ AUDIO_PRIORITY_QUALITY = 1
292
+ AUDIO_PRIORITY_STABILITY = 2
293
+ ASSIGNABLE_ACTION_KEY_UNKNOWN = 0
294
+ ASSIGNABLE_ACTION_KEY_LEFT = 1
295
+ ASSIGNABLE_ACTION_KEY_RIGHT = 2
296
+ ASSIGNABLE_ACTION_KEY_CUSTOM = 3
297
+ ASSIGNABLE_ACTION_KEY_C = 4
298
+ ASSIGNABLE_ACTION_KEY_NC_AMB = 5
299
+ ASSIGNABLE_ACTION_KEY_NC_AMBIENT = 6
300
+ ASSIGNABLE_ACTION_KEY_TYPE_UNKNOWN = 0
301
+ ASSIGNABLE_ACTION_KEY_TYPE_TOUCH_SENSOR = 1
302
+ ASSIGNABLE_ACTION_KEY_TYPE_BUTTON = 2
303
+ ASSIGNABLE_ACTION_KEY_TYPE_FACE_TAP = 3
304
+
305
+ # Display names: client/Client.cpp kFeatures -> client/I18N/Default.cpp.
306
+ FEATURE_NAMES = {
307
+ FEATURE_IDENTITY: 'Identity',
308
+ FEATURE_BATTERY_SINGLE: 'Single battery',
309
+ FEATURE_BATTERY_LEFT_RIGHT: 'Left/right battery',
310
+ FEATURE_BATTERY_CASE: 'Charging case battery',
311
+ FEATURE_PLAYBACK_METADATA: 'Playback metadata',
312
+ FEATURE_PLAYBACK_CONTROL: 'Playback Control',
313
+ FEATURE_PLAYBACK_VOLUME: 'Playback volume',
314
+ FEATURE_NOISE_CANCELLING: 'Noise Cancelling',
315
+ FEATURE_AMBIENT_SOUND: 'Ambient Sound',
316
+ FEATURE_ADAPTIVE_AMBIENT_SOUND: 'Adaptive ambient sound',
317
+ FEATURE_SPEAK_TO_CHAT: 'Speak To Chat',
318
+ FEATURE_LISTENING_MODE: 'Listening Mode',
319
+ FEATURE_EQUALIZER: 'Equalizer',
320
+ FEATURE_DSEE: 'DSEE',
321
+ FEATURE_PAIRED_DEVICE_MANAGEMENT: 'Paired device management',
322
+ FEATURE_PAIRING_MODE: 'Pairing mode',
323
+ FEATURE_GENERAL_SETTINGS: 'General Setting',
324
+ FEATURE_ASSIGNABLE_CONTROLS: 'Assignable Controls',
325
+ FEATURE_NOISE_CONTROL_BUTTON: 'Noise control button',
326
+ FEATURE_AUTO_POWER_OFF: 'Auto Power Off',
327
+ FEATURE_WEARING_DETECTION: 'Wearing detection',
328
+ FEATURE_AUTO_PAUSE: 'Auto pause',
329
+ FEATURE_HEAD_GESTURE: 'Head Gesture',
330
+ FEATURE_VOICE_GUIDANCE: 'Voice Guidance',
331
+ FEATURE_VOICE_GUIDANCE_VOLUME: 'Voice guidance volume',
332
+ FEATURE_SHUTDOWN: 'Shutdown',
333
+ FEATURE_CONNECTION_MODE: 'Connection mode',
334
+ FEATURE_SAFE_LISTENING: 'Safe listening',
335
+ FEATURE_SOURCE_SWITCH_CONTROL: 'Source switch control',
336
+ FEATURE_LISTENING_BACKGROUND_MUSIC: 'Listening: background music',
337
+ FEATURE_LISTENING_CINEMA: 'Listening: cinema',
338
+ FEATURE_LISTENING_VOICE_BOOST: 'Listening: voice boost',
339
+ FEATURE_LISTENING_SOUND_LEAKAGE_REDUCTION: 'Listening: sound leakage reduction',
340
+ FEATURE_WEARING_STATUS: 'Wearing status',
341
+ FEATURE_VOICE_ASSISTANT: 'Voice Assistant',
342
+ }
@@ -0,0 +1,25 @@
1
+ """Generated from SonyHeadphonesClient
2
+
3
+ Do not edit this file directly; run ``python tooling/generate_bindings.py``.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ ABI_VERSION = 9
9
+ INIT_BT_BLE = 1
10
+ OK = 0
11
+ INPROGRESS = 1
12
+ ERROR_GENERAL = 2
13
+ ERROR_NOT_FOUND = 3
14
+ ERROR_TIMEOUT = 4
15
+ ERROR_NET = 5
16
+ ERROR_NO_CONNECTION = 6
17
+ ERROR_BAD_ADDRESS = 7
18
+ ERROR_NOT_SUPPORTED = 8
19
+ ERROR_BUFFER_TOO_SMALL = 9
20
+ ERROR_MALFORMED_PAYLOAD = 10
21
+ ERROR_INVALID_ARGUMENT = 11
22
+ ERROR_ABI_MISMATCH = 12
23
+ SERVICE_UUID_V2 = '956C7B26-D49A-4BA8-B03F-B17D393CB6E2'
24
+ SERVICE_UUID_V1 = '96CC203E-5068-46AD-B32D-E316F5E069BA'
25
+ SERVICE_UUID_BLE = '5B833E20-6BC7-4802-8E9A-723CECA4BD8F'
Binary file
libmdr/connection.py ADDED
@@ -0,0 +1,73 @@
1
+ """High-level wrapper around MDRConnection helpers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from ctypes import POINTER, byref, c_int, cast, c_void_p
6
+ from dataclasses import dataclass
7
+
8
+ from . import _api, _dll, result
9
+
10
+
11
+ @dataclass(frozen=True)
12
+ class DeviceInfo:
13
+ name: str
14
+ address: str
15
+
16
+
17
+ class Connection:
18
+ """Thin wrapper over an `MDRConnection*` owned elsewhere (usually libmdr_bt)."""
19
+
20
+ def __init__(self, ptr: object) -> None:
21
+ if not ptr:
22
+ raise ValueError("MDRConnection pointer is null")
23
+ self._ptr = cast(ptr, POINTER(_api.MDRConnection))
24
+
25
+ @property
26
+ def pointer(self):
27
+ return self._ptr
28
+
29
+ def as_void_p(self) -> c_void_p:
30
+ return cast(self._ptr, c_void_p)
31
+
32
+ def connect(self, mac_address: str, service_uuid: str) -> int:
33
+ return result.check(
34
+ _dll.lib().mdrConnectionConnect(
35
+ self._ptr,
36
+ mac_address.encode("utf-8"),
37
+ service_uuid.encode("utf-8"),
38
+ ),
39
+ allow_inprogress=True,
40
+ )
41
+
42
+ def disconnect(self) -> None:
43
+ _dll.lib().mdrConnectionDisconnect(self._ptr)
44
+
45
+ def poll(self, timeout_ms: int = 0) -> int:
46
+ return int(_dll.lib().mdrConnectionPoll(self._ptr, int(timeout_ms)))
47
+
48
+ def last_error(self) -> str:
49
+ text = _dll.lib().mdrConnectionGetLastError(self._ptr)
50
+ if not text:
51
+ return ""
52
+ return text.decode("utf-8", errors="replace")
53
+
54
+ def devices(self) -> list[DeviceInfo]:
55
+ lib = _dll.lib()
56
+ devices = POINTER(_api.MDRDeviceInfo)()
57
+ count = c_int(0)
58
+ result.check(lib.mdrConnectionGetDevicesList(self._ptr, byref(devices), byref(count)))
59
+ try:
60
+ out: list[DeviceInfo] = []
61
+ for index in range(count.value):
62
+ item = devices[index]
63
+ out.append(
64
+ DeviceInfo(
65
+ name=item.szDeviceName.decode("utf-8", errors="replace").rstrip("\x00"),
66
+ address=item.szDeviceMacAddress.decode("utf-8", errors="replace").rstrip(
67
+ "\x00"
68
+ ),
69
+ )
70
+ )
71
+ return out
72
+ finally:
73
+ result.check(lib.mdrConnectionFreeDevicesList(self._ptr, byref(devices)))