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.
- bumble/_version.py +2 -2
- bumble/apps/auracast.py +22 -13
- bumble/apps/bench.py +2 -1
- bumble/apps/hci_bridge.py +1 -1
- bumble/apps/lea_unicast/app.py +24 -6
- bumble/apps/pair.py +13 -8
- bumble/apps/show.py +6 -6
- bumble/att.py +11 -15
- bumble/controller.py +58 -2
- bumble/device.py +454 -494
- bumble/drivers/common.py +2 -0
- bumble/drivers/intel.py +593 -24
- bumble/gatt.py +33 -7
- bumble/gatt_client.py +3 -3
- bumble/gatt_server.py +14 -3
- bumble/hci.py +139 -56
- bumble/hfp.py +20 -17
- bumble/host.py +5 -2
- bumble/l2cap.py +2 -8
- bumble/pairing.py +3 -0
- bumble/pandora/host.py +1 -1
- bumble/profiles/aics.py +37 -53
- bumble/profiles/bap.py +114 -42
- bumble/profiles/bass.py +4 -7
- bumble/profiles/device_information_service.py +4 -1
- bumble/profiles/heart_rate_service.py +5 -6
- bumble/profiles/vocs.py +330 -0
- bumble/sdp.py +1 -7
- bumble/smp.py +9 -7
- bumble/tools/intel_fw_download.py +130 -0
- bumble/tools/intel_util.py +154 -0
- bumble/transport/usb.py +8 -2
- bumble/utils.py +20 -5
- bumble/vendor/android/hci.py +29 -4
- {bumble-0.0.202.dist-info → bumble-0.0.204.dist-info}/METADATA +15 -15
- {bumble-0.0.202.dist-info → bumble-0.0.204.dist-info}/RECORD +40 -37
- {bumble-0.0.202.dist-info → bumble-0.0.204.dist-info}/WHEEL +1 -1
- {bumble-0.0.202.dist-info → bumble-0.0.204.dist-info}/entry_points.txt +2 -0
- {bumble-0.0.202.dist-info → bumble-0.0.204.dist-info}/LICENSE +0 -0
- {bumble-0.0.202.dist-info → bumble-0.0.204.dist-info}/top_level.txt +0 -0
|
@@ -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(
|
|
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(
|
|
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
|
-
|
|
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: ...
|
bumble/vendor/android/hci.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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(
|
|
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.
|
|
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:
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
18
|
+
bumble/device.py,sha256=BuVejCWditUcMzTM1RBOC-mHdu9tNMOv0AyeCp_iX9E,194628
|
|
19
19
|
bumble/gap.py,sha256=dRU2_TWvqTDx80hxeSbXlWIeWvptWH4_XbItG5y948Q,2138
|
|
20
|
-
bumble/gatt.py,sha256=
|
|
21
|
-
bumble/gatt_client.py,sha256=
|
|
22
|
-
bumble/gatt_server.py,sha256=
|
|
23
|
-
bumble/hci.py,sha256=
|
|
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=
|
|
25
|
+
bumble/hfp.py,sha256=UDqB-z5nEzLgRojJeC6TbFRaPXV3Ht0jvQV03ksyiLU,75749
|
|
26
26
|
bumble/hid.py,sha256=hJKm6qhNa0kQTGmp_VxNh3-ywgBDdJpPPFcvtFiRL0A,20335
|
|
27
|
-
bumble/host.py,sha256=
|
|
27
|
+
bumble/host.py,sha256=8Yi7BV99HBP2cYb-00PKVscfgTcOfQHcXgSy1OltctE,49282
|
|
28
28
|
bumble/keys.py,sha256=WbIQ7Ob81mW75qmEPQ2rBLfnqBMA-ts2yowWXP9UaCY,12654
|
|
29
|
-
bumble/l2cap.py,sha256=
|
|
29
|
+
bumble/l2cap.py,sha256=VT0mv3S6fzVhF1ouahykTmKBbEKDc9DfH0qoKmPH8ZE,81291
|
|
30
30
|
bumble/link.py,sha256=SU7Ls2Lyg1XuY8x6yP9tAC83SYmMTU2a-vQ_CWCfq90,24107
|
|
31
|
-
bumble/pairing.py,sha256=
|
|
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=
|
|
36
|
-
bumble/smp.py,sha256=
|
|
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=
|
|
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=
|
|
42
|
-
bumble/apps/bench.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
75
|
-
bumble/drivers/intel.py,sha256
|
|
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=
|
|
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=
|
|
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=
|
|
90
|
-
bumble/profiles/bass.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
169
|
-
bumble-0.0.
|
|
170
|
-
bumble-0.0.
|
|
171
|
-
bumble-0.0.
|
|
172
|
-
bumble-0.0.
|
|
173
|
-
bumble-0.0.
|
|
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,,
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|