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.
@@ -150,7 +150,7 @@ class PacketParser:
150
150
  try:
151
151
  self.sink.on_packet(bytes(self.packet))
152
152
  except Exception as error:
153
- logger.warning(
153
+ logger.exception(
154
154
  color(f'!!! Exception in on_packet: {error}', 'red')
155
155
  )
156
156
  self.reset()
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 .. import hci
29
- from ..colors import color
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.transfer = device.getTransfer()
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 on_packet_sent(self, transfer):
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.on_packet_sent_)
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'!!! out transfer not completed: status={status}', 'red')
151
+ color(f'!!! OUT transfer not completed: status={status}', 'red')
152
152
  )
153
153
 
154
- def on_packet_sent_(self):
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.transfer.setBulk(
167
- self.acl_out, packet[1:], callback=self.on_packet_sent
166
+ self.acl_out_transfer.setBulk(
167
+ self.acl_out, packet[1:], callback=self.transfer_callback
168
168
  )
169
- logger.debug('submit ACL')
170
- self.transfer.submit()
169
+ self.acl_out_transfer.submit()
171
170
  elif packet_type == hci.HCI_COMMAND_PACKET:
172
- self.transfer.setControl(
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.on_packet_sent,
177
+ callback=self.transfer_callback,
179
178
  )
180
- logger.debug('submit COMMAND')
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.transfer.isSubmitted():
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.transfer.cancel()
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, context, device, metadata, acl_in, events_in):
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.events_in_transfer = None
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.on_packet_received,
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.on_packet_received,
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
- def on_packet_received(self, transfer):
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(context, device, device_metadata, acl_in, events_in)
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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bumble
3
- Version: 0.0.178
3
+ Version: 0.0.180
4
4
  Summary: Bluetooth Stack for Apps, Emulation, Test and Experimentation
5
5
  Home-page: https://github.com/google/bumble
6
6
  Author: Google
@@ -1,48 +1,48 @@
1
1
  bumble/__init__.py,sha256=Q8jkz6rgl95IMAeInQVt_2GLoJl3DcEP2cxtrQ-ho5c,110
2
- bumble/_version.py,sha256=oeRqM76MS9ESj-3axJ76NyjX8YlgZiBTm8xERkIErD0,415
3
- bumble/a2dp.py,sha256=vwnKknvSKPR7IdTz8JHHNvHGObjepVy1kFRWm0kNWEI,21923
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=AvFZI4t8UZdLH1SLAKDTHlV0iPoJERZeMz5o86cWioU,77125
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=p0vF495jp9Kak5ILE11D2XaaHGiGuWLSutprglbOvHM,8543
13
+ bumble/crypto.py,sha256=o3lzVPeiaPX_aNeeg2Ir-UHiGpNU7Z2VyimKzDwMsHw,9012
14
14
  bumble/decoder.py,sha256=N9nMvuVhuwpnfw7EDVuNe9uYY6B6c3RY2dh8RhRPC1U,9608
15
- bumble/device.py,sha256=-Ijj4LoKMhmyEmdpOAjnYqkq4WUgsn56kpwGgbP4AIw,127251
15
+ bumble/device.py,sha256=JMRrTiK6ua9tpNRYL_491NpwC0mjBsd3TDBUVzj7Ms4,136996
16
16
  bumble/gap.py,sha256=axlOZIv99357Ehq2vMokeioU85z81qdQvplGn0pF70Q,2137
17
- bumble/gatt.py,sha256=PtyDIsswJrp8g96E_Hrp7HzvLe9DEv2YBO6yIEDQ5sg,28625
18
- bumble/gatt_client.py,sha256=c7QzKx2sxJv7ZHq1cDsJSnnQpTPnuX9OZ-PNpmcwEKE,41493
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=MLMegx1aKDdyXshA8_t_qS61IXhzqFg_LKaAAyv-oJw,223841
21
- bumble/helpers.py,sha256=AgtOigAqQzzTEMMwHQJ2EO7dOTp77qhnyfHQ2LCDd-k,8896
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=KweIok93M0ezXzFfn524cAYANDbMjSrreQ1K32e2h-k,11398
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=nq3llrPHgeeFGvHVqaLdR6gcYgkRq6vD81BsVOwCQ3Y,80666
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=PQKdBcPgHj8qhI-X96o6U9L_wVEDmup-1hcmHLN1Nc4,33735
31
- bumble/sdp.py,sha256=7laEFg01UuB1CYvGgJnQJ77g4Jmg3BIykK-I3i1iueg,44857
32
- bumble/smp.py,sha256=RBdZK4qhsSD3lK9GRyoPhD7AHJCrGs1LZCZJDxXiWB8,75532
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=IGkvoTbB1328pjsnhlnaJeo1vphUFUAaM8AG6voIfqk,13901
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=DkOiAnRdOT1K21wHa77czfztE_w90Ueb4ZxSpn6Om9U,38708
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=uMIKrTgfFyLBQ8yl6ymy06QgQVOtilNgmXjvZJ38LbY,6541
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=1BqYHDj2cK-4piKbHqhQkKsSoCAqWv2dKjqhhqb6510,17366
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=WRAj8VPUGHx_xys1-vLfVXRcTO84pSSbRYwBdBERg1Q,15605
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=GJ1CmQMarg6C6Lp0PfGZJ4Erp-7ucBf9IWSeBkjvC3g,21115
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.178.dist-info/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
130
- bumble-0.0.178.dist-info/METADATA,sha256=SRSIsXyutsjGr3Bo8bK-xZrgGRx64-DYWFXzctOqyd0,5681
131
- bumble-0.0.178.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
132
- bumble-0.0.178.dist-info/entry_points.txt,sha256=AjCwgm9SvZDOhV7T6jWwAhWdE728pd759LQCscMLjnM,765
133
- bumble-0.0.178.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
134
- bumble-0.0.178.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.3)
2
+ Generator: bdist_wheel (0.42.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5