bumble 0.0.178__py3-none-any.whl → 0.0.180__py3-none-any.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.
- bumble/_version.py +2 -2
- bumble/a2dp.py +83 -68
- bumble/apps/bench.py +180 -24
- bumble/apps/controller_info.py +14 -0
- bumble/apps/pair.py +9 -2
- bumble/avdtp.py +3 -3
- bumble/crypto.py +82 -66
- bumble/device.py +247 -23
- bumble/gatt.py +117 -7
- bumble/gatt_client.py +56 -20
- bumble/hci.py +351 -78
- bumble/helpers.py +67 -42
- bumble/hid.py +8 -7
- bumble/l2cap.py +8 -0
- bumble/profiles/csip.py +147 -0
- bumble/rfcomm.py +2 -3
- bumble/sdp.py +4 -4
- bumble/smp.py +66 -43
- bumble/transport/common.py +1 -1
- bumble/transport/usb.py +58 -61
- bumble/utils.py +17 -1
- {bumble-0.0.178.dist-info → bumble-0.0.180.dist-info}/METADATA +1 -1
- {bumble-0.0.178.dist-info → bumble-0.0.180.dist-info}/RECORD +27 -26
- {bumble-0.0.178.dist-info → bumble-0.0.180.dist-info}/WHEEL +1 -1
- {bumble-0.0.178.dist-info → bumble-0.0.180.dist-info}/LICENSE +0 -0
- {bumble-0.0.178.dist-info → bumble-0.0.180.dist-info}/entry_points.txt +0 -0
- {bumble-0.0.178.dist-info → bumble-0.0.180.dist-info}/top_level.txt +0 -0
bumble/transport/common.py
CHANGED
bumble/transport/usb.py
CHANGED
|
@@ -24,9 +24,10 @@ import platform
|
|
|
24
24
|
|
|
25
25
|
import usb1
|
|
26
26
|
|
|
27
|
-
from .common import Transport, ParserSource
|
|
28
|
-
from
|
|
29
|
-
from
|
|
27
|
+
from bumble.transport.common import Transport, ParserSource
|
|
28
|
+
from bumble import hci
|
|
29
|
+
from bumble.colors import color
|
|
30
|
+
from bumble.utils import AsyncRunner
|
|
30
31
|
|
|
31
32
|
|
|
32
33
|
# -----------------------------------------------------------------------------
|
|
@@ -113,7 +114,7 @@ async def open_usb_transport(spec: str) -> Transport:
|
|
|
113
114
|
def __init__(self, device, acl_out):
|
|
114
115
|
self.device = device
|
|
115
116
|
self.acl_out = acl_out
|
|
116
|
-
self.
|
|
117
|
+
self.acl_out_transfer = device.getTransfer()
|
|
117
118
|
self.packets = collections.deque() # Queue of packets waiting to be sent
|
|
118
119
|
self.loop = asyncio.get_running_loop()
|
|
119
120
|
self.cancel_done = self.loop.create_future()
|
|
@@ -137,21 +138,20 @@ async def open_usb_transport(spec: str) -> Transport:
|
|
|
137
138
|
# The queue was previously empty, re-prime the pump
|
|
138
139
|
self.process_queue()
|
|
139
140
|
|
|
140
|
-
def
|
|
141
|
+
def transfer_callback(self, transfer):
|
|
141
142
|
status = transfer.getStatus()
|
|
142
|
-
# logger.debug(f'<<< USB out transfer callback: status={status}')
|
|
143
143
|
|
|
144
144
|
# pylint: disable=no-member
|
|
145
145
|
if status == usb1.TRANSFER_COMPLETED:
|
|
146
|
-
self.loop.call_soon_threadsafe(self.
|
|
146
|
+
self.loop.call_soon_threadsafe(self.on_packet_sent)
|
|
147
147
|
elif status == usb1.TRANSFER_CANCELLED:
|
|
148
148
|
self.loop.call_soon_threadsafe(self.cancel_done.set_result, None)
|
|
149
149
|
else:
|
|
150
150
|
logger.warning(
|
|
151
|
-
color(f'!!!
|
|
151
|
+
color(f'!!! OUT transfer not completed: status={status}', 'red')
|
|
152
152
|
)
|
|
153
153
|
|
|
154
|
-
def
|
|
154
|
+
def on_packet_sent(self):
|
|
155
155
|
if self.packets:
|
|
156
156
|
self.packets.popleft()
|
|
157
157
|
self.process_queue()
|
|
@@ -163,22 +163,20 @@ async def open_usb_transport(spec: str) -> Transport:
|
|
|
163
163
|
packet = self.packets[0]
|
|
164
164
|
packet_type = packet[0]
|
|
165
165
|
if packet_type == hci.HCI_ACL_DATA_PACKET:
|
|
166
|
-
self.
|
|
167
|
-
self.acl_out, packet[1:], callback=self.
|
|
166
|
+
self.acl_out_transfer.setBulk(
|
|
167
|
+
self.acl_out, packet[1:], callback=self.transfer_callback
|
|
168
168
|
)
|
|
169
|
-
|
|
170
|
-
self.transfer.submit()
|
|
169
|
+
self.acl_out_transfer.submit()
|
|
171
170
|
elif packet_type == hci.HCI_COMMAND_PACKET:
|
|
172
|
-
self.
|
|
171
|
+
self.acl_out_transfer.setControl(
|
|
173
172
|
USB_RECIPIENT_DEVICE | USB_REQUEST_TYPE_CLASS,
|
|
174
173
|
0,
|
|
175
174
|
0,
|
|
176
175
|
0,
|
|
177
176
|
packet[1:],
|
|
178
|
-
callback=self.
|
|
177
|
+
callback=self.transfer_callback,
|
|
179
178
|
)
|
|
180
|
-
|
|
181
|
-
self.transfer.submit()
|
|
179
|
+
self.acl_out_transfer.submit()
|
|
182
180
|
else:
|
|
183
181
|
logger.warning(color(f'unsupported packet type {packet_type}', 'red'))
|
|
184
182
|
|
|
@@ -193,11 +191,11 @@ async def open_usb_transport(spec: str) -> Transport:
|
|
|
193
191
|
self.packets.clear()
|
|
194
192
|
|
|
195
193
|
# If we have a transfer in flight, cancel it
|
|
196
|
-
if self.
|
|
194
|
+
if self.acl_out_transfer.isSubmitted():
|
|
197
195
|
# Try to cancel the transfer, but that may fail because it may have
|
|
198
196
|
# already completed
|
|
199
197
|
try:
|
|
200
|
-
self.
|
|
198
|
+
self.acl_out_transfer.cancel()
|
|
201
199
|
|
|
202
200
|
logger.debug('waiting for OUT transfer cancellation to be done...')
|
|
203
201
|
await self.cancel_done
|
|
@@ -206,27 +204,22 @@ async def open_usb_transport(spec: str) -> Transport:
|
|
|
206
204
|
logger.debug('OUT transfer likely already completed')
|
|
207
205
|
|
|
208
206
|
class UsbPacketSource(asyncio.Protocol, ParserSource):
|
|
209
|
-
def __init__(self,
|
|
207
|
+
def __init__(self, device, metadata, acl_in, events_in):
|
|
210
208
|
super().__init__()
|
|
211
|
-
self.context = context
|
|
212
209
|
self.device = device
|
|
213
210
|
self.metadata = metadata
|
|
214
211
|
self.acl_in = acl_in
|
|
212
|
+
self.acl_in_transfer = None
|
|
215
213
|
self.events_in = events_in
|
|
214
|
+
self.events_in_transfer = None
|
|
216
215
|
self.loop = asyncio.get_running_loop()
|
|
217
216
|
self.queue = asyncio.Queue()
|
|
218
217
|
self.dequeue_task = None
|
|
219
|
-
self.closed = False
|
|
220
|
-
self.event_loop_done = self.loop.create_future()
|
|
221
218
|
self.cancel_done = {
|
|
222
219
|
hci.HCI_EVENT_PACKET: self.loop.create_future(),
|
|
223
220
|
hci.HCI_ACL_DATA_PACKET: self.loop.create_future(),
|
|
224
221
|
}
|
|
225
|
-
self.
|
|
226
|
-
self.acl_in_transfer = None
|
|
227
|
-
|
|
228
|
-
# Create a thread to process events
|
|
229
|
-
self.event_thread = threading.Thread(target=self.run)
|
|
222
|
+
self.closed = False
|
|
230
223
|
|
|
231
224
|
def start(self):
|
|
232
225
|
# Set up transfer objects for input
|
|
@@ -234,7 +227,7 @@ async def open_usb_transport(spec: str) -> Transport:
|
|
|
234
227
|
self.events_in_transfer.setInterrupt(
|
|
235
228
|
self.events_in,
|
|
236
229
|
READ_SIZE,
|
|
237
|
-
callback=self.
|
|
230
|
+
callback=self.transfer_callback,
|
|
238
231
|
user_data=hci.HCI_EVENT_PACKET,
|
|
239
232
|
)
|
|
240
233
|
self.events_in_transfer.submit()
|
|
@@ -243,22 +236,23 @@ async def open_usb_transport(spec: str) -> Transport:
|
|
|
243
236
|
self.acl_in_transfer.setBulk(
|
|
244
237
|
self.acl_in,
|
|
245
238
|
READ_SIZE,
|
|
246
|
-
callback=self.
|
|
239
|
+
callback=self.transfer_callback,
|
|
247
240
|
user_data=hci.HCI_ACL_DATA_PACKET,
|
|
248
241
|
)
|
|
249
242
|
self.acl_in_transfer.submit()
|
|
250
243
|
|
|
251
244
|
self.dequeue_task = self.loop.create_task(self.dequeue())
|
|
252
|
-
self.event_thread.start()
|
|
253
245
|
|
|
254
|
-
|
|
246
|
+
@property
|
|
247
|
+
def usb_transfer_submitted(self):
|
|
248
|
+
return (
|
|
249
|
+
self.events_in_transfer.isSubmitted()
|
|
250
|
+
or self.acl_in_transfer.isSubmitted()
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
def transfer_callback(self, transfer):
|
|
255
254
|
packet_type = transfer.getUserData()
|
|
256
255
|
status = transfer.getStatus()
|
|
257
|
-
# logger.debug(
|
|
258
|
-
# f'<<< USB IN transfer callback: status={status} '
|
|
259
|
-
# f'packet_type={packet_type} '
|
|
260
|
-
# f'length={transfer.getActualLength()}'
|
|
261
|
-
# )
|
|
262
256
|
|
|
263
257
|
# pylint: disable=no-member
|
|
264
258
|
if status == usb1.TRANSFER_COMPLETED:
|
|
@@ -267,18 +261,18 @@ async def open_usb_transport(spec: str) -> Transport:
|
|
|
267
261
|
+ transfer.getBuffer()[: transfer.getActualLength()]
|
|
268
262
|
)
|
|
269
263
|
self.loop.call_soon_threadsafe(self.queue.put_nowait, packet)
|
|
264
|
+
|
|
265
|
+
# Re-submit the transfer so we can receive more data
|
|
266
|
+
transfer.submit()
|
|
270
267
|
elif status == usb1.TRANSFER_CANCELLED:
|
|
271
268
|
self.loop.call_soon_threadsafe(
|
|
272
269
|
self.cancel_done[packet_type].set_result, None
|
|
273
270
|
)
|
|
274
|
-
return
|
|
275
271
|
else:
|
|
276
272
|
logger.warning(
|
|
277
|
-
color(f'!!! transfer not completed: status={status}', 'red')
|
|
273
|
+
color(f'!!! IN transfer not completed: status={status}', 'red')
|
|
278
274
|
)
|
|
279
|
-
|
|
280
|
-
# Re-submit the transfer so we can receive more data
|
|
281
|
-
transfer.submit()
|
|
275
|
+
self.loop.call_soon_threadsafe(self.on_transport_lost)
|
|
282
276
|
|
|
283
277
|
async def dequeue(self):
|
|
284
278
|
while not self.closed:
|
|
@@ -288,21 +282,6 @@ async def open_usb_transport(spec: str) -> Transport:
|
|
|
288
282
|
return
|
|
289
283
|
self.parser.feed_data(packet)
|
|
290
284
|
|
|
291
|
-
def run(self):
|
|
292
|
-
logger.debug('starting USB event loop')
|
|
293
|
-
while (
|
|
294
|
-
self.events_in_transfer.isSubmitted()
|
|
295
|
-
or self.acl_in_transfer.isSubmitted()
|
|
296
|
-
):
|
|
297
|
-
# pylint: disable=no-member
|
|
298
|
-
try:
|
|
299
|
-
self.context.handleEvents()
|
|
300
|
-
except usb1.USBErrorInterrupted:
|
|
301
|
-
pass
|
|
302
|
-
|
|
303
|
-
logger.debug('USB event loop done')
|
|
304
|
-
self.loop.call_soon_threadsafe(self.event_loop_done.set_result, None)
|
|
305
|
-
|
|
306
285
|
def close(self):
|
|
307
286
|
self.closed = True
|
|
308
287
|
|
|
@@ -331,15 +310,14 @@ async def open_usb_transport(spec: str) -> Transport:
|
|
|
331
310
|
f'IN[{packet_type}] transfer likely already completed'
|
|
332
311
|
)
|
|
333
312
|
|
|
334
|
-
# Wait for the thread to terminate
|
|
335
|
-
await self.event_loop_done
|
|
336
|
-
|
|
337
313
|
class UsbTransport(Transport):
|
|
338
314
|
def __init__(self, context, device, interface, setting, source, sink):
|
|
339
315
|
super().__init__(source, sink)
|
|
340
316
|
self.context = context
|
|
341
317
|
self.device = device
|
|
342
318
|
self.interface = interface
|
|
319
|
+
self.loop = asyncio.get_running_loop()
|
|
320
|
+
self.event_loop_done = self.loop.create_future()
|
|
343
321
|
|
|
344
322
|
# Get exclusive access
|
|
345
323
|
device.claimInterface(interface)
|
|
@@ -352,6 +330,22 @@ async def open_usb_transport(spec: str) -> Transport:
|
|
|
352
330
|
source.start()
|
|
353
331
|
sink.start()
|
|
354
332
|
|
|
333
|
+
# Create a thread to process events
|
|
334
|
+
self.event_thread = threading.Thread(target=self.run)
|
|
335
|
+
self.event_thread.start()
|
|
336
|
+
|
|
337
|
+
def run(self):
|
|
338
|
+
logger.debug('starting USB event loop')
|
|
339
|
+
while self.source.usb_transfer_submitted:
|
|
340
|
+
# pylint: disable=no-member
|
|
341
|
+
try:
|
|
342
|
+
self.context.handleEvents()
|
|
343
|
+
except usb1.USBErrorInterrupted:
|
|
344
|
+
pass
|
|
345
|
+
|
|
346
|
+
logger.debug('USB event loop done')
|
|
347
|
+
self.loop.call_soon_threadsafe(self.event_loop_done.set_result, None)
|
|
348
|
+
|
|
355
349
|
async def close(self):
|
|
356
350
|
self.source.close()
|
|
357
351
|
self.sink.close()
|
|
@@ -361,6 +355,9 @@ async def open_usb_transport(spec: str) -> Transport:
|
|
|
361
355
|
self.device.close()
|
|
362
356
|
self.context.close()
|
|
363
357
|
|
|
358
|
+
# Wait for the thread to terminate
|
|
359
|
+
await self.event_loop_done
|
|
360
|
+
|
|
364
361
|
# Find the device according to the spec moniker
|
|
365
362
|
load_libusb()
|
|
366
363
|
context = usb1.USBContext()
|
|
@@ -540,7 +537,7 @@ async def open_usb_transport(spec: str) -> Transport:
|
|
|
540
537
|
except usb1.USBError:
|
|
541
538
|
logger.warning('failed to set configuration')
|
|
542
539
|
|
|
543
|
-
source = UsbPacketSource(
|
|
540
|
+
source = UsbPacketSource(device, device_metadata, acl_in, events_in)
|
|
544
541
|
sink = UsbPacketSink(device, acl_out)
|
|
545
542
|
return UsbTransport(context, device, interface, setting, source, sink)
|
|
546
543
|
except usb1.USBError as error:
|
bumble/utils.py
CHANGED
|
@@ -432,7 +432,7 @@ def wrap_async(function):
|
|
|
432
432
|
|
|
433
433
|
def deprecated(msg: str):
|
|
434
434
|
"""
|
|
435
|
-
Throw deprecation warning before execution
|
|
435
|
+
Throw deprecation warning before execution.
|
|
436
436
|
"""
|
|
437
437
|
|
|
438
438
|
def wrapper(function):
|
|
@@ -444,3 +444,19 @@ def deprecated(msg: str):
|
|
|
444
444
|
return inner
|
|
445
445
|
|
|
446
446
|
return wrapper
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
def experimental(msg: str):
|
|
450
|
+
"""
|
|
451
|
+
Throws a future warning before execution.
|
|
452
|
+
"""
|
|
453
|
+
|
|
454
|
+
def wrapper(function):
|
|
455
|
+
@wraps(function)
|
|
456
|
+
def inner(*args, **kwargs):
|
|
457
|
+
warnings.warn(msg, FutureWarning)
|
|
458
|
+
return function(*args, **kwargs)
|
|
459
|
+
|
|
460
|
+
return inner
|
|
461
|
+
|
|
462
|
+
return wrapper
|
|
@@ -1,48 +1,48 @@
|
|
|
1
1
|
bumble/__init__.py,sha256=Q8jkz6rgl95IMAeInQVt_2GLoJl3DcEP2cxtrQ-ho5c,110
|
|
2
|
-
bumble/_version.py,sha256=
|
|
3
|
-
bumble/a2dp.py,sha256=
|
|
2
|
+
bumble/_version.py,sha256=5oaj9BgfeJteuh4NknBm42CZG1RsQs3FBEs6JGSoHXE,415
|
|
3
|
+
bumble/a2dp.py,sha256=NqdmHIeEe3kThoHqdOgC3Wkywc6H7zqwGbjRYYFtNoQ,22321
|
|
4
4
|
bumble/at.py,sha256=kdrcsx2C8Rg61EWESD2QHwpZntkXkRBJLrPn9auv9K8,2961
|
|
5
5
|
bumble/att.py,sha256=emTsIoc_C067QE3osdyocic52Wr8N5TJdkpZeJJH6dk,31328
|
|
6
|
-
bumble/avdtp.py,sha256=
|
|
6
|
+
bumble/avdtp.py,sha256=dzipF0kXu3OPWVdy347539US9M20n9BeOi37MDvCpaE,77097
|
|
7
7
|
bumble/bridge.py,sha256=T6es5oS1dy8QgkxQ8iOD-YcZ0SWOv8jaqC7TGxqodk4,3003
|
|
8
8
|
bumble/codecs.py,sha256=Vc7FOo6d-6VCgDI0ibnLmX8vCZ4-jtX_-0vEUM-yOrI,15343
|
|
9
9
|
bumble/colors.py,sha256=9H-qzGgMr-YoWdIFpcGPaiRvTvkCzz7FPIkpwqKyKug,3033
|
|
10
10
|
bumble/company_ids.py,sha256=B68e2QPsDeRYP9jjbGs4GGDwEkGxcXGTsON_CHA0uuI,118528
|
|
11
11
|
bumble/controller.py,sha256=9lyDMD836oK5nqvwfjFEQgQ3bTl56qn4kT5ix-HJc8w,45204
|
|
12
12
|
bumble/core.py,sha256=HjRpUseyVsueNkZ-KhPPTf1vNkNnI02eNcaOe685V_0,52949
|
|
13
|
-
bumble/crypto.py,sha256=
|
|
13
|
+
bumble/crypto.py,sha256=o3lzVPeiaPX_aNeeg2Ir-UHiGpNU7Z2VyimKzDwMsHw,9012
|
|
14
14
|
bumble/decoder.py,sha256=N9nMvuVhuwpnfw7EDVuNe9uYY6B6c3RY2dh8RhRPC1U,9608
|
|
15
|
-
bumble/device.py,sha256
|
|
15
|
+
bumble/device.py,sha256=JMRrTiK6ua9tpNRYL_491NpwC0mjBsd3TDBUVzj7Ms4,136996
|
|
16
16
|
bumble/gap.py,sha256=axlOZIv99357Ehq2vMokeioU85z81qdQvplGn0pF70Q,2137
|
|
17
|
-
bumble/gatt.py,sha256=
|
|
18
|
-
bumble/gatt_client.py,sha256=
|
|
17
|
+
bumble/gatt.py,sha256=ASbYauOKyOHgHrN67Ue12MFU1rayqePG5mEI0vaS0SY,38191
|
|
18
|
+
bumble/gatt_client.py,sha256=JuyFUHEc5xd2astr2XCZrTiAla2FoDkKe4lH1oSQOPA,42551
|
|
19
19
|
bumble/gatt_server.py,sha256=pLkydlyqQTyi9g89-WH7tZTIVtOd8gi6bpUn2b-OzAU,36728
|
|
20
|
-
bumble/hci.py,sha256=
|
|
21
|
-
bumble/helpers.py,sha256=
|
|
20
|
+
bumble/hci.py,sha256=Kbu2oESm6Xa3AkdyVzbU64OLzAzHXiQfLTO1tfGfoGo,231749
|
|
21
|
+
bumble/helpers.py,sha256=M7yGMbyI6_ZxIUNZA2krWJXP1qkedVcCOYog1lNPm-M,10084
|
|
22
22
|
bumble/hfp.py,sha256=SzoYpcXgY3LEHVEKUT64PFAJ7G5TZ29hhBbNnW9v8Cs,39067
|
|
23
|
-
bumble/hid.py,sha256=
|
|
23
|
+
bumble/hid.py,sha256=O_FzevrBsCVzuCL5v28NY5VoXmTNQ_4ditW3MYuOaP8,11341
|
|
24
24
|
bumble/host.py,sha256=woncM0_1siA9WKIAVkKjut3dUKiiDJbVzkTj3V3WKIw,36999
|
|
25
25
|
bumble/keys.py,sha256=_ibaJ4CxM5zyxnTp7wnihIQSsEAEkCiPxx9qHsGA04Q,12601
|
|
26
|
-
bumble/l2cap.py,sha256=
|
|
26
|
+
bumble/l2cap.py,sha256=1wtMmpVMAY5Djfo7Rs8pKKU6ulBqutCY7UGvv8Vnfck,80778
|
|
27
27
|
bumble/link.py,sha256=dvb3fdmV8689A4rLhFVHHKMR3u4wQbUapFi-GeheK0M,20220
|
|
28
28
|
bumble/pairing.py,sha256=tgPUba6xNxMi-2plm3xfRlzHq-uPRNZEIGWaN0qNGCs,9853
|
|
29
29
|
bumble/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
30
|
-
bumble/rfcomm.py,sha256=
|
|
31
|
-
bumble/sdp.py,sha256=
|
|
32
|
-
bumble/smp.py,sha256=
|
|
30
|
+
bumble/rfcomm.py,sha256=JufZgWWUvFRQuNQ0qqi5HrDYMU1BzL-z-1ElmkAX76s,33690
|
|
31
|
+
bumble/sdp.py,sha256=D5pG7cuAoFBygdmxExyuRhU4aVsvkWB9WQVnONCU-L0,44854
|
|
32
|
+
bumble/smp.py,sha256=gs6KkgWMbfWJ8-ZEqTAWe3wgqvqe3McSG989bXDvMgs,76261
|
|
33
33
|
bumble/snoop.py,sha256=_QfF36eylBW6Snd-_KYOwKaGiM8i_Ed-B5XoFIPt3Dg,5631
|
|
34
|
-
bumble/utils.py,sha256=
|
|
34
|
+
bumble/utils.py,sha256=yE5w1h11_t7PYq0HUQ9swpXHOs7XC-MTQXFIeTsHVsU,14216
|
|
35
35
|
bumble/apps/README.md,sha256=XTwjRAY-EJWDXpl1V8K3Mw8B7kIqzUIUizRjVBVhoIE,1769
|
|
36
36
|
bumble/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
|
-
bumble/apps/bench.py,sha256=
|
|
37
|
+
bumble/apps/bench.py,sha256=S8J_kRovna_3t3AJMHETjdGxEQH-kK1ipuWNHqVP--4,44220
|
|
38
38
|
bumble/apps/console.py,sha256=Qgv0OYwfriQHyoZ0Wj7qwrpnKzG4juRHkgvp0VdVpec,46069
|
|
39
|
-
bumble/apps/controller_info.py,sha256=
|
|
39
|
+
bumble/apps/controller_info.py,sha256=FCfTalW1vHCp34mzRh78DuFl0os5tULPkcdNQCMaCDI,7157
|
|
40
40
|
bumble/apps/controllers.py,sha256=R6XJ1XpyuXlyqSCmI7PromVIcoYTcYfpmO-TqTYXnUI,2326
|
|
41
41
|
bumble/apps/gatt_dump.py,sha256=-dCvCgjuHAp0h1zxm-gmqB4lVlSdas1Kp4cpzzx4gGw,4245
|
|
42
42
|
bumble/apps/gg_bridge.py,sha256=JdW5QT6xN9c2XDDJoHDRo5W3N_RdVkCtTmlcOsJhlx8,14693
|
|
43
43
|
bumble/apps/hci_bridge.py,sha256=KISv352tKnsQsoxjkDiCQbMFmhnPWdnug5wSFAAXxEs,4033
|
|
44
44
|
bumble/apps/l2cap_bridge.py,sha256=9yjpznRivCtwcO1ivLmEvOAe3fdqyJZLxN82uwZqLiQ,12844
|
|
45
|
-
bumble/apps/pair.py,sha256=
|
|
45
|
+
bumble/apps/pair.py,sha256=vngIbodDbeX5Zt1_mI-OJcgQZOz7xuQDgA4U2Y5a1c0,17588
|
|
46
46
|
bumble/apps/pandora_server.py,sha256=5qaoLCpcZE2KsGO21-7t6Vg4dBjBWbnyOQXwrLhxkuE,1397
|
|
47
47
|
bumble/apps/scan.py,sha256=_fMG_1j1HZQ_8SrJ0ZOxJaWB1OR4mKBaZuQMgm8viYI,7439
|
|
48
48
|
bumble/apps/show.py,sha256=lvy-_u_fRlswBRAd_peXbR9QQFC_NEaygRYFicmAGSg,4738
|
|
@@ -69,6 +69,7 @@ bumble/pandora/utils.py,sha256=Fq4glL0T5cJ2FODoDotmDNdYFOkTOR7DyyL8vkcxp20,3949
|
|
|
69
69
|
bumble/profiles/__init__.py,sha256=yBGC8Ti5LvZuoh1F42XtfrBilb39T77_yuxESZeX2yI,581
|
|
70
70
|
bumble/profiles/asha_service.py,sha256=wKAYgc36a9mBWx9wfIofA2e1fpnErrjHM-U1GfCX9LQ,7200
|
|
71
71
|
bumble/profiles/battery_service.py,sha256=w-uF4jLoDozJOoykimb2RkrKjVyCke6ts2-h-F1PYyc,2292
|
|
72
|
+
bumble/profiles/csip.py,sha256=PQ8A_5pJa2R96g4_wKM4JGgEFuvK7SAjoXS1xDLXt4g,6144
|
|
72
73
|
bumble/profiles/device_information_service.py,sha256=H1Db4BAOnsC-rRtfpoAIsDETYT4F9yM_WgByn_3LfRQ,5658
|
|
73
74
|
bumble/profiles/heart_rate_service.py,sha256=7V2LGcWLp6RurjWxsVgMWr3wPDt5aS9qjNxTbHcOK6o,8575
|
|
74
75
|
bumble/profiles/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -79,7 +80,7 @@ bumble/tools/rtk_util.py,sha256=TwZhupHQrQYsYHLdRGyzXKd24pwCk8kkzqK1Rj2guco,5087
|
|
|
79
80
|
bumble/transport/__init__.py,sha256=Yz2aau52Hi0B6sh06WtfJzMwOYr1Y5VlqjkJCw4hcbA,5901
|
|
80
81
|
bumble/transport/android_emulator.py,sha256=n6nPti0eb6JqPkAj5-fdtiMfSzA2Hgd2q4B1arudIhM,4333
|
|
81
82
|
bumble/transport/android_netsim.py,sha256=SVh-IUZ2bhcIESZFGzOsofybsi4H0qoBRwBieeqUINE,16215
|
|
82
|
-
bumble/transport/common.py,sha256=
|
|
83
|
+
bumble/transport/common.py,sha256=pOnr1GdIQtz8BM7-O3Q4OlEbMs5tfU3Fc9zFo2b62S0,15607
|
|
83
84
|
bumble/transport/file.py,sha256=eVM2V6Nk2nDAFdE7Rt01ZI3JdTovsH9OEU1gKYPJjpE,2010
|
|
84
85
|
bumble/transport/hci_socket.py,sha256=y9hrIY7QIgP994lffJHaAi2jfpC9FCANhzHO5F6k3vk,6377
|
|
85
86
|
bumble/transport/pty.py,sha256=grTl-yvjMWHflNwuME4ccVqDbk6NIEgQMgH6Y9lf1fU,2732
|
|
@@ -89,7 +90,7 @@ bumble/transport/serial.py,sha256=loQxkeG7uE09enXWg2uGbxi6CeG70wn3kzPbEwULKw4,24
|
|
|
89
90
|
bumble/transport/tcp_client.py,sha256=deyUJYpj04QE00Mw_PTU5PHPA6mr1Nui3f5-QCy2zOw,1854
|
|
90
91
|
bumble/transport/tcp_server.py,sha256=hixsSzB-fmzR1yuiHDWd1WhqAia3UA4Cog1Wu6DCLeg,3211
|
|
91
92
|
bumble/transport/udp.py,sha256=di8I6HHACgBx3un-dzAahz9lTIUrh4LdeuYpeoifQEM,2239
|
|
92
|
-
bumble/transport/usb.py,sha256=
|
|
93
|
+
bumble/transport/usb.py,sha256=wSBebCda0VGRKfekCjGVx8ZtBOwJWCkvtIHIA-CEfcw,21024
|
|
93
94
|
bumble/transport/vhci.py,sha256=iI2WpighnvIP5zeyJUFSbjEdmCo24CWMdICamIcyJck,2250
|
|
94
95
|
bumble/transport/ws_client.py,sha256=9gqm5jlVT_H6LfwsQwPpky07CINhgOK96ef53SMAxms,1757
|
|
95
96
|
bumble/transport/ws_server.py,sha256=goe4xx7OnZiJy1a00Bg0CXM8uJhsGXbsijMYq2n62bI,3328
|
|
@@ -126,9 +127,9 @@ bumble/vendor/android/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
|
|
|
126
127
|
bumble/vendor/android/hci.py,sha256=GZrkhaWmcMt1JpnRhv0NoySGkf2H4lNUV2f_omRZW0I,10741
|
|
127
128
|
bumble/vendor/zephyr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
128
129
|
bumble/vendor/zephyr/hci.py,sha256=d83bC0TvT947eN4roFjLkQefWtHOoNsr4xib2ctSkvA,3195
|
|
129
|
-
bumble-0.0.
|
|
130
|
-
bumble-0.0.
|
|
131
|
-
bumble-0.0.
|
|
132
|
-
bumble-0.0.
|
|
133
|
-
bumble-0.0.
|
|
134
|
-
bumble-0.0.
|
|
130
|
+
bumble-0.0.180.dist-info/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
|
|
131
|
+
bumble-0.0.180.dist-info/METADATA,sha256=U4ohfLC-oVuJa-g-Dllxl0QaucDvft6qL2o7O43T3Sw,5681
|
|
132
|
+
bumble-0.0.180.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
|
133
|
+
bumble-0.0.180.dist-info/entry_points.txt,sha256=AjCwgm9SvZDOhV7T6jWwAhWdE728pd759LQCscMLjnM,765
|
|
134
|
+
bumble-0.0.180.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
|
|
135
|
+
bumble-0.0.180.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|