bumble 0.0.203__py3-none-any.whl → 0.0.207__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 +626 -87
- bumble/apps/bench.py +227 -148
- bumble/apps/controller_info.py +23 -7
- bumble/apps/device_info.py +50 -4
- bumble/apps/lea_unicast/app.py +61 -201
- bumble/apps/pair.py +13 -8
- bumble/apps/show.py +6 -6
- bumble/att.py +10 -11
- bumble/audio/__init__.py +17 -0
- bumble/audio/io.py +553 -0
- bumble/controller.py +24 -9
- bumble/core.py +4 -1
- bumble/device.py +993 -48
- bumble/drivers/common.py +2 -0
- bumble/drivers/intel.py +593 -24
- bumble/gatt.py +67 -12
- bumble/gatt_client.py +14 -2
- bumble/gatt_server.py +12 -1
- bumble/hci.py +854 -33
- bumble/host.py +363 -64
- bumble/l2cap.py +3 -16
- bumble/pairing.py +3 -0
- bumble/profiles/aics.py +45 -80
- bumble/profiles/ascs.py +6 -18
- bumble/profiles/asha.py +5 -5
- bumble/profiles/bass.py +9 -21
- bumble/profiles/device_information_service.py +4 -1
- bumble/profiles/gatt_service.py +166 -0
- bumble/profiles/gmap.py +193 -0
- bumble/profiles/heart_rate_service.py +5 -6
- bumble/profiles/le_audio.py +87 -4
- bumble/profiles/pacs.py +48 -16
- bumble/profiles/tmap.py +3 -9
- bumble/profiles/{vcp.py → vcs.py} +33 -28
- bumble/profiles/vocs.py +299 -0
- bumble/sdp.py +223 -93
- bumble/smp.py +8 -3
- bumble/tools/intel_fw_download.py +130 -0
- bumble/tools/intel_util.py +154 -0
- bumble/transport/usb.py +8 -2
- bumble/utils.py +22 -7
- bumble/vendor/android/hci.py +29 -4
- {bumble-0.0.203.dist-info → bumble-0.0.207.dist-info}/METADATA +12 -10
- {bumble-0.0.203.dist-info → bumble-0.0.207.dist-info}/RECORD +49 -43
- {bumble-0.0.203.dist-info → bumble-0.0.207.dist-info}/WHEEL +1 -1
- {bumble-0.0.203.dist-info → bumble-0.0.207.dist-info}/entry_points.txt +3 -0
- bumble/apps/lea_unicast/liblc3.wasm +0 -0
- {bumble-0.0.203.dist-info → bumble-0.0.207.dist-info}/LICENSE +0 -0
- {bumble-0.0.203.dist-info → bumble-0.0.207.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,130 @@
|
|
|
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 pathlib
|
|
20
|
+
import urllib.request
|
|
21
|
+
import urllib.error
|
|
22
|
+
|
|
23
|
+
import click
|
|
24
|
+
|
|
25
|
+
from bumble.colors import color
|
|
26
|
+
from bumble.drivers import intel
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# -----------------------------------------------------------------------------
|
|
30
|
+
# Logging
|
|
31
|
+
# -----------------------------------------------------------------------------
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# -----------------------------------------------------------------------------
|
|
36
|
+
# Constants
|
|
37
|
+
# -----------------------------------------------------------------------------
|
|
38
|
+
LINUX_KERNEL_GIT_SOURCE = "https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/intel"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# -----------------------------------------------------------------------------
|
|
42
|
+
# Functions
|
|
43
|
+
# -----------------------------------------------------------------------------
|
|
44
|
+
def download_file(base_url, name):
|
|
45
|
+
url = f"{base_url}/{name}"
|
|
46
|
+
with urllib.request.urlopen(url) as file:
|
|
47
|
+
data = file.read()
|
|
48
|
+
print(f"Downloaded {name}: {len(data)} bytes")
|
|
49
|
+
return data
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
# -----------------------------------------------------------------------------
|
|
53
|
+
@click.command
|
|
54
|
+
@click.option(
|
|
55
|
+
"--output-dir",
|
|
56
|
+
default="",
|
|
57
|
+
help="Output directory where the files will be saved. Defaults to the OS-specific"
|
|
58
|
+
"app data dir, which the driver will check when trying to find firmware",
|
|
59
|
+
show_default=True,
|
|
60
|
+
)
|
|
61
|
+
@click.option(
|
|
62
|
+
"--source",
|
|
63
|
+
type=click.Choice(["linux-kernel"]),
|
|
64
|
+
default="linux-kernel",
|
|
65
|
+
show_default=True,
|
|
66
|
+
)
|
|
67
|
+
@click.option("--single", help="Only download a single image set, by its base name")
|
|
68
|
+
@click.option("--force", is_flag=True, help="Overwrite files if they already exist")
|
|
69
|
+
def main(output_dir, source, single, force):
|
|
70
|
+
"""Download Intel firmware images and configs."""
|
|
71
|
+
|
|
72
|
+
# Check that the output dir exists
|
|
73
|
+
if output_dir == '':
|
|
74
|
+
output_dir = intel.intel_firmware_dir()
|
|
75
|
+
else:
|
|
76
|
+
output_dir = pathlib.Path(output_dir)
|
|
77
|
+
if not output_dir.is_dir():
|
|
78
|
+
print("Output dir does not exist or is not a directory")
|
|
79
|
+
return
|
|
80
|
+
|
|
81
|
+
base_url = {
|
|
82
|
+
"linux-kernel": LINUX_KERNEL_GIT_SOURCE,
|
|
83
|
+
}[source]
|
|
84
|
+
|
|
85
|
+
print("Downloading")
|
|
86
|
+
print(color("FROM:", "green"), base_url)
|
|
87
|
+
print(color("TO:", "green"), output_dir)
|
|
88
|
+
|
|
89
|
+
if single:
|
|
90
|
+
images = [(f"{single}.sfi", f"{single}.ddc")]
|
|
91
|
+
else:
|
|
92
|
+
images = [
|
|
93
|
+
(f"{base_name}.sfi", f"{base_name}.ddc")
|
|
94
|
+
for base_name in intel.INTEL_FW_IMAGE_NAMES
|
|
95
|
+
]
|
|
96
|
+
|
|
97
|
+
for fw_name, config_name in images:
|
|
98
|
+
print(color("---", "yellow"))
|
|
99
|
+
fw_image_out = output_dir / fw_name
|
|
100
|
+
if not force and fw_image_out.exists():
|
|
101
|
+
print(color(f"{fw_image_out} already exists, skipping", "red"))
|
|
102
|
+
continue
|
|
103
|
+
if config_name:
|
|
104
|
+
config_image_out = output_dir / config_name
|
|
105
|
+
if not force and config_image_out.exists():
|
|
106
|
+
print(color("f{config_image_out} already exists, skipping", "red"))
|
|
107
|
+
continue
|
|
108
|
+
|
|
109
|
+
try:
|
|
110
|
+
fw_image = download_file(base_url, fw_name)
|
|
111
|
+
except urllib.error.HTTPError as error:
|
|
112
|
+
print(f"Failed to download {fw_name}: {error}")
|
|
113
|
+
continue
|
|
114
|
+
|
|
115
|
+
config_image = None
|
|
116
|
+
if config_name:
|
|
117
|
+
try:
|
|
118
|
+
config_image = download_file(base_url, config_name)
|
|
119
|
+
except urllib.error.HTTPError as error:
|
|
120
|
+
print(f"Failed to download {config_name}: {error}")
|
|
121
|
+
continue
|
|
122
|
+
|
|
123
|
+
fw_image_out.write_bytes(fw_image)
|
|
124
|
+
if config_image:
|
|
125
|
+
config_image_out.write_bytes(config_image)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
# -----------------------------------------------------------------------------
|
|
129
|
+
if __name__ == '__main__':
|
|
130
|
+
main()
|
|
@@ -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
|
|
|
@@ -445,7 +447,7 @@ def deprecated(msg: str):
|
|
|
445
447
|
def wrapper(function):
|
|
446
448
|
@functools.wraps(function)
|
|
447
449
|
def inner(*args, **kwargs):
|
|
448
|
-
warnings.warn(msg, DeprecationWarning)
|
|
450
|
+
warnings.warn(msg, DeprecationWarning, stacklevel=2)
|
|
449
451
|
return function(*args, **kwargs)
|
|
450
452
|
|
|
451
453
|
return inner
|
|
@@ -462,7 +464,7 @@ def experimental(msg: str):
|
|
|
462
464
|
def wrapper(function):
|
|
463
465
|
@functools.wraps(function)
|
|
464
466
|
def inner(*args, **kwargs):
|
|
465
|
-
warnings.warn(msg, FutureWarning)
|
|
467
|
+
warnings.warn(msg, FutureWarning, stacklevel=2)
|
|
466
468
|
return function(*args, **kwargs)
|
|
467
469
|
|
|
468
470
|
return inner
|
|
@@ -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.add_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,17 +1,16 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: bumble
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.207
|
|
4
4
|
Summary: Bluetooth Stack for Apps, Emulation, Test and Experimentation
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Author-email: tbd@tbd.com
|
|
5
|
+
Author-email: Google <bumble-dev@google.com>
|
|
6
|
+
Project-URL: Homepage, https://github.com/google/bumble
|
|
8
7
|
Requires-Python: >=3.8
|
|
9
8
|
Description-Content-Type: text/markdown
|
|
10
9
|
License-File: LICENSE
|
|
11
10
|
Requires-Dist: aiohttp~=3.8; platform_system != "Emscripten"
|
|
12
11
|
Requires-Dist: appdirs>=1.4; platform_system != "Emscripten"
|
|
13
12
|
Requires-Dist: click>=8.1.3; platform_system != "Emscripten"
|
|
14
|
-
Requires-Dist: cryptography
|
|
13
|
+
Requires-Dist: cryptography>=39; platform_system != "Emscripten"
|
|
15
14
|
Requires-Dist: cryptography>=39.0; platform_system == "Emscripten"
|
|
16
15
|
Requires-Dist: grpcio>=1.62.1; platform_system != "Emscripten"
|
|
17
16
|
Requires-Dist: humanize>=4.6.0; platform_system != "Emscripten"
|
|
@@ -35,6 +34,7 @@ Requires-Dist: pytest-html>=3.2.0; extra == "test"
|
|
|
35
34
|
Requires-Dist: coverage>=6.4; extra == "test"
|
|
36
35
|
Provides-Extra: development
|
|
37
36
|
Requires-Dist: black==24.3; extra == "development"
|
|
37
|
+
Requires-Dist: bt-test-interfaces>=0.0.6; extra == "development"
|
|
38
38
|
Requires-Dist: grpcio-tools>=1.62.1; extra == "development"
|
|
39
39
|
Requires-Dist: invoke>=1.7.3; extra == "development"
|
|
40
40
|
Requires-Dist: mobly>=1.12.2; extra == "development"
|
|
@@ -45,16 +45,18 @@ Requires-Dist: pyyaml>=6.0; extra == "development"
|
|
|
45
45
|
Requires-Dist: types-appdirs>=1.4.3; extra == "development"
|
|
46
46
|
Requires-Dist: types-invoke>=1.7.3; extra == "development"
|
|
47
47
|
Requires-Dist: types-protobuf>=4.21.0; extra == "development"
|
|
48
|
-
Requires-Dist: wasmtime==20.0.0; extra == "development"
|
|
49
48
|
Provides-Extra: avatar
|
|
50
49
|
Requires-Dist: pandora-avatar==0.0.10; extra == "avatar"
|
|
51
50
|
Requires-Dist: rootcanal==1.10.0; python_version >= "3.10" and extra == "avatar"
|
|
52
51
|
Provides-Extra: pandora
|
|
53
52
|
Requires-Dist: bt-test-interfaces>=0.0.6; extra == "pandora"
|
|
54
53
|
Provides-Extra: documentation
|
|
55
|
-
Requires-Dist: mkdocs>=1.
|
|
56
|
-
Requires-Dist: mkdocs-material>=
|
|
57
|
-
Requires-Dist: mkdocstrings[python]>=0.
|
|
54
|
+
Requires-Dist: mkdocs>=1.6.0; extra == "documentation"
|
|
55
|
+
Requires-Dist: mkdocs-material>=9.6; extra == "documentation"
|
|
56
|
+
Requires-Dist: mkdocstrings[python]>=0.27.0; extra == "documentation"
|
|
57
|
+
Provides-Extra: auracast
|
|
58
|
+
Requires-Dist: lc3py; (python_version >= "3.10" and platform_system == "Linux" and platform_machine == "x86_64") and extra == "auracast"
|
|
59
|
+
Requires-Dist: sounddevice>=0.5.1; extra == "auracast"
|
|
58
60
|
|
|
59
61
|
|
|
60
62
|
_ _ _
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
bumble/__init__.py,sha256=Q8jkz6rgl95IMAeInQVt_2GLoJl3DcEP2cxtrQ-ho5c,110
|
|
2
|
-
bumble/_version.py,sha256=
|
|
2
|
+
bumble/_version.py,sha256=jmWBoK3noH8SOitnHxsR8mEYSEdPJ5p78NFlFLHEizc,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,55 +11,54 @@ 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=
|
|
15
|
-
bumble/core.py,sha256=
|
|
14
|
+
bumble/controller.py,sha256=w7KAbh1NH1_TRiiiXZX2EBgM9nGXteHH8fpns8Dshg4,62116
|
|
15
|
+
bumble/core.py,sha256=TWXoBItq0UFwLmjbm4QXQoEK4eWFLnFhJzuTSpKb-LM,72544
|
|
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=al6h9s0WAIWeWWEY0Z_O8BONhUqF4uifJFHzJKX5MQc,230241
|
|
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=cwU6c0UjhNICIVhA4hnVhvysHXDC7S-vB4byBY9SK-0,40972
|
|
21
|
+
bumble/gatt_client.py,sha256=oZupZy_vHpyLoh8HvN0gtDBgK-zUnEvdweggdt1vQOE,43788
|
|
22
|
+
bumble/gatt_server.py,sha256=cRIvPUrfTa8Kwn6KWsTzC33-AVoAPNzEMbXWbk_I6N4,37516
|
|
23
|
+
bumble/hci.py,sha256=xYKsSvwjZj0pAPgtGDyRaVxKOi4garuzSaiTd2ICWok,313243
|
|
24
24
|
bumble/helpers.py,sha256=m0w4UgFFNDEnXwHrDyfRlcBObdVed2fqXGL0lvR3c8s,12733
|
|
25
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=MNjN_NFQxPB1NKWw5jf35z0VbOzE3nrNub6opqecwtA,61315
|
|
28
28
|
bumble/keys.py,sha256=WbIQ7Ob81mW75qmEPQ2rBLfnqBMA-ts2yowWXP9UaCY,12654
|
|
29
|
-
bumble/l2cap.py,sha256=
|
|
29
|
+
bumble/l2cap.py,sha256=_bDO9VXhqDc1eNjqQBO82NYAsQipVxlrvcNSQIaWfL0,80809
|
|
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=x7TQ1LlggWQDIaEZZaVNSd2PhfVtnjQ9xV1LTJ_y0Xs,49583
|
|
36
|
+
bumble/smp.py,sha256=ic_9ozECbsZPsho0kU6eMcB2zIl6JODUx-tqdm8IdxU,77878
|
|
37
37
|
bumble/snoop.py,sha256=1mzwmp9LToUXbPnFsLrt8S4UHs0kqzbu7LDydwbmkZI,5715
|
|
38
|
-
bumble/utils.py,sha256=
|
|
38
|
+
bumble/utils.py,sha256=pddRUOgO8GJbymfLGDq-paWfk1N6lV0vieZ1DR1YCAY,15510
|
|
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=ATs15CV082WbMm6Vl7tpz7DRzorY6x_of6DVJMywKeA,44040
|
|
42
|
+
bumble/apps/bench.py,sha256=2Lf3fZD79rMRyaIZy5DqBSdMMT9YlcE3-aqE4c7eD38,61236
|
|
43
43
|
bumble/apps/ble_rpa_tool.py,sha256=ZQtsbfnLPd5qUAkEBPpNgJLRynBBc7q_9cDHKUW2SQ0,1701
|
|
44
44
|
bumble/apps/console.py,sha256=rwD9y3g8Mm_mAEvrcXjbtcv5d8mwF3yTbmE6Vet2BEk,45300
|
|
45
|
-
bumble/apps/controller_info.py,sha256=
|
|
45
|
+
bumble/apps/controller_info.py,sha256=SRjTY66I8752oPa_G3y2D_H9NQj3HWxQ_fWKllNu4yo,12484
|
|
46
46
|
bumble/apps/controller_loopback.py,sha256=VJAFsUdFwm2KgOrRuLADymMpZl5qVO0RGkDSr-1XKtY,7214
|
|
47
47
|
bumble/apps/controllers.py,sha256=R6XJ1XpyuXlyqSCmI7PromVIcoYTcYfpmO-TqTYXnUI,2326
|
|
48
|
-
bumble/apps/device_info.py,sha256=
|
|
48
|
+
bumble/apps/device_info.py,sha256=K7LcVpOOaunRMAKSSOTiDvqCavOZRdsDiXj2ofoJeG0,9942
|
|
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
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=Fqm5XsAgcJCbHohz5rpV63SfB1MbyXH-o0GUn9RpYS8,17393
|
|
61
61
|
bumble/apps/lea_unicast/index.html,sha256=d1IHsYd8TGOnxNZKaHolf4Y-7VwT1kO9Z72vpGMdy3k,2354
|
|
62
|
-
bumble/apps/lea_unicast/liblc3.wasm,sha256=nYMzG9fP8_71K9dQfVI9QPQPkFRPHoqZEEExs1y6Oac,158603
|
|
63
62
|
bumble/apps/link_relay/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
64
63
|
bumble/apps/link_relay/link_relay.py,sha256=GOESYPzkMJFrz5VOI_BSmnmgz4Y8EdSLHMWgdA63aDg,10066
|
|
65
64
|
bumble/apps/link_relay/logging.yml,sha256=t-P72RAHsTZOESw0M4I3CQPonymcjkd9SLE0eY_ZNiM,311
|
|
@@ -70,9 +69,11 @@ bumble/apps/speaker/speaker.css,sha256=nyM5TjzDYkkLwFzsaIOuTSngzSvgDnkLe0Z-fAn1_
|
|
|
70
69
|
bumble/apps/speaker/speaker.html,sha256=kfAZ5oZSFc9ygBFIUuZEn5LUNQnHBvrnuHU6VAptyiU,1188
|
|
71
70
|
bumble/apps/speaker/speaker.js,sha256=DrT831yg3oBXKZ5usnfZjRU9X6Nw3zjIWSkz6sIgVtw,9373
|
|
72
71
|
bumble/apps/speaker/speaker.py,sha256=OTqygA9VbQW_XxTxqxS0vRW_wvhnKHssSxDz1lQZ9ZU,24763
|
|
72
|
+
bumble/audio/__init__.py,sha256=tc75ofvV52qED31kB_LYRVLNrxtbZqnOWO8lHsZK3Ww,747
|
|
73
|
+
bumble/audio/io.py,sha256=xxEv-yUwlNRX-4ccy7VdrHBmLL4OrOekgI81hIpMWRU,17789
|
|
73
74
|
bumble/drivers/__init__.py,sha256=lxqJTghh21rQFThRTurwLysZm385TUcn8ZdpHQSWD88,3196
|
|
74
|
-
bumble/drivers/common.py,sha256=
|
|
75
|
-
bumble/drivers/intel.py,sha256
|
|
75
|
+
bumble/drivers/common.py,sha256=HZWILnQ0P5StGuhpeU7qj-0pqBvMGyOXrZv2J56_ACE,1532
|
|
76
|
+
bumble/drivers/intel.py,sha256=vd8O_blmgUEi_eJx4Ixaa_TpZDTXpfbbCt9sRr1GlJM,22759
|
|
76
77
|
bumble/drivers/rtk.py,sha256=nsfAqNzvxvAwbh6UYgxOCSNwgw7XouIBFA03FrLTs4M,22088
|
|
77
78
|
bumble/pandora/__init__.py,sha256=jaPtYCLfLeLUGj8-TmS3Gkv0l1_DBadYj8ZMAPLPAao,3463
|
|
78
79
|
bumble/pandora/config.py,sha256=KD85n3oRbuvD65sRah2H0gpxEW4YbD7HbYbsxdcpDDA,2388
|
|
@@ -83,27 +84,32 @@ bumble/pandora/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
83
84
|
bumble/pandora/security.py,sha256=YErueKNLsnmcRe6dKo724Ht-buOqmZl2Gauswcc8FW0,21946
|
|
84
85
|
bumble/pandora/utils.py,sha256=Fq4glL0T5cJ2FODoDotmDNdYFOkTOR7DyyL8vkcxp20,3949
|
|
85
86
|
bumble/profiles/__init__.py,sha256=yBGC8Ti5LvZuoh1F42XtfrBilb39T77_yuxESZeX2yI,581
|
|
86
|
-
bumble/profiles/aics.py,sha256=
|
|
87
|
-
bumble/profiles/ascs.py,sha256=
|
|
88
|
-
bumble/profiles/asha.py,sha256=
|
|
87
|
+
bumble/profiles/aics.py,sha256=Kb50MTBPxWHZbc0JUBogv3YEV2wZIGrqs8E7qhEm7aI,17230
|
|
88
|
+
bumble/profiles/ascs.py,sha256=jRFZDPgym7ZRs_bqmLjLwi5nAHg_lwfRcq_P6Ynvg4s,24839
|
|
89
|
+
bumble/profiles/asha.py,sha256=XLXinlmC1Zn1MiK_eg62F89gG-4HnBHco_KzoEXtCUE,10273
|
|
89
90
|
bumble/profiles/bap.py,sha256=3fI8IB34l1CSzH0CwAD84qCxz_nV-SOP5q9VDzb3Aqk,21979
|
|
90
|
-
bumble/profiles/bass.py,sha256=
|
|
91
|
+
bumble/profiles/bass.py,sha256=5t91bOZDolmfiv9c1pQ1FmewKhXUtqPH7c1Qr8GR9IA,14557
|
|
91
92
|
bumble/profiles/battery_service.py,sha256=w-uF4jLoDozJOoykimb2RkrKjVyCke6ts2-h-F1PYyc,2292
|
|
92
93
|
bumble/profiles/cap.py,sha256=6gH7oOnUKjOggMPuB7rtbwj0AneoNmnWzQ_iR3io8e0,1945
|
|
93
94
|
bumble/profiles/csip.py,sha256=qpI9W0_FWIpsuJrHhxfbKaa-TD21epxEa3EuCm8gh6c,10156
|
|
94
|
-
bumble/profiles/device_information_service.py,sha256=
|
|
95
|
+
bumble/profiles/device_information_service.py,sha256=3c_p3s7jMxPKWHObXOesZ4ZZKr1SgaTe8RvyuangZuM,6258
|
|
95
96
|
bumble/profiles/gap.py,sha256=jUjfy6MPL7k6wgNn3ny3PVgSX6-SLmjUepFYHjGc3IU,3870
|
|
97
|
+
bumble/profiles/gatt_service.py,sha256=n85zh22nNNcxeajLtX0ZzZLESPwXDGDxoZdttEtOZW4,6675
|
|
98
|
+
bumble/profiles/gmap.py,sha256=jNhYoqD9oLkZubCQ9zllwKtXVyVoZVoIZJcI_DUuJGw,7035
|
|
96
99
|
bumble/profiles/hap.py,sha256=IbE1KzjIMEq6FxtFqTgA2DN0pPnpu0996KJRjuN3oaQ,25614
|
|
97
|
-
bumble/profiles/heart_rate_service.py,sha256=
|
|
98
|
-
bumble/profiles/le_audio.py,sha256=
|
|
100
|
+
bumble/profiles/heart_rate_service.py,sha256=56LFL3lYoCMJZ-4ec3mQPDqcvr5lahCeZzDVRKsbakE,8609
|
|
101
|
+
bumble/profiles/le_audio.py,sha256=eDdMLwaisA3Wg7XhNVDoLOWchJ5CCfT0cqxOqCo8l04,5839
|
|
99
102
|
bumble/profiles/mcp.py,sha256=vIN1r_if4LmOcGCgZuDYTYLMQzU6-1pKUFx1Z3iSAeY,17415
|
|
100
|
-
bumble/profiles/pacs.py,sha256=
|
|
103
|
+
bumble/profiles/pacs.py,sha256=3q_d2Dfc9kYIip9TChgu49SG_BE-vQhhLyDgJh-_0eM,10012
|
|
101
104
|
bumble/profiles/pbp.py,sha256=51aoQcZMXzTzeatHd0zNVN7kYcv4atzr2OWpzxlSVP8,1630
|
|
102
105
|
bumble/profiles/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
103
|
-
bumble/profiles/tmap.py,sha256=
|
|
104
|
-
bumble/profiles/
|
|
106
|
+
bumble/profiles/tmap.py,sha256=24hPPDc4xVKanRqTHRaOG_R95qmUVrO5_m_MhCcltiQ,2833
|
|
107
|
+
bumble/profiles/vcs.py,sha256=cB9-DU9gFhGQxfjStRCAZmkGXj3SDtfZlBtBOR26c_E,8149
|
|
108
|
+
bumble/profiles/vocs.py,sha256=V_UWVL83MPR2GNJMouiMzXUhsazD1xhbrQqZ2gP_mFw,10895
|
|
105
109
|
bumble/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
106
110
|
bumble/tools/generate_company_id_list.py,sha256=ysbPb3zmxKFBiSQ_MBG2r15-sqR5P_GWT6i0YUTTXOM,1736
|
|
111
|
+
bumble/tools/intel_fw_download.py,sha256=8YJ3y3yww7bEvL9cINq9cFucoCWf-Gf3pyu-gl4-UJE,4453
|
|
112
|
+
bumble/tools/intel_util.py,sha256=2hWoKS1NM8XJSmjZWBdn5mF33BWq2nWiYSNcfpUcY24,4699
|
|
107
113
|
bumble/tools/rtk_fw_download.py,sha256=KEPG-rDrdPGKBzZ78P4s3udLRYT3p7vesGhXvJTWTic,5453
|
|
108
114
|
bumble/tools/rtk_util.py,sha256=TwZhupHQrQYsYHLdRGyzXKd24pwCk8kkzqK1Rj2guco,5087
|
|
109
115
|
bumble/transport/__init__.py,sha256=Z01fvuKpqAbhJd0wYcGhW09W2tycM71ck80XoZ8a87Q,7012
|
|
@@ -120,7 +126,7 @@ bumble/transport/tcp_client.py,sha256=deyUJYpj04QE00Mw_PTU5PHPA6mr1Nui3f5-QCy2zO
|
|
|
120
126
|
bumble/transport/tcp_server.py,sha256=tvu7FuPeqiXfoj2HQU8wu4AiwKjDDDCKlKjgtqWc5hg,3779
|
|
121
127
|
bumble/transport/udp.py,sha256=di8I6HHACgBx3un-dzAahz9lTIUrh4LdeuYpeoifQEM,2239
|
|
122
128
|
bumble/transport/unix.py,sha256=CS6Ksrkat5uUXOpo7RlxAYJsM3lMS4T3OrdCqzIHTg8,1981
|
|
123
|
-
bumble/transport/usb.py,sha256=
|
|
129
|
+
bumble/transport/usb.py,sha256=K-uFelrgEA9Q2IxWpGui2PmuX2-DvCSczkQQXI22qLQ,22179
|
|
124
130
|
bumble/transport/vhci.py,sha256=iI2WpighnvIP5zeyJUFSbjEdmCo24CWMdICamIcyJck,2250
|
|
125
131
|
bumble/transport/ws_client.py,sha256=9gqm5jlVT_H6LfwsQwPpky07CINhgOK96ef53SMAxms,1757
|
|
126
132
|
bumble/transport/ws_server.py,sha256=goe4xx7OnZiJy1a00Bg0CXM8uJhsGXbsijMYq2n62bI,3328
|
|
@@ -162,12 +168,12 @@ bumble/transport/grpc_protobuf/rootcanal/configuration_pb2.pyi,sha256=W8j1bXHBrk
|
|
|
162
168
|
bumble/transport/grpc_protobuf/rootcanal/configuration_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
163
169
|
bumble/vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
164
170
|
bumble/vendor/android/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
165
|
-
bumble/vendor/android/hci.py,sha256
|
|
171
|
+
bumble/vendor/android/hci.py,sha256=-ZryisGrnxYEXEM9kcR2ta4joNhAgAxgRYAEYLq5tT0,11651
|
|
166
172
|
bumble/vendor/zephyr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
167
173
|
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.
|
|
174
|
+
bumble-0.0.207.dist-info/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
|
|
175
|
+
bumble-0.0.207.dist-info/METADATA,sha256=-k4cZeBTfBD0smZbv1GOk9jsvJVd2toT4qS6bZRqXws,5966
|
|
176
|
+
bumble-0.0.207.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
177
|
+
bumble-0.0.207.dist-info/entry_points.txt,sha256=0mBShtMEyPU3NxVWkl-cixtC7W04yZxJmAh2WN-UzX8,1140
|
|
178
|
+
bumble-0.0.207.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
|
|
179
|
+
bumble-0.0.207.dist-info/RECORD,,
|