bumble 0.0.202__py3-none-any.whl → 0.0.204__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.
@@ -0,0 +1,154 @@
1
+ # Copyright 2024 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ # -----------------------------------------------------------------------------
16
+ # Imports
17
+ # -----------------------------------------------------------------------------
18
+ import logging
19
+ import asyncio
20
+ import os
21
+ from typing import Any, Optional
22
+
23
+ import click
24
+
25
+ from bumble.colors import color
26
+ from bumble import transport
27
+ from bumble.drivers import intel
28
+ from bumble.host import Host
29
+
30
+ # -----------------------------------------------------------------------------
31
+ # Logging
32
+ # -----------------------------------------------------------------------------
33
+ logger = logging.getLogger(__name__)
34
+
35
+
36
+ # -----------------------------------------------------------------------------
37
+ def print_device_info(device_info: dict[intel.ValueType, Any]) -> None:
38
+ if (mode := device_info.get(intel.ValueType.CURRENT_MODE_OF_OPERATION)) is not None:
39
+ print(
40
+ color("MODE:", "yellow"),
41
+ mode.name,
42
+ )
43
+ print(color("DETAILS:", "yellow"))
44
+ for key, value in device_info.items():
45
+ print(f" {color(key.name, 'green')}: {value}")
46
+
47
+
48
+ # -----------------------------------------------------------------------------
49
+ async def get_driver(host: Host, force: bool) -> Optional[intel.Driver]:
50
+ # Create a driver
51
+ driver = await intel.Driver.for_host(host, force)
52
+ if driver is None:
53
+ print("Device does not appear to be an Intel device")
54
+ return None
55
+
56
+ return driver
57
+
58
+
59
+ # -----------------------------------------------------------------------------
60
+ async def do_info(usb_transport, force):
61
+ async with await transport.open_transport(usb_transport) as (
62
+ hci_source,
63
+ hci_sink,
64
+ ):
65
+ host = Host(hci_source, hci_sink)
66
+ driver = await get_driver(host, force)
67
+ if driver is None:
68
+ return
69
+
70
+ # Get and print the device info
71
+ print_device_info(await driver.read_device_info())
72
+
73
+
74
+ # -----------------------------------------------------------------------------
75
+ async def do_load(usb_transport: str, force: bool) -> None:
76
+ async with await transport.open_transport(usb_transport) as (
77
+ hci_source,
78
+ hci_sink,
79
+ ):
80
+ host = Host(hci_source, hci_sink)
81
+ driver = await get_driver(host, force)
82
+ if driver is None:
83
+ return
84
+
85
+ # Reboot in bootloader mode
86
+ await driver.load_firmware()
87
+
88
+ # Get and print the device info
89
+ print_device_info(await driver.read_device_info())
90
+
91
+
92
+ # -----------------------------------------------------------------------------
93
+ async def do_bootloader(usb_transport: str, force: bool) -> None:
94
+ async with await transport.open_transport(usb_transport) as (
95
+ hci_source,
96
+ hci_sink,
97
+ ):
98
+ host = Host(hci_source, hci_sink)
99
+ driver = await get_driver(host, force)
100
+ if driver is None:
101
+ return
102
+
103
+ # Reboot in bootloader mode
104
+ await driver.reboot_bootloader()
105
+
106
+
107
+ # -----------------------------------------------------------------------------
108
+ @click.group()
109
+ def main():
110
+ logging.basicConfig(level=os.environ.get('BUMBLE_LOGLEVEL', 'INFO').upper())
111
+
112
+
113
+ @main.command
114
+ @click.argument("usb_transport")
115
+ @click.option(
116
+ "--force",
117
+ is_flag=True,
118
+ default=False,
119
+ help="Try to get the device info even if the USB info doesn't match",
120
+ )
121
+ def info(usb_transport, force):
122
+ """Get the firmware info."""
123
+ asyncio.run(do_info(usb_transport, force))
124
+
125
+
126
+ @main.command
127
+ @click.argument("usb_transport")
128
+ @click.option(
129
+ "--force",
130
+ is_flag=True,
131
+ default=False,
132
+ help="Load even if the USB info doesn't match",
133
+ )
134
+ def load(usb_transport, force):
135
+ """Load a firmware image."""
136
+ asyncio.run(do_load(usb_transport, force))
137
+
138
+
139
+ @main.command
140
+ @click.argument("usb_transport")
141
+ @click.option(
142
+ "--force",
143
+ is_flag=True,
144
+ default=False,
145
+ help="Attempt to reboot event if the USB info doesn't match",
146
+ )
147
+ def bootloader(usb_transport, force):
148
+ """Reboot in bootloader mode."""
149
+ asyncio.run(do_bootloader(usb_transport, force))
150
+
151
+
152
+ # -----------------------------------------------------------------------------
153
+ if __name__ == '__main__':
154
+ main()
bumble/transport/usb.py CHANGED
@@ -149,7 +149,10 @@ async def open_usb_transport(spec: str) -> Transport:
149
149
 
150
150
  if status != usb1.TRANSFER_COMPLETED:
151
151
  logger.warning(
152
- color(f'!!! OUT transfer not completed: status={status}', 'red')
152
+ color(
153
+ f'!!! OUT transfer not completed: status={status}',
154
+ 'red',
155
+ )
153
156
  )
154
157
 
155
158
  async def process_queue(self):
@@ -275,7 +278,10 @@ async def open_usb_transport(spec: str) -> Transport:
275
278
  )
276
279
  else:
277
280
  logger.warning(
278
- color(f'!!! IN transfer not completed: status={status}', 'red')
281
+ color(
282
+ f'!!! IN[{packet_type}] transfer not completed: status={status}',
283
+ 'red',
284
+ )
279
285
  )
280
286
  self.loop.call_soon_threadsafe(self.on_transport_lost)
281
287
 
bumble/utils.py CHANGED
@@ -24,17 +24,19 @@ import logging
24
24
  import sys
25
25
  import warnings
26
26
  from typing import (
27
+ Any,
27
28
  Awaitable,
28
- Set,
29
- TypeVar,
30
- List,
31
- Tuple,
32
29
  Callable,
33
- Any,
30
+ List,
34
31
  Optional,
32
+ Protocol,
33
+ Set,
34
+ Tuple,
35
+ TypeVar,
35
36
  Union,
36
37
  overload,
37
38
  )
39
+ from typing_extensions import Self
38
40
 
39
41
  from pyee import EventEmitter
40
42
 
@@ -487,3 +489,16 @@ class OpenIntEnum(enum.IntEnum):
487
489
  obj._value_ = value
488
490
  obj._name_ = f"{cls.__name__}[{value}]"
489
491
  return obj
492
+
493
+
494
+ # -----------------------------------------------------------------------------
495
+ class ByteSerializable(Protocol):
496
+ """
497
+ Type protocol for classes that can be instantiated from bytes and serialized
498
+ to bytes.
499
+ """
500
+
501
+ @classmethod
502
+ def from_bytes(cls, data: bytes) -> Self: ...
503
+
504
+ def __bytes__(self) -> bytes: ...
@@ -16,6 +16,7 @@
16
16
  # Imports
17
17
  # -----------------------------------------------------------------------------
18
18
  import struct
19
+ from typing import Dict, Optional, Type
19
20
 
20
21
  from bumble.hci import (
21
22
  name_or_number,
@@ -24,7 +25,9 @@ from bumble.hci import (
24
25
  HCI_Constant,
25
26
  HCI_Object,
26
27
  HCI_Command,
27
- HCI_Vendor_Event,
28
+ HCI_Event,
29
+ HCI_Extended_Event,
30
+ HCI_VENDOR_EVENT,
28
31
  STATUS_SPEC,
29
32
  )
30
33
 
@@ -48,7 +51,6 @@ HCI_DYNAMIC_AUDIO_BUFFER_COMMAND = hci_vendor_command_op_code(0x15F)
48
51
  HCI_BLUETOOTH_QUALITY_REPORT_EVENT = 0x58
49
52
 
50
53
  HCI_Command.register_commands(globals())
51
- HCI_Vendor_Event.register_subevents(globals())
52
54
 
53
55
 
54
56
  # -----------------------------------------------------------------------------
@@ -279,7 +281,29 @@ class HCI_Dynamic_Audio_Buffer_Command(HCI_Command):
279
281
 
280
282
 
281
283
  # -----------------------------------------------------------------------------
282
- @HCI_Vendor_Event.event(
284
+ class HCI_Android_Vendor_Event(HCI_Extended_Event):
285
+ event_code: int = HCI_VENDOR_EVENT
286
+ subevent_classes: Dict[int, Type[HCI_Extended_Event]] = {}
287
+
288
+ @classmethod
289
+ def subclass_from_parameters(
290
+ cls, parameters: bytes
291
+ ) -> Optional[HCI_Extended_Event]:
292
+ subevent_code = parameters[0]
293
+ if subevent_code == HCI_BLUETOOTH_QUALITY_REPORT_EVENT:
294
+ quality_report_id = parameters[1]
295
+ if quality_report_id in (0x01, 0x02, 0x03, 0x04, 0x07, 0x08, 0x09):
296
+ return HCI_Bluetooth_Quality_Report_Event.from_parameters(parameters)
297
+
298
+ return None
299
+
300
+
301
+ HCI_Android_Vendor_Event.register_subevents(globals())
302
+ HCI_Event.vendor_factory = HCI_Android_Vendor_Event.subclass_from_parameters
303
+
304
+
305
+ # -----------------------------------------------------------------------------
306
+ @HCI_Extended_Event.event(
283
307
  fields=[
284
308
  ('quality_report_id', 1),
285
309
  ('packet_types', 1),
@@ -308,10 +332,11 @@ class HCI_Dynamic_Audio_Buffer_Command(HCI_Command):
308
332
  ('tx_last_subevent_packets', 4),
309
333
  ('crc_error_packets', 4),
310
334
  ('rx_duplicate_packets', 4),
335
+ ('rx_unreceived_packets', 4),
311
336
  ('vendor_specific_parameters', '*'),
312
337
  ]
313
338
  )
314
- class HCI_Bluetooth_Quality_Report_Event(HCI_Vendor_Event):
339
+ class HCI_Bluetooth_Quality_Report_Event(HCI_Android_Vendor_Event):
315
340
  # pylint: disable=line-too-long
316
341
  '''
317
342
  See https://source.android.com/docs/core/connect/bluetooth/hci_requirements#bluetooth-quality-report-sub-event
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bumble
3
- Version: 0.0.202
3
+ Version: 0.0.204
4
4
  Summary: Bluetooth Stack for Apps, Emulation, Test and Experimentation
5
5
  Home-page: https://github.com/google/bumble
6
6
  Author: Google
@@ -8,29 +8,31 @@ Author-email: tbd@tbd.com
8
8
  Requires-Python: >=3.8
9
9
  Description-Content-Type: text/markdown
10
10
  License-File: LICENSE
11
- Requires-Dist: pyee>=8.2.2
12
11
  Requires-Dist: aiohttp~=3.8; platform_system != "Emscripten"
13
12
  Requires-Dist: appdirs>=1.4; platform_system != "Emscripten"
14
13
  Requires-Dist: click>=8.1.3; platform_system != "Emscripten"
15
14
  Requires-Dist: cryptography==39; platform_system != "Emscripten"
15
+ Requires-Dist: cryptography>=39.0; platform_system == "Emscripten"
16
16
  Requires-Dist: grpcio>=1.62.1; platform_system != "Emscripten"
17
17
  Requires-Dist: humanize>=4.6.0; platform_system != "Emscripten"
18
18
  Requires-Dist: libusb1>=2.0.1; platform_system != "Emscripten"
19
19
  Requires-Dist: libusb-package==1.0.26.1; platform_system != "Emscripten"
20
20
  Requires-Dist: platformdirs>=3.10.0; platform_system != "Emscripten"
21
- Requires-Dist: prompt-toolkit>=3.0.16; platform_system != "Emscripten"
21
+ Requires-Dist: prompt_toolkit>=3.0.16; platform_system != "Emscripten"
22
22
  Requires-Dist: prettytable>=3.6.0; platform_system != "Emscripten"
23
23
  Requires-Dist: protobuf>=3.12.4; platform_system != "Emscripten"
24
+ Requires-Dist: pyee>=8.2.2
24
25
  Requires-Dist: pyserial-asyncio>=0.5; platform_system != "Emscripten"
25
26
  Requires-Dist: pyserial>=3.5; platform_system != "Emscripten"
26
27
  Requires-Dist: pyusb>=1.2; platform_system != "Emscripten"
27
- Requires-Dist: websockets>=12.0; platform_system != "Emscripten"
28
- Requires-Dist: cryptography>=39.0; platform_system == "Emscripten"
29
- Provides-Extra: avatar
30
- Requires-Dist: pandora-avatar==0.0.10; extra == "avatar"
31
- Requires-Dist: rootcanal==1.10.0; python_version >= "3.10" and extra == "avatar"
28
+ Requires-Dist: websockets==13.1; platform_system != "Emscripten"
32
29
  Provides-Extra: build
33
30
  Requires-Dist: build>=0.7; extra == "build"
31
+ Provides-Extra: test
32
+ Requires-Dist: pytest>=8.2; extra == "test"
33
+ Requires-Dist: pytest-asyncio>=0.23.5; extra == "test"
34
+ Requires-Dist: pytest-html>=3.2.0; extra == "test"
35
+ Requires-Dist: coverage>=6.4; extra == "test"
34
36
  Provides-Extra: development
35
37
  Requires-Dist: black==24.3; extra == "development"
36
38
  Requires-Dist: grpcio-tools>=1.62.1; extra == "development"
@@ -44,17 +46,15 @@ Requires-Dist: types-appdirs>=1.4.3; extra == "development"
44
46
  Requires-Dist: types-invoke>=1.7.3; extra == "development"
45
47
  Requires-Dist: types-protobuf>=4.21.0; extra == "development"
46
48
  Requires-Dist: wasmtime==20.0.0; extra == "development"
49
+ Provides-Extra: avatar
50
+ Requires-Dist: pandora-avatar==0.0.10; extra == "avatar"
51
+ Requires-Dist: rootcanal==1.10.0; python_version >= "3.10" and extra == "avatar"
52
+ Provides-Extra: pandora
53
+ Requires-Dist: bt-test-interfaces>=0.0.6; extra == "pandora"
47
54
  Provides-Extra: documentation
48
55
  Requires-Dist: mkdocs>=1.4.0; extra == "documentation"
49
56
  Requires-Dist: mkdocs-material>=8.5.6; extra == "documentation"
50
57
  Requires-Dist: mkdocstrings[python]>=0.19.0; extra == "documentation"
51
- Provides-Extra: pandora
52
- Requires-Dist: bt-test-interfaces>=0.0.6; extra == "pandora"
53
- Provides-Extra: test
54
- Requires-Dist: pytest>=8.2; extra == "test"
55
- Requires-Dist: pytest-asyncio>=0.23.5; extra == "test"
56
- Requires-Dist: pytest-html>=3.2.0; extra == "test"
57
- Requires-Dist: coverage>=6.4; extra == "test"
58
58
 
59
59
 
60
60
  _ _ _
@@ -1,8 +1,8 @@
1
1
  bumble/__init__.py,sha256=Q8jkz6rgl95IMAeInQVt_2GLoJl3DcEP2cxtrQ-ho5c,110
2
- bumble/_version.py,sha256=0o3Qq5M65Ds-43dG5u5R1z10hjSzTudi88nO90cBlv4,415
2
+ bumble/_version.py,sha256=n5ktSh8mCejNRET9dKyuhe_YV1jcfTv4sgbvbDB1N4U,415
3
3
  bumble/a2dp.py,sha256=_dCq-qyG5OglDVlaOFwAgFe_ugvHuEdEYL-kWFf6sWQ,31775
4
4
  bumble/at.py,sha256=Giu2VUSJKH-jIh10lOfumiqy-FyO99Ra6nJ7UiWQ0H8,3114
5
- bumble/att.py,sha256=jFUcIDP3JYYdazWAVynGy0pcgNOzsldRzoBhhOkLCRI,32767
5
+ bumble/att.py,sha256=XyVtZ7AXbuperIm_uqMSN2haXYU_nPcXVz7HXGlex-Q,32567
6
6
  bumble/avc.py,sha256=cO1-8x7BvuBCQVJg-9nTibkLFC4y0_2SNERZ8_7Kn_c,16407
7
7
  bumble/avctp.py,sha256=yHAjJRjLGtR0Q-iWcLS7cJRz5Jr2YiRmZd6LZV4Xjt4,9935
8
8
  bumble/avdtp.py,sha256=2ki_BE4SHiu3Sx9oHCknfjF-bBcgPB9TsyF5upciUYI,76773
@@ -11,35 +11,35 @@ bumble/bridge.py,sha256=T6es5oS1dy8QgkxQ8iOD-YcZ0SWOv8jaqC7TGxqodk4,3003
11
11
  bumble/codecs.py,sha256=75TGfq-XWWtr-mCRRG7QzJYNRebG50Ypt_QGQkoWlxU,20915
12
12
  bumble/colors.py,sha256=CC5tBDnN86bvlbYf1KIVdyj7QBLaqEDT_hQVB0p7FeU,3118
13
13
  bumble/company_ids.py,sha256=B68e2QPsDeRYP9jjbGs4GGDwEkGxcXGTsON_CHA0uuI,118528
14
- bumble/controller.py,sha256=XkYTQb2J5MhH_dGfnFkrLXdChFD2s1wSvqXaHQFeo48,59688
14
+ bumble/controller.py,sha256=biUkQisEZOc9-TGkUXYPes1RONA6TizKwDYIQWJx_7A,61593
15
15
  bumble/core.py,sha256=T43ZszjsU_89B0UJwQ9GCzvKU7oj1_RBzsdGr9jX9xY,72440
16
16
  bumble/crypto.py,sha256=L6z3dn9-dgKYRtOM6O3F6n6Ju4PwTM3LAFJtCg_ie78,9382
17
17
  bumble/decoder.py,sha256=0-VNWZT-u7lvK3qBpAuYT0M6Rz_bMgMi4CjfUXX_6RM,9728
18
- bumble/device.py,sha256=vroAnNWlBW6_jw1KgmoG4ZWKyauLm8abS1XFrTX084Y,195024
18
+ bumble/device.py,sha256=BuVejCWditUcMzTM1RBOC-mHdu9tNMOv0AyeCp_iX9E,194628
19
19
  bumble/gap.py,sha256=dRU2_TWvqTDx80hxeSbXlWIeWvptWH4_XbItG5y948Q,2138
20
- bumble/gatt.py,sha256=a07mQ3O0LFt5zgUzSUwa4Jak_FXOXSFX-njxnQNS_zY,39014
21
- bumble/gatt_client.py,sha256=2Y9rp5kn-aPC2aC0maiWmvrixcWvCWSktgEdjj_xr5w,43202
22
- bumble/gatt_server.py,sha256=pafGMeAuGAAELnr_1pB_l3CcR5u4H4Y1-MRHjN53gdE,37449
23
- bumble/hci.py,sha256=e2JqP-D1h7b7vHxFbmdsLJtOacdiuMizzGgBWmCAhxQ,286058
20
+ bumble/gatt.py,sha256=y4E_6AmPBXa5mhnbqzJBM9Nqw7eTE45TmxeGM3nRJZ4,39693
21
+ bumble/gatt_client.py,sha256=Nb6xxQUDB68T7qF4GzlIPeER2SlroSGXbECZeSmzU4A,43190
22
+ bumble/gatt_server.py,sha256=cRIvPUrfTa8Kwn6KWsTzC33-AVoAPNzEMbXWbk_I6N4,37516
23
+ bumble/hci.py,sha256=eaxR0BiMe_Qo5edE2Vh6GQM0_utr3013yJWvZsJZyaA,290509
24
24
  bumble/helpers.py,sha256=m0w4UgFFNDEnXwHrDyfRlcBObdVed2fqXGL0lvR3c8s,12733
25
- bumble/hfp.py,sha256=h5IcgxKnlFWapeJHcNDTvxup9oAE5CcZju92sOusTGc,75619
25
+ bumble/hfp.py,sha256=UDqB-z5nEzLgRojJeC6TbFRaPXV3Ht0jvQV03ksyiLU,75749
26
26
  bumble/hid.py,sha256=hJKm6qhNa0kQTGmp_VxNh3-ywgBDdJpPPFcvtFiRL0A,20335
27
- bumble/host.py,sha256=pPH7HTQ6ogOToj4Y5Jl985MKjbVlG_jeOcJrV0NTSqU,49204
27
+ bumble/host.py,sha256=8Yi7BV99HBP2cYb-00PKVscfgTcOfQHcXgSy1OltctE,49282
28
28
  bumble/keys.py,sha256=WbIQ7Ob81mW75qmEPQ2rBLfnqBMA-ts2yowWXP9UaCY,12654
29
- bumble/l2cap.py,sha256=PJxoXV6h1hhHlkKKY3KGuF8l3HTpV-C-mAE6jfTkLY4,81421
29
+ bumble/l2cap.py,sha256=VT0mv3S6fzVhF1ouahykTmKBbEKDc9DfH0qoKmPH8ZE,81291
30
30
  bumble/link.py,sha256=SU7Ls2Lyg1XuY8x6yP9tAC83SYmMTU2a-vQ_CWCfq90,24107
31
- bumble/pairing.py,sha256=tgPUba6xNxMi-2plm3xfRlzHq-uPRNZEIGWaN0qNGCs,9853
31
+ bumble/pairing.py,sha256=OJ3mzv46iTtv8P0mZb3PEDUzTemlcIADPMah21jeSyA,10008
32
32
  bumble/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  bumble/rfcomm.py,sha256=dh5t5vlDEfw3yHgQfzegMYPnShP8Zo-3ScABUvmXNLI,40751
34
34
  bumble/rtp.py,sha256=388X3aCv-QrWJ37r_VPqXYJtvNGWPsHnJasqs41g_-s,3487
35
- bumble/sdp.py,sha256=I45-qVmFcdRVd65iBuYTwrlKZX_AXAjnXrj4wjLR2co,45554
36
- bumble/smp.py,sha256=Mc2q_tG3_ATJDrx5ZkPpNI7g6h6g1vRvH8OOQDbI39c,77685
35
+ bumble/sdp.py,sha256=bztdDr7cYUA5sSL1SWe7rhgVjMCoUnc2bA4tdkwJQcE,45446
36
+ bumble/smp.py,sha256=wW8Mff0uQyl5GiP8IeDUOwOurf5Bb8MW72zrfi9ULQ8,77855
37
37
  bumble/snoop.py,sha256=1mzwmp9LToUXbPnFsLrt8S4UHs0kqzbu7LDydwbmkZI,5715
38
- bumble/utils.py,sha256=e0i-4d28-9zP3gYcd1rdNd669rkPnRs5oJCERUEDfxo,15099
38
+ bumble/utils.py,sha256=JDTeN0dBteWM8rZdY253LNt5K2L0UA-6r0MpdTmAz14,15482
39
39
  bumble/apps/README.md,sha256=XTwjRAY-EJWDXpl1V8K3Mw8B7kIqzUIUizRjVBVhoIE,1769
40
40
  bumble/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- bumble/apps/auracast.py,sha256=hrG6dW79UkMXqcMLgYjziWEjcVibFUITvjPb4LX1lxM,24686
42
- bumble/apps/bench.py,sha256=RitVnx9mzmW-1cB4O7wan-lQeFDlazdjTW-BQcuTDb0,58410
41
+ bumble/apps/auracast.py,sha256=zSsduDSTOa6Tf5qnty_nHyrOYFKjlYWyAz4zDNXA_uQ,25065
42
+ bumble/apps/bench.py,sha256=PjtOR3f1rtz0Qh3opem0CXu26xTFNcHJiO5_1uPjyHQ,58469
43
43
  bumble/apps/ble_rpa_tool.py,sha256=ZQtsbfnLPd5qUAkEBPpNgJLRynBBc7q_9cDHKUW2SQ0,1701
44
44
  bumble/apps/console.py,sha256=rwD9y3g8Mm_mAEvrcXjbtcv5d8mwF3yTbmE6Vet2BEk,45300
45
45
  bumble/apps/controller_info.py,sha256=WScuK5Ytp5aFEosAcgRTCEeey6SmxDFmyB7KBhgVx6s,11759
@@ -48,16 +48,16 @@ bumble/apps/controllers.py,sha256=R6XJ1XpyuXlyqSCmI7PromVIcoYTcYfpmO-TqTYXnUI,23
48
48
  bumble/apps/device_info.py,sha256=kQSO7F60cmUKw99LHfyly9s_ox2mD0dNGsgxCnKoFOQ,7999
49
49
  bumble/apps/gatt_dump.py,sha256=wwA-NhRnbgUkbj-Ukym7NDG2j2n_36t_tn93dLDVdIg,4487
50
50
  bumble/apps/gg_bridge.py,sha256=JdW5QT6xN9c2XDDJoHDRo5W3N_RdVkCtTmlcOsJhlx8,14693
51
- bumble/apps/hci_bridge.py,sha256=KISv352tKnsQsoxjkDiCQbMFmhnPWdnug5wSFAAXxEs,4033
51
+ bumble/apps/hci_bridge.py,sha256=0mO36AO3ea0yrrTaYuySc7Un5NTuvVn08ItXvJql3CQ,4029
52
52
  bumble/apps/l2cap_bridge.py,sha256=524VgEmgCP4g7T0UdgmsePmNVhDFRJECeaZ_uzKsbco,13062
53
- bumble/apps/pair.py,sha256=NtDxLfdnlOY_ZEtVNGVXWjv6_x_hndok_ydhV6zkFtI,18503
53
+ bumble/apps/pair.py,sha256=cZovlR4alLGCruS4Iy_dcJkJchIoV4vNwcNyycWLhxw,18591
54
54
  bumble/apps/pandora_server.py,sha256=5qaoLCpcZE2KsGO21-7t6Vg4dBjBWbnyOQXwrLhxkuE,1397
55
55
  bumble/apps/rfcomm_bridge.py,sha256=bAdDz84YpYkEfZ6vanQ_VUEpEF4MS4Y9fmbXB4bhoi4,17633
56
56
  bumble/apps/scan.py,sha256=b6hIppiJqDfR7VFW2wl3-lkPdFvHLqYZKY8VjjNnhls,8366
57
- bumble/apps/show.py,sha256=8w0-8jLtN6IM6_58pOHbEmE1Rmxm71O48ACrXixC2jk,6218
57
+ bumble/apps/show.py,sha256=ELp1nEZBCIp1vK-pbjguqjEC8e-In5m-WMbKl_K6Jsk,6232
58
58
  bumble/apps/unbond.py,sha256=LDPWpmgKLMGYDdIFGTdGciFDcUliZ0OmseEbGfJ-MAM,3176
59
59
  bumble/apps/usb_probe.py,sha256=zJqrqKSGVYcOntXzgONdluZDE6jfj3IwPNuLqmDPDsU,10351
60
- bumble/apps/lea_unicast/app.py,sha256=7hK3s5I0vHneECo01UpVoP10LcEcMRIHjmO35lMhNwY,20659
60
+ bumble/apps/lea_unicast/app.py,sha256=3WnSApFcLzjpZXmU7kYlX54vApDpFEiF6exJFWbJkOI,21469
61
61
  bumble/apps/lea_unicast/index.html,sha256=d1IHsYd8TGOnxNZKaHolf4Y-7VwT1kO9Z72vpGMdy3k,2354
62
62
  bumble/apps/lea_unicast/liblc3.wasm,sha256=nYMzG9fP8_71K9dQfVI9QPQPkFRPHoqZEEExs1y6Oac,158603
63
63
  bumble/apps/link_relay/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -71,30 +71,30 @@ bumble/apps/speaker/speaker.html,sha256=kfAZ5oZSFc9ygBFIUuZEn5LUNQnHBvrnuHU6VApt
71
71
  bumble/apps/speaker/speaker.js,sha256=DrT831yg3oBXKZ5usnfZjRU9X6Nw3zjIWSkz6sIgVtw,9373
72
72
  bumble/apps/speaker/speaker.py,sha256=OTqygA9VbQW_XxTxqxS0vRW_wvhnKHssSxDz1lQZ9ZU,24763
73
73
  bumble/drivers/__init__.py,sha256=lxqJTghh21rQFThRTurwLysZm385TUcn8ZdpHQSWD88,3196
74
- bumble/drivers/common.py,sha256=pS783hudolLZAzF8IUWp7g6TXyQsUCEzqCsd1VGeYfQ,1507
75
- bumble/drivers/intel.py,sha256=-YcJI4ZC_fhHHxWyE8b4eB8V7suOFH1n9uayckGE9Uw,3231
74
+ bumble/drivers/common.py,sha256=HZWILnQ0P5StGuhpeU7qj-0pqBvMGyOXrZv2J56_ACE,1532
75
+ bumble/drivers/intel.py,sha256=vd8O_blmgUEi_eJx4Ixaa_TpZDTXpfbbCt9sRr1GlJM,22759
76
76
  bumble/drivers/rtk.py,sha256=nsfAqNzvxvAwbh6UYgxOCSNwgw7XouIBFA03FrLTs4M,22088
77
77
  bumble/pandora/__init__.py,sha256=jaPtYCLfLeLUGj8-TmS3Gkv0l1_DBadYj8ZMAPLPAao,3463
78
78
  bumble/pandora/config.py,sha256=KD85n3oRbuvD65sRah2H0gpxEW4YbD7HbYbsxdcpDDA,2388
79
79
  bumble/pandora/device.py,sha256=LFqCWrgYkQWrFUSKArsAABXkge8sB2DhvaQoEsC4Jn0,5344
80
- bumble/pandora/host.py,sha256=LnEQ3DJAhmJVgHA7VyokvypQejsi2VcbauSFYn1a9Jk,39235
80
+ bumble/pandora/host.py,sha256=PihXDb09a1IkV56MPNe4-5QRr54_Dp679pA4ldnLHlM,39235
81
81
  bumble/pandora/l2cap.py,sha256=OT-pPprVAQr7xwjYnNwDQujayG2zWUS5FPXVBGNCW3o,11725
82
82
  bumble/pandora/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
83
  bumble/pandora/security.py,sha256=YErueKNLsnmcRe6dKo724Ht-buOqmZl2Gauswcc8FW0,21946
84
84
  bumble/pandora/utils.py,sha256=Fq4glL0T5cJ2FODoDotmDNdYFOkTOR7DyyL8vkcxp20,3949
85
85
  bumble/profiles/__init__.py,sha256=yBGC8Ti5LvZuoh1F42XtfrBilb39T77_yuxESZeX2yI,581
86
- bumble/profiles/aics.py,sha256=U0K03XqOKtqahXtq7U47WxftsAD7tkiDeUqxfaF4pwk,18540
86
+ bumble/profiles/aics.py,sha256=fpwhfIvyC_d9mUXqr5-Sc5nNIS84iWBWaeDf9BdyhfA,18059
87
87
  bumble/profiles/ascs.py,sha256=Y2_fd_5LOb9hon60LcQl3R-FoAIsOd_J37RZpveh-7c,25471
88
88
  bumble/profiles/asha.py,sha256=QXUp7ImuMD48L0mpuNxPcIkv8VvoENynCuF2PEVqzFM,10373
89
- bumble/profiles/bap.py,sha256=E_D6dGMWgTM2HsAk7y-iK-IWVJxfPtHOB5KZZkYV6yw,19613
90
- bumble/profiles/bass.py,sha256=Wiqum0Wsr5PpVzTAPDcyKLTfJoKXJUYOzqB320aSiUs,14950
89
+ bumble/profiles/bap.py,sha256=3fI8IB34l1CSzH0CwAD84qCxz_nV-SOP5q9VDzb3Aqk,21979
90
+ bumble/profiles/bass.py,sha256=Xs40LJQmdKYg9B0hlUzqs9g58f_oBqh2oGiEBUXQtv4,14882
91
91
  bumble/profiles/battery_service.py,sha256=w-uF4jLoDozJOoykimb2RkrKjVyCke6ts2-h-F1PYyc,2292
92
92
  bumble/profiles/cap.py,sha256=6gH7oOnUKjOggMPuB7rtbwj0AneoNmnWzQ_iR3io8e0,1945
93
93
  bumble/profiles/csip.py,sha256=qpI9W0_FWIpsuJrHhxfbKaa-TD21epxEa3EuCm8gh6c,10156
94
- bumble/profiles/device_information_service.py,sha256=RfqnXywcwcSTiFalxd1LVTTdeWLxHGsMvlvr9fI0GJI,6193
94
+ bumble/profiles/device_information_service.py,sha256=3c_p3s7jMxPKWHObXOesZ4ZZKr1SgaTe8RvyuangZuM,6258
95
95
  bumble/profiles/gap.py,sha256=jUjfy6MPL7k6wgNn3ny3PVgSX6-SLmjUepFYHjGc3IU,3870
96
96
  bumble/profiles/hap.py,sha256=IbE1KzjIMEq6FxtFqTgA2DN0pPnpu0996KJRjuN3oaQ,25614
97
- bumble/profiles/heart_rate_service.py,sha256=_MG1ApmF1B7b4xRzELuahtRWzLm49i9O4m7I6ZFU4mw,8644
97
+ bumble/profiles/heart_rate_service.py,sha256=56LFL3lYoCMJZ-4ec3mQPDqcvr5lahCeZzDVRKsbakE,8609
98
98
  bumble/profiles/le_audio.py,sha256=1x6OpIc0JMa32YVcfM8lq6jnXHlriHUcOkAs0EttJJk,3093
99
99
  bumble/profiles/mcp.py,sha256=vIN1r_if4LmOcGCgZuDYTYLMQzU6-1pKUFx1Z3iSAeY,17415
100
100
  bumble/profiles/pacs.py,sha256=bhlU5M6E9e1YKf-qJnJL3GwTqOPuSvYDpY_UYq0Nnd8,8730
@@ -102,8 +102,11 @@ bumble/profiles/pbp.py,sha256=51aoQcZMXzTzeatHd0zNVN7kYcv4atzr2OWpzxlSVP8,1630
102
102
  bumble/profiles/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
103
  bumble/profiles/tmap.py,sha256=hpz5VYEdEOty4D9ApCRDero9Tf3L9arSZWnLCNkZoHI,3005
104
104
  bumble/profiles/vcp.py,sha256=Lx1Odg7PQO9nXkpxRpK04MRuy975uIK8kSqcwrk4iSE,8035
105
+ bumble/profiles/vocs.py,sha256=rHFzZe_5sKMJwBhtGF-tO4q42ouiurZ_fvxUV80ADNg,12082
105
106
  bumble/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
107
  bumble/tools/generate_company_id_list.py,sha256=ysbPb3zmxKFBiSQ_MBG2r15-sqR5P_GWT6i0YUTTXOM,1736
108
+ bumble/tools/intel_fw_download.py,sha256=8YJ3y3yww7bEvL9cINq9cFucoCWf-Gf3pyu-gl4-UJE,4453
109
+ bumble/tools/intel_util.py,sha256=2hWoKS1NM8XJSmjZWBdn5mF33BWq2nWiYSNcfpUcY24,4699
107
110
  bumble/tools/rtk_fw_download.py,sha256=KEPG-rDrdPGKBzZ78P4s3udLRYT3p7vesGhXvJTWTic,5453
108
111
  bumble/tools/rtk_util.py,sha256=TwZhupHQrQYsYHLdRGyzXKd24pwCk8kkzqK1Rj2guco,5087
109
112
  bumble/transport/__init__.py,sha256=Z01fvuKpqAbhJd0wYcGhW09W2tycM71ck80XoZ8a87Q,7012
@@ -120,7 +123,7 @@ bumble/transport/tcp_client.py,sha256=deyUJYpj04QE00Mw_PTU5PHPA6mr1Nui3f5-QCy2zO
120
123
  bumble/transport/tcp_server.py,sha256=tvu7FuPeqiXfoj2HQU8wu4AiwKjDDDCKlKjgtqWc5hg,3779
121
124
  bumble/transport/udp.py,sha256=di8I6HHACgBx3un-dzAahz9lTIUrh4LdeuYpeoifQEM,2239
122
125
  bumble/transport/unix.py,sha256=CS6Ksrkat5uUXOpo7RlxAYJsM3lMS4T3OrdCqzIHTg8,1981
123
- bumble/transport/usb.py,sha256=FO2Trx9rQ_pdX6Aal7eDxOpubjBEeUmoH3jcwVwKSYA,22022
126
+ bumble/transport/usb.py,sha256=K-uFelrgEA9Q2IxWpGui2PmuX2-DvCSczkQQXI22qLQ,22179
124
127
  bumble/transport/vhci.py,sha256=iI2WpighnvIP5zeyJUFSbjEdmCo24CWMdICamIcyJck,2250
125
128
  bumble/transport/ws_client.py,sha256=9gqm5jlVT_H6LfwsQwPpky07CINhgOK96ef53SMAxms,1757
126
129
  bumble/transport/ws_server.py,sha256=goe4xx7OnZiJy1a00Bg0CXM8uJhsGXbsijMYq2n62bI,3328
@@ -162,12 +165,12 @@ bumble/transport/grpc_protobuf/rootcanal/configuration_pb2.pyi,sha256=W8j1bXHBrk
162
165
  bumble/transport/grpc_protobuf/rootcanal/configuration_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
163
166
  bumble/vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
164
167
  bumble/vendor/android/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
- bumble/vendor/android/hci.py,sha256=GZrkhaWmcMt1JpnRhv0NoySGkf2H4lNUV2f_omRZW0I,10741
168
+ bumble/vendor/android/hci.py,sha256=D8CpuFbmShrME5l0_VcOeawqlJZjZcQJEPywQYudJRA,11648
166
169
  bumble/vendor/zephyr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
170
  bumble/vendor/zephyr/hci.py,sha256=d83bC0TvT947eN4roFjLkQefWtHOoNsr4xib2ctSkvA,3195
168
- bumble-0.0.202.dist-info/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
169
- bumble-0.0.202.dist-info/METADATA,sha256=rao_wk6XWfEzXwGDY0rdDLSByA_rBfAiS9NSf9v111I,5726
170
- bumble-0.0.202.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
171
- bumble-0.0.202.dist-info/entry_points.txt,sha256=2TAnDAHiYVEo9Gnugk29QIsHpCgRgnPqBszLSgIX2T0,984
172
- bumble-0.0.202.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
173
- bumble-0.0.202.dist-info/RECORD,,
171
+ bumble-0.0.204.dist-info/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
172
+ bumble-0.0.204.dist-info/METADATA,sha256=-SdTwX26aIpmHe7G_9quzKjXyNSkQYq9E2wjWqz2AD8,5726
173
+ bumble-0.0.204.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
174
+ bumble-0.0.204.dist-info/entry_points.txt,sha256=rrp4oXhuebaI5konbhb7T0xYIBoPTpjtjmZ429gYCBs,1096
175
+ bumble-0.0.204.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
176
+ bumble-0.0.204.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.0)
2
+ Generator: setuptools (75.6.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -6,6 +6,8 @@ bumble-controller-info = bumble.apps.controller_info:main
6
6
  bumble-controller-loopback = bumble.apps.controller_loopback:main
7
7
  bumble-gatt-dump = bumble.apps.gatt_dump:main
8
8
  bumble-hci-bridge = bumble.apps.hci_bridge:main
9
+ bumble-intel-fw-download = bumble.tools.intel_fw_download:main
10
+ bumble-intel-util = bumble.tools.intel_util:main
9
11
  bumble-l2cap-bridge = bumble.apps.l2cap_bridge:main
10
12
  bumble-link-relay = bumble.apps.link_relay.link_relay:main
11
13
  bumble-pair = bumble.apps.pair:main