bumble 0.0.199__py3-none-any.whl → 0.0.201__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.
Files changed (48) hide show
  1. bumble/_version.py +2 -2
  2. bumble/a2dp.py +502 -202
  3. bumble/apps/controller_info.py +60 -0
  4. bumble/apps/player/player.py +608 -0
  5. bumble/apps/speaker/speaker.py +25 -27
  6. bumble/att.py +2 -2
  7. bumble/avc.py +1 -2
  8. bumble/avdtp.py +54 -97
  9. bumble/avrcp.py +48 -29
  10. bumble/codecs.py +214 -68
  11. bumble/device.py +19 -11
  12. bumble/hci.py +31 -5
  13. bumble/hfp.py +52 -48
  14. bumble/host.py +12 -0
  15. bumble/profiles/hap.py +27 -18
  16. bumble/rtp.py +110 -0
  17. bumble/transport/android_netsim.py +31 -11
  18. bumble/transport/grpc_protobuf/netsim/__init__.py +0 -0
  19. bumble/transport/grpc_protobuf/{common_pb2.py → netsim/common_pb2.py} +9 -8
  20. bumble/transport/grpc_protobuf/{common_pb2.pyi → netsim/common_pb2.pyi} +11 -5
  21. bumble/transport/grpc_protobuf/netsim/hci_packet_pb2.py +29 -0
  22. bumble/transport/grpc_protobuf/{hci_packet_pb2.pyi → netsim/hci_packet_pb2.pyi} +13 -7
  23. bumble/transport/grpc_protobuf/netsim/model_pb2.py +63 -0
  24. bumble/transport/grpc_protobuf/netsim/model_pb2.pyi +238 -0
  25. bumble/transport/grpc_protobuf/netsim/packet_streamer_pb2.py +32 -0
  26. bumble/transport/grpc_protobuf/{packet_streamer_pb2.pyi → netsim/packet_streamer_pb2.pyi} +6 -6
  27. bumble/transport/grpc_protobuf/{packet_streamer_pb2_grpc.py → netsim/packet_streamer_pb2_grpc.py} +7 -7
  28. bumble/transport/grpc_protobuf/netsim/startup_pb2.py +41 -0
  29. bumble/transport/grpc_protobuf/netsim/startup_pb2.pyi +76 -0
  30. bumble/transport/grpc_protobuf/netsim/startup_pb2_grpc.py +4 -0
  31. bumble/transport/grpc_protobuf/rootcanal/__init__.py +0 -0
  32. bumble/transport/grpc_protobuf/rootcanal/configuration_pb2.py +39 -0
  33. bumble/transport/grpc_protobuf/rootcanal/configuration_pb2.pyi +78 -0
  34. bumble/transport/grpc_protobuf/rootcanal/configuration_pb2_grpc.py +4 -0
  35. bumble/transport/pyusb.py +2 -1
  36. {bumble-0.0.199.dist-info → bumble-0.0.201.dist-info}/METADATA +2 -2
  37. {bumble-0.0.199.dist-info → bumble-0.0.201.dist-info}/RECORD +44 -34
  38. {bumble-0.0.199.dist-info → bumble-0.0.201.dist-info}/WHEEL +1 -1
  39. {bumble-0.0.199.dist-info → bumble-0.0.201.dist-info}/entry_points.txt +1 -0
  40. bumble/transport/grpc_protobuf/hci_packet_pb2.py +0 -28
  41. bumble/transport/grpc_protobuf/packet_streamer_pb2.py +0 -31
  42. bumble/transport/grpc_protobuf/startup_pb2.py +0 -32
  43. bumble/transport/grpc_protobuf/startup_pb2.pyi +0 -46
  44. /bumble/transport/grpc_protobuf/{common_pb2_grpc.py → netsim/common_pb2_grpc.py} +0 -0
  45. /bumble/transport/grpc_protobuf/{hci_packet_pb2_grpc.py → netsim/hci_packet_pb2_grpc.py} +0 -0
  46. /bumble/transport/grpc_protobuf/{startup_pb2_grpc.py → netsim/model_pb2_grpc.py} +0 -0
  47. {bumble-0.0.199.dist-info → bumble-0.0.201.dist-info}/LICENSE +0 -0
  48. {bumble-0.0.199.dist-info → bumble-0.0.201.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,238 @@
1
+ from bumble.transport.grpc_protobuf.netsim import common_pb2 as _common_pb2
2
+ from google.protobuf import timestamp_pb2 as _timestamp_pb2
3
+ from bumble.transport.grpc_protobuf.rootcanal import configuration_pb2 as _configuration_pb2
4
+ from google.protobuf.internal import containers as _containers
5
+ from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
6
+ from google.protobuf import descriptor as _descriptor
7
+ from google.protobuf import message as _message
8
+ from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
9
+
10
+ DESCRIPTOR: _descriptor.FileDescriptor
11
+
12
+ class PhyKind(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
13
+ __slots__ = ()
14
+ NONE: _ClassVar[PhyKind]
15
+ BLUETOOTH_CLASSIC: _ClassVar[PhyKind]
16
+ BLUETOOTH_LOW_ENERGY: _ClassVar[PhyKind]
17
+ WIFI: _ClassVar[PhyKind]
18
+ UWB: _ClassVar[PhyKind]
19
+ WIFI_RTT: _ClassVar[PhyKind]
20
+ NONE: PhyKind
21
+ BLUETOOTH_CLASSIC: PhyKind
22
+ BLUETOOTH_LOW_ENERGY: PhyKind
23
+ WIFI: PhyKind
24
+ UWB: PhyKind
25
+ WIFI_RTT: PhyKind
26
+
27
+ class Position(_message.Message):
28
+ __slots__ = ("x", "y", "z")
29
+ X_FIELD_NUMBER: _ClassVar[int]
30
+ Y_FIELD_NUMBER: _ClassVar[int]
31
+ Z_FIELD_NUMBER: _ClassVar[int]
32
+ x: float
33
+ y: float
34
+ z: float
35
+ def __init__(self, x: _Optional[float] = ..., y: _Optional[float] = ..., z: _Optional[float] = ...) -> None: ...
36
+
37
+ class Orientation(_message.Message):
38
+ __slots__ = ("yaw", "pitch", "roll")
39
+ YAW_FIELD_NUMBER: _ClassVar[int]
40
+ PITCH_FIELD_NUMBER: _ClassVar[int]
41
+ ROLL_FIELD_NUMBER: _ClassVar[int]
42
+ yaw: float
43
+ pitch: float
44
+ roll: float
45
+ def __init__(self, yaw: _Optional[float] = ..., pitch: _Optional[float] = ..., roll: _Optional[float] = ...) -> None: ...
46
+
47
+ class Chip(_message.Message):
48
+ __slots__ = ("kind", "id", "name", "manufacturer", "product_name", "bt", "ble_beacon", "uwb", "wifi", "offset")
49
+ class Radio(_message.Message):
50
+ __slots__ = ("state", "range", "tx_count", "rx_count")
51
+ STATE_FIELD_NUMBER: _ClassVar[int]
52
+ RANGE_FIELD_NUMBER: _ClassVar[int]
53
+ TX_COUNT_FIELD_NUMBER: _ClassVar[int]
54
+ RX_COUNT_FIELD_NUMBER: _ClassVar[int]
55
+ state: bool
56
+ range: float
57
+ tx_count: int
58
+ rx_count: int
59
+ def __init__(self, state: bool = ..., range: _Optional[float] = ..., tx_count: _Optional[int] = ..., rx_count: _Optional[int] = ...) -> None: ...
60
+ class Bluetooth(_message.Message):
61
+ __slots__ = ("low_energy", "classic", "address", "bt_properties")
62
+ LOW_ENERGY_FIELD_NUMBER: _ClassVar[int]
63
+ CLASSIC_FIELD_NUMBER: _ClassVar[int]
64
+ ADDRESS_FIELD_NUMBER: _ClassVar[int]
65
+ BT_PROPERTIES_FIELD_NUMBER: _ClassVar[int]
66
+ low_energy: Chip.Radio
67
+ classic: Chip.Radio
68
+ address: str
69
+ bt_properties: _configuration_pb2.Controller
70
+ def __init__(self, low_energy: _Optional[_Union[Chip.Radio, _Mapping]] = ..., classic: _Optional[_Union[Chip.Radio, _Mapping]] = ..., address: _Optional[str] = ..., bt_properties: _Optional[_Union[_configuration_pb2.Controller, _Mapping]] = ...) -> None: ...
71
+ class BleBeacon(_message.Message):
72
+ __slots__ = ("bt", "address", "settings", "adv_data", "scan_response")
73
+ class AdvertiseSettings(_message.Message):
74
+ __slots__ = ("advertise_mode", "milliseconds", "tx_power_level", "dbm", "scannable", "timeout")
75
+ class AdvertiseMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
76
+ __slots__ = ()
77
+ LOW_POWER: _ClassVar[Chip.BleBeacon.AdvertiseSettings.AdvertiseMode]
78
+ BALANCED: _ClassVar[Chip.BleBeacon.AdvertiseSettings.AdvertiseMode]
79
+ LOW_LATENCY: _ClassVar[Chip.BleBeacon.AdvertiseSettings.AdvertiseMode]
80
+ LOW_POWER: Chip.BleBeacon.AdvertiseSettings.AdvertiseMode
81
+ BALANCED: Chip.BleBeacon.AdvertiseSettings.AdvertiseMode
82
+ LOW_LATENCY: Chip.BleBeacon.AdvertiseSettings.AdvertiseMode
83
+ class AdvertiseTxPower(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
84
+ __slots__ = ()
85
+ ULTRA_LOW: _ClassVar[Chip.BleBeacon.AdvertiseSettings.AdvertiseTxPower]
86
+ LOW: _ClassVar[Chip.BleBeacon.AdvertiseSettings.AdvertiseTxPower]
87
+ MEDIUM: _ClassVar[Chip.BleBeacon.AdvertiseSettings.AdvertiseTxPower]
88
+ HIGH: _ClassVar[Chip.BleBeacon.AdvertiseSettings.AdvertiseTxPower]
89
+ ULTRA_LOW: Chip.BleBeacon.AdvertiseSettings.AdvertiseTxPower
90
+ LOW: Chip.BleBeacon.AdvertiseSettings.AdvertiseTxPower
91
+ MEDIUM: Chip.BleBeacon.AdvertiseSettings.AdvertiseTxPower
92
+ HIGH: Chip.BleBeacon.AdvertiseSettings.AdvertiseTxPower
93
+ ADVERTISE_MODE_FIELD_NUMBER: _ClassVar[int]
94
+ MILLISECONDS_FIELD_NUMBER: _ClassVar[int]
95
+ TX_POWER_LEVEL_FIELD_NUMBER: _ClassVar[int]
96
+ DBM_FIELD_NUMBER: _ClassVar[int]
97
+ SCANNABLE_FIELD_NUMBER: _ClassVar[int]
98
+ TIMEOUT_FIELD_NUMBER: _ClassVar[int]
99
+ advertise_mode: Chip.BleBeacon.AdvertiseSettings.AdvertiseMode
100
+ milliseconds: int
101
+ tx_power_level: Chip.BleBeacon.AdvertiseSettings.AdvertiseTxPower
102
+ dbm: int
103
+ scannable: bool
104
+ timeout: int
105
+ def __init__(self, advertise_mode: _Optional[_Union[Chip.BleBeacon.AdvertiseSettings.AdvertiseMode, str]] = ..., milliseconds: _Optional[int] = ..., tx_power_level: _Optional[_Union[Chip.BleBeacon.AdvertiseSettings.AdvertiseTxPower, str]] = ..., dbm: _Optional[int] = ..., scannable: bool = ..., timeout: _Optional[int] = ...) -> None: ...
106
+ class AdvertiseData(_message.Message):
107
+ __slots__ = ("include_device_name", "include_tx_power_level", "manufacturer_data", "services")
108
+ class Service(_message.Message):
109
+ __slots__ = ("uuid", "data")
110
+ UUID_FIELD_NUMBER: _ClassVar[int]
111
+ DATA_FIELD_NUMBER: _ClassVar[int]
112
+ uuid: str
113
+ data: bytes
114
+ def __init__(self, uuid: _Optional[str] = ..., data: _Optional[bytes] = ...) -> None: ...
115
+ INCLUDE_DEVICE_NAME_FIELD_NUMBER: _ClassVar[int]
116
+ INCLUDE_TX_POWER_LEVEL_FIELD_NUMBER: _ClassVar[int]
117
+ MANUFACTURER_DATA_FIELD_NUMBER: _ClassVar[int]
118
+ SERVICES_FIELD_NUMBER: _ClassVar[int]
119
+ include_device_name: bool
120
+ include_tx_power_level: bool
121
+ manufacturer_data: bytes
122
+ services: _containers.RepeatedCompositeFieldContainer[Chip.BleBeacon.AdvertiseData.Service]
123
+ def __init__(self, include_device_name: bool = ..., include_tx_power_level: bool = ..., manufacturer_data: _Optional[bytes] = ..., services: _Optional[_Iterable[_Union[Chip.BleBeacon.AdvertiseData.Service, _Mapping]]] = ...) -> None: ...
124
+ BT_FIELD_NUMBER: _ClassVar[int]
125
+ ADDRESS_FIELD_NUMBER: _ClassVar[int]
126
+ SETTINGS_FIELD_NUMBER: _ClassVar[int]
127
+ ADV_DATA_FIELD_NUMBER: _ClassVar[int]
128
+ SCAN_RESPONSE_FIELD_NUMBER: _ClassVar[int]
129
+ bt: Chip.Bluetooth
130
+ address: str
131
+ settings: Chip.BleBeacon.AdvertiseSettings
132
+ adv_data: Chip.BleBeacon.AdvertiseData
133
+ scan_response: Chip.BleBeacon.AdvertiseData
134
+ def __init__(self, bt: _Optional[_Union[Chip.Bluetooth, _Mapping]] = ..., address: _Optional[str] = ..., settings: _Optional[_Union[Chip.BleBeacon.AdvertiseSettings, _Mapping]] = ..., adv_data: _Optional[_Union[Chip.BleBeacon.AdvertiseData, _Mapping]] = ..., scan_response: _Optional[_Union[Chip.BleBeacon.AdvertiseData, _Mapping]] = ...) -> None: ...
135
+ KIND_FIELD_NUMBER: _ClassVar[int]
136
+ ID_FIELD_NUMBER: _ClassVar[int]
137
+ NAME_FIELD_NUMBER: _ClassVar[int]
138
+ MANUFACTURER_FIELD_NUMBER: _ClassVar[int]
139
+ PRODUCT_NAME_FIELD_NUMBER: _ClassVar[int]
140
+ BT_FIELD_NUMBER: _ClassVar[int]
141
+ BLE_BEACON_FIELD_NUMBER: _ClassVar[int]
142
+ UWB_FIELD_NUMBER: _ClassVar[int]
143
+ WIFI_FIELD_NUMBER: _ClassVar[int]
144
+ OFFSET_FIELD_NUMBER: _ClassVar[int]
145
+ kind: _common_pb2.ChipKind
146
+ id: int
147
+ name: str
148
+ manufacturer: str
149
+ product_name: str
150
+ bt: Chip.Bluetooth
151
+ ble_beacon: Chip.BleBeacon
152
+ uwb: Chip.Radio
153
+ wifi: Chip.Radio
154
+ offset: Position
155
+ def __init__(self, kind: _Optional[_Union[_common_pb2.ChipKind, str]] = ..., id: _Optional[int] = ..., name: _Optional[str] = ..., manufacturer: _Optional[str] = ..., product_name: _Optional[str] = ..., bt: _Optional[_Union[Chip.Bluetooth, _Mapping]] = ..., ble_beacon: _Optional[_Union[Chip.BleBeacon, _Mapping]] = ..., uwb: _Optional[_Union[Chip.Radio, _Mapping]] = ..., wifi: _Optional[_Union[Chip.Radio, _Mapping]] = ..., offset: _Optional[_Union[Position, _Mapping]] = ...) -> None: ...
156
+
157
+ class ChipCreate(_message.Message):
158
+ __slots__ = ("kind", "address", "name", "manufacturer", "product_name", "ble_beacon", "bt_properties")
159
+ class BleBeaconCreate(_message.Message):
160
+ __slots__ = ("address", "settings", "adv_data", "scan_response")
161
+ ADDRESS_FIELD_NUMBER: _ClassVar[int]
162
+ SETTINGS_FIELD_NUMBER: _ClassVar[int]
163
+ ADV_DATA_FIELD_NUMBER: _ClassVar[int]
164
+ SCAN_RESPONSE_FIELD_NUMBER: _ClassVar[int]
165
+ address: str
166
+ settings: Chip.BleBeacon.AdvertiseSettings
167
+ adv_data: Chip.BleBeacon.AdvertiseData
168
+ scan_response: Chip.BleBeacon.AdvertiseData
169
+ def __init__(self, address: _Optional[str] = ..., settings: _Optional[_Union[Chip.BleBeacon.AdvertiseSettings, _Mapping]] = ..., adv_data: _Optional[_Union[Chip.BleBeacon.AdvertiseData, _Mapping]] = ..., scan_response: _Optional[_Union[Chip.BleBeacon.AdvertiseData, _Mapping]] = ...) -> None: ...
170
+ KIND_FIELD_NUMBER: _ClassVar[int]
171
+ ADDRESS_FIELD_NUMBER: _ClassVar[int]
172
+ NAME_FIELD_NUMBER: _ClassVar[int]
173
+ MANUFACTURER_FIELD_NUMBER: _ClassVar[int]
174
+ PRODUCT_NAME_FIELD_NUMBER: _ClassVar[int]
175
+ BLE_BEACON_FIELD_NUMBER: _ClassVar[int]
176
+ BT_PROPERTIES_FIELD_NUMBER: _ClassVar[int]
177
+ kind: _common_pb2.ChipKind
178
+ address: str
179
+ name: str
180
+ manufacturer: str
181
+ product_name: str
182
+ ble_beacon: ChipCreate.BleBeaconCreate
183
+ bt_properties: _configuration_pb2.Controller
184
+ def __init__(self, kind: _Optional[_Union[_common_pb2.ChipKind, str]] = ..., address: _Optional[str] = ..., name: _Optional[str] = ..., manufacturer: _Optional[str] = ..., product_name: _Optional[str] = ..., ble_beacon: _Optional[_Union[ChipCreate.BleBeaconCreate, _Mapping]] = ..., bt_properties: _Optional[_Union[_configuration_pb2.Controller, _Mapping]] = ...) -> None: ...
185
+
186
+ class Device(_message.Message):
187
+ __slots__ = ("id", "name", "visible", "position", "orientation", "chips")
188
+ ID_FIELD_NUMBER: _ClassVar[int]
189
+ NAME_FIELD_NUMBER: _ClassVar[int]
190
+ VISIBLE_FIELD_NUMBER: _ClassVar[int]
191
+ POSITION_FIELD_NUMBER: _ClassVar[int]
192
+ ORIENTATION_FIELD_NUMBER: _ClassVar[int]
193
+ CHIPS_FIELD_NUMBER: _ClassVar[int]
194
+ id: int
195
+ name: str
196
+ visible: bool
197
+ position: Position
198
+ orientation: Orientation
199
+ chips: _containers.RepeatedCompositeFieldContainer[Chip]
200
+ def __init__(self, id: _Optional[int] = ..., name: _Optional[str] = ..., visible: bool = ..., position: _Optional[_Union[Position, _Mapping]] = ..., orientation: _Optional[_Union[Orientation, _Mapping]] = ..., chips: _Optional[_Iterable[_Union[Chip, _Mapping]]] = ...) -> None: ...
201
+
202
+ class DeviceCreate(_message.Message):
203
+ __slots__ = ("name", "position", "orientation", "chips")
204
+ NAME_FIELD_NUMBER: _ClassVar[int]
205
+ POSITION_FIELD_NUMBER: _ClassVar[int]
206
+ ORIENTATION_FIELD_NUMBER: _ClassVar[int]
207
+ CHIPS_FIELD_NUMBER: _ClassVar[int]
208
+ name: str
209
+ position: Position
210
+ orientation: Orientation
211
+ chips: _containers.RepeatedCompositeFieldContainer[ChipCreate]
212
+ def __init__(self, name: _Optional[str] = ..., position: _Optional[_Union[Position, _Mapping]] = ..., orientation: _Optional[_Union[Orientation, _Mapping]] = ..., chips: _Optional[_Iterable[_Union[ChipCreate, _Mapping]]] = ...) -> None: ...
213
+
214
+ class Scene(_message.Message):
215
+ __slots__ = ("devices",)
216
+ DEVICES_FIELD_NUMBER: _ClassVar[int]
217
+ devices: _containers.RepeatedCompositeFieldContainer[Device]
218
+ def __init__(self, devices: _Optional[_Iterable[_Union[Device, _Mapping]]] = ...) -> None: ...
219
+
220
+ class Capture(_message.Message):
221
+ __slots__ = ("id", "chip_kind", "device_name", "state", "size", "records", "timestamp", "valid")
222
+ ID_FIELD_NUMBER: _ClassVar[int]
223
+ CHIP_KIND_FIELD_NUMBER: _ClassVar[int]
224
+ DEVICE_NAME_FIELD_NUMBER: _ClassVar[int]
225
+ STATE_FIELD_NUMBER: _ClassVar[int]
226
+ SIZE_FIELD_NUMBER: _ClassVar[int]
227
+ RECORDS_FIELD_NUMBER: _ClassVar[int]
228
+ TIMESTAMP_FIELD_NUMBER: _ClassVar[int]
229
+ VALID_FIELD_NUMBER: _ClassVar[int]
230
+ id: int
231
+ chip_kind: _common_pb2.ChipKind
232
+ device_name: str
233
+ state: bool
234
+ size: int
235
+ records: int
236
+ timestamp: _timestamp_pb2.Timestamp
237
+ valid: bool
238
+ def __init__(self, id: _Optional[int] = ..., chip_kind: _Optional[_Union[_common_pb2.ChipKind, str]] = ..., device_name: _Optional[str] = ..., state: bool = ..., size: _Optional[int] = ..., records: _Optional[int] = ..., timestamp: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., valid: bool = ...) -> None: ...
@@ -0,0 +1,32 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: netsim/packet_streamer.proto
4
+ # Protobuf Python Version: 4.25.1
5
+ """Generated protocol buffer code."""
6
+ from google.protobuf import descriptor as _descriptor
7
+ from google.protobuf import descriptor_pool as _descriptor_pool
8
+ from google.protobuf import symbol_database as _symbol_database
9
+ from google.protobuf.internal import builder as _builder
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+ from bumble.transport.grpc_protobuf.netsim import hci_packet_pb2 as netsim_dot_hci__packet__pb2
16
+ from bumble.transport.grpc_protobuf.netsim import startup_pb2 as netsim_dot_startup__pb2
17
+
18
+
19
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1cnetsim/packet_streamer.proto\x12\rnetsim.packet\x1a\x17netsim/hci_packet.proto\x1a\x14netsim/startup.proto\"\x93\x01\n\rPacketRequest\x12\x30\n\x0cinitial_info\x18\x01 \x01(\x0b\x32\x18.netsim.startup.ChipInfoH\x00\x12.\n\nhci_packet\x18\x02 \x01(\x0b\x32\x18.netsim.packet.HCIPacketH\x00\x12\x10\n\x06packet\x18\x03 \x01(\x0cH\x00\x42\x0e\n\x0crequest_type\"t\n\x0ePacketResponse\x12\x0f\n\x05\x65rror\x18\x01 \x01(\tH\x00\x12.\n\nhci_packet\x18\x02 \x01(\x0b\x32\x18.netsim.packet.HCIPacketH\x00\x12\x10\n\x06packet\x18\x03 \x01(\x0cH\x00\x42\x0f\n\rresponse_type2b\n\x0ePacketStreamer\x12P\n\rStreamPackets\x12\x1c.netsim.packet.PacketRequest\x1a\x1d.netsim.packet.PacketResponse(\x01\x30\x01\x62\x06proto3')
20
+
21
+ _globals = globals()
22
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
23
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'netsim.packet_streamer_pb2', _globals)
24
+ if _descriptor._USE_C_DESCRIPTORS == False:
25
+ DESCRIPTOR._options = None
26
+ _globals['_PACKETREQUEST']._serialized_start=95
27
+ _globals['_PACKETREQUEST']._serialized_end=242
28
+ _globals['_PACKETRESPONSE']._serialized_start=244
29
+ _globals['_PACKETRESPONSE']._serialized_end=360
30
+ _globals['_PACKETSTREAMER']._serialized_start=362
31
+ _globals['_PACKETSTREAMER']._serialized_end=460
32
+ # @@protoc_insertion_point(module_scope)
@@ -1,5 +1,5 @@
1
- from . import hci_packet_pb2 as _hci_packet_pb2
2
- from . import startup_pb2 as _startup_pb2
1
+ from bumble.transport.grpc_protobuf.netsim import hci_packet_pb2 as _hci_packet_pb2
2
+ from bumble.transport.grpc_protobuf.netsim import startup_pb2 as _startup_pb2
3
3
  from google.protobuf import descriptor as _descriptor
4
4
  from google.protobuf import message as _message
5
5
  from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
@@ -7,17 +7,17 @@ from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Opti
7
7
  DESCRIPTOR: _descriptor.FileDescriptor
8
8
 
9
9
  class PacketRequest(_message.Message):
10
- __slots__ = ["hci_packet", "initial_info", "packet"]
11
- HCI_PACKET_FIELD_NUMBER: _ClassVar[int]
10
+ __slots__ = ("initial_info", "hci_packet", "packet")
12
11
  INITIAL_INFO_FIELD_NUMBER: _ClassVar[int]
12
+ HCI_PACKET_FIELD_NUMBER: _ClassVar[int]
13
13
  PACKET_FIELD_NUMBER: _ClassVar[int]
14
- hci_packet: _hci_packet_pb2.HCIPacket
15
14
  initial_info: _startup_pb2.ChipInfo
15
+ hci_packet: _hci_packet_pb2.HCIPacket
16
16
  packet: bytes
17
17
  def __init__(self, initial_info: _Optional[_Union[_startup_pb2.ChipInfo, _Mapping]] = ..., hci_packet: _Optional[_Union[_hci_packet_pb2.HCIPacket, _Mapping]] = ..., packet: _Optional[bytes] = ...) -> None: ...
18
18
 
19
19
  class PacketResponse(_message.Message):
20
- __slots__ = ["error", "hci_packet", "packet"]
20
+ __slots__ = ("error", "hci_packet", "packet")
21
21
  ERROR_FIELD_NUMBER: _ClassVar[int]
22
22
  HCI_PACKET_FIELD_NUMBER: _ClassVar[int]
23
23
  PACKET_FIELD_NUMBER: _ClassVar[int]
@@ -2,7 +2,7 @@
2
2
  """Client and server classes corresponding to protobuf-defined services."""
3
3
  import grpc
4
4
 
5
- from . import packet_streamer_pb2 as packet__streamer__pb2
5
+ from bumble.transport.grpc_protobuf.netsim import packet_streamer_pb2 as netsim_dot_packet__streamer__pb2
6
6
 
7
7
 
8
8
  class PacketStreamerStub(object):
@@ -30,8 +30,8 @@ class PacketStreamerStub(object):
30
30
  """
31
31
  self.StreamPackets = channel.stream_stream(
32
32
  '/netsim.packet.PacketStreamer/StreamPackets',
33
- request_serializer=packet__streamer__pb2.PacketRequest.SerializeToString,
34
- response_deserializer=packet__streamer__pb2.PacketResponse.FromString,
33
+ request_serializer=netsim_dot_packet__streamer__pb2.PacketRequest.SerializeToString,
34
+ response_deserializer=netsim_dot_packet__streamer__pb2.PacketResponse.FromString,
35
35
  )
36
36
 
37
37
 
@@ -64,8 +64,8 @@ def add_PacketStreamerServicer_to_server(servicer, server):
64
64
  rpc_method_handlers = {
65
65
  'StreamPackets': grpc.stream_stream_rpc_method_handler(
66
66
  servicer.StreamPackets,
67
- request_deserializer=packet__streamer__pb2.PacketRequest.FromString,
68
- response_serializer=packet__streamer__pb2.PacketResponse.SerializeToString,
67
+ request_deserializer=netsim_dot_packet__streamer__pb2.PacketRequest.FromString,
68
+ response_serializer=netsim_dot_packet__streamer__pb2.PacketResponse.SerializeToString,
69
69
  ),
70
70
  }
71
71
  generic_handler = grpc.method_handlers_generic_handler(
@@ -103,7 +103,7 @@ class PacketStreamer(object):
103
103
  timeout=None,
104
104
  metadata=None):
105
105
  return grpc.experimental.stream_stream(request_iterator, target, '/netsim.packet.PacketStreamer/StreamPackets',
106
- packet__streamer__pb2.PacketRequest.SerializeToString,
107
- packet__streamer__pb2.PacketResponse.FromString,
106
+ netsim_dot_packet__streamer__pb2.PacketRequest.SerializeToString,
107
+ netsim_dot_packet__streamer__pb2.PacketResponse.FromString,
108
108
  options, channel_credentials,
109
109
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@@ -0,0 +1,41 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: netsim/startup.proto
4
+ # Protobuf Python Version: 4.25.1
5
+ """Generated protocol buffer code."""
6
+ from google.protobuf import descriptor as _descriptor
7
+ from google.protobuf import descriptor_pool as _descriptor_pool
8
+ from google.protobuf import symbol_database as _symbol_database
9
+ from google.protobuf.internal import builder as _builder
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+ from bumble.transport.grpc_protobuf.netsim import common_pb2 as netsim_dot_common__pb2
16
+ from bumble.transport.grpc_protobuf.netsim import model_pb2 as netsim_dot_model__pb2
17
+ from bumble.transport.grpc_protobuf.rootcanal import configuration_pb2 as rootcanal_dot_configuration__pb2
18
+
19
+
20
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14netsim/startup.proto\x12\x0enetsim.startup\x1a\x13netsim/common.proto\x1a\x12netsim/model.proto\x1a\x1drootcanal/configuration.proto\"\xb4\x01\n\x0bStartupInfo\x12\x33\n\x07\x64\x65vices\x18\x01 \x03(\x0b\x32\".netsim.startup.StartupInfo.Device\x1ap\n\x06\x44\x65vice\x12\x10\n\x04name\x18\x01 \x01(\tB\x02\x18\x01\x12#\n\x05\x63hips\x18\x02 \x03(\x0b\x32\x14.netsim.startup.Chip\x12/\n\x0b\x64\x65vice_info\x18\x03 \x01(\x0b\x32\x1a.netsim.startup.DeviceInfo\"q\n\x08\x43hipInfo\x12\x10\n\x04name\x18\x01 \x01(\tB\x02\x18\x01\x12\"\n\x04\x63hip\x18\x02 \x01(\x0b\x32\x14.netsim.startup.Chip\x12/\n\x0b\x64\x65vice_info\x18\x03 \x01(\x0b\x32\x1a.netsim.startup.DeviceInfo\"\x7f\n\nDeviceInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\x12\x13\n\x0bsdk_version\x18\x04 \x01(\t\x12\x10\n\x08\x62uild_id\x18\x05 \x01(\t\x12\x0f\n\x07variant\x18\x06 \x01(\t\x12\x0c\n\x04\x61rch\x18\x07 \x01(\t\"\x9b\x02\n\x04\x43hip\x12%\n\x04kind\x18\x01 \x01(\x0e\x32\x17.netsim.common.ChipKind\x12\n\n\x02id\x18\x02 \x01(\t\x12\x14\n\x0cmanufacturer\x18\x03 \x01(\t\x12\x14\n\x0cproduct_name\x18\x04 \x01(\t\x12\r\n\x05\x66\x64_in\x18\x05 \x01(\x05\x12\x0e\n\x06\x66\x64_out\x18\x06 \x01(\x05\x12\x10\n\x08loopback\x18\x07 \x01(\x08\x12:\n\rbt_properties\x18\x08 \x01(\x0b\x32#.rootcanal.configuration.Controller\x12\x0f\n\x07\x61\x64\x64ress\x18\t \x01(\t\x12+\n\x06offset\x18\n \x01(\x0b\x32\x16.netsim.model.PositionH\x00\x88\x01\x01\x42\t\n\x07_offsetb\x06proto3')
21
+
22
+ _globals = globals()
23
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
24
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'netsim.startup_pb2', _globals)
25
+ if _descriptor._USE_C_DESCRIPTORS == False:
26
+ DESCRIPTOR._options = None
27
+ _globals['_STARTUPINFO_DEVICE'].fields_by_name['name']._options = None
28
+ _globals['_STARTUPINFO_DEVICE'].fields_by_name['name']._serialized_options = b'\030\001'
29
+ _globals['_CHIPINFO'].fields_by_name['name']._options = None
30
+ _globals['_CHIPINFO'].fields_by_name['name']._serialized_options = b'\030\001'
31
+ _globals['_STARTUPINFO']._serialized_start=113
32
+ _globals['_STARTUPINFO']._serialized_end=293
33
+ _globals['_STARTUPINFO_DEVICE']._serialized_start=181
34
+ _globals['_STARTUPINFO_DEVICE']._serialized_end=293
35
+ _globals['_CHIPINFO']._serialized_start=295
36
+ _globals['_CHIPINFO']._serialized_end=408
37
+ _globals['_DEVICEINFO']._serialized_start=410
38
+ _globals['_DEVICEINFO']._serialized_end=537
39
+ _globals['_CHIP']._serialized_start=540
40
+ _globals['_CHIP']._serialized_end=823
41
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,76 @@
1
+ from bumble.transport.grpc_protobuf.netsim import common_pb2 as _common_pb2
2
+ from bumble.transport.grpc_protobuf.netsim import model_pb2 as _model_pb2
3
+ from bumble.transport.grpc_protobuf.rootcanal import configuration_pb2 as _configuration_pb2
4
+ from google.protobuf.internal import containers as _containers
5
+ from google.protobuf import descriptor as _descriptor
6
+ from google.protobuf import message as _message
7
+ from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
8
+
9
+ DESCRIPTOR: _descriptor.FileDescriptor
10
+
11
+ class StartupInfo(_message.Message):
12
+ __slots__ = ("devices",)
13
+ class Device(_message.Message):
14
+ __slots__ = ("name", "chips", "device_info")
15
+ NAME_FIELD_NUMBER: _ClassVar[int]
16
+ CHIPS_FIELD_NUMBER: _ClassVar[int]
17
+ DEVICE_INFO_FIELD_NUMBER: _ClassVar[int]
18
+ name: str
19
+ chips: _containers.RepeatedCompositeFieldContainer[Chip]
20
+ device_info: DeviceInfo
21
+ def __init__(self, name: _Optional[str] = ..., chips: _Optional[_Iterable[_Union[Chip, _Mapping]]] = ..., device_info: _Optional[_Union[DeviceInfo, _Mapping]] = ...) -> None: ...
22
+ DEVICES_FIELD_NUMBER: _ClassVar[int]
23
+ devices: _containers.RepeatedCompositeFieldContainer[StartupInfo.Device]
24
+ def __init__(self, devices: _Optional[_Iterable[_Union[StartupInfo.Device, _Mapping]]] = ...) -> None: ...
25
+
26
+ class ChipInfo(_message.Message):
27
+ __slots__ = ("name", "chip", "device_info")
28
+ NAME_FIELD_NUMBER: _ClassVar[int]
29
+ CHIP_FIELD_NUMBER: _ClassVar[int]
30
+ DEVICE_INFO_FIELD_NUMBER: _ClassVar[int]
31
+ name: str
32
+ chip: Chip
33
+ device_info: DeviceInfo
34
+ def __init__(self, name: _Optional[str] = ..., chip: _Optional[_Union[Chip, _Mapping]] = ..., device_info: _Optional[_Union[DeviceInfo, _Mapping]] = ...) -> None: ...
35
+
36
+ class DeviceInfo(_message.Message):
37
+ __slots__ = ("name", "kind", "version", "sdk_version", "build_id", "variant", "arch")
38
+ NAME_FIELD_NUMBER: _ClassVar[int]
39
+ KIND_FIELD_NUMBER: _ClassVar[int]
40
+ VERSION_FIELD_NUMBER: _ClassVar[int]
41
+ SDK_VERSION_FIELD_NUMBER: _ClassVar[int]
42
+ BUILD_ID_FIELD_NUMBER: _ClassVar[int]
43
+ VARIANT_FIELD_NUMBER: _ClassVar[int]
44
+ ARCH_FIELD_NUMBER: _ClassVar[int]
45
+ name: str
46
+ kind: str
47
+ version: str
48
+ sdk_version: str
49
+ build_id: str
50
+ variant: str
51
+ arch: str
52
+ def __init__(self, name: _Optional[str] = ..., kind: _Optional[str] = ..., version: _Optional[str] = ..., sdk_version: _Optional[str] = ..., build_id: _Optional[str] = ..., variant: _Optional[str] = ..., arch: _Optional[str] = ...) -> None: ...
53
+
54
+ class Chip(_message.Message):
55
+ __slots__ = ("kind", "id", "manufacturer", "product_name", "fd_in", "fd_out", "loopback", "bt_properties", "address", "offset")
56
+ KIND_FIELD_NUMBER: _ClassVar[int]
57
+ ID_FIELD_NUMBER: _ClassVar[int]
58
+ MANUFACTURER_FIELD_NUMBER: _ClassVar[int]
59
+ PRODUCT_NAME_FIELD_NUMBER: _ClassVar[int]
60
+ FD_IN_FIELD_NUMBER: _ClassVar[int]
61
+ FD_OUT_FIELD_NUMBER: _ClassVar[int]
62
+ LOOPBACK_FIELD_NUMBER: _ClassVar[int]
63
+ BT_PROPERTIES_FIELD_NUMBER: _ClassVar[int]
64
+ ADDRESS_FIELD_NUMBER: _ClassVar[int]
65
+ OFFSET_FIELD_NUMBER: _ClassVar[int]
66
+ kind: _common_pb2.ChipKind
67
+ id: str
68
+ manufacturer: str
69
+ product_name: str
70
+ fd_in: int
71
+ fd_out: int
72
+ loopback: bool
73
+ bt_properties: _configuration_pb2.Controller
74
+ address: str
75
+ offset: _model_pb2.Position
76
+ def __init__(self, kind: _Optional[_Union[_common_pb2.ChipKind, str]] = ..., id: _Optional[str] = ..., manufacturer: _Optional[str] = ..., product_name: _Optional[str] = ..., fd_in: _Optional[int] = ..., fd_out: _Optional[int] = ..., loopback: bool = ..., bt_properties: _Optional[_Union[_configuration_pb2.Controller, _Mapping]] = ..., address: _Optional[str] = ..., offset: _Optional[_Union[_model_pb2.Position, _Mapping]] = ...) -> None: ...
@@ -0,0 +1,4 @@
1
+ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2
+ """Client and server classes corresponding to protobuf-defined services."""
3
+ import grpc
4
+
File without changes
@@ -0,0 +1,39 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: rootcanal/configuration.proto
4
+ # Protobuf Python Version: 4.25.1
5
+ """Generated protocol buffer code."""
6
+ from google.protobuf import descriptor as _descriptor
7
+ from google.protobuf import descriptor_pool as _descriptor_pool
8
+ from google.protobuf import symbol_database as _symbol_database
9
+ from google.protobuf.internal import builder as _builder
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+
16
+
17
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1drootcanal/configuration.proto\x12\x17rootcanal.configuration\"\xbc\x01\n\x12\x43ontrollerFeatures\x12\x1f\n\x17le_extended_advertising\x18\x01 \x01(\x08\x12\x1f\n\x17le_periodic_advertising\x18\x02 \x01(\x08\x12\x12\n\nll_privacy\x18\x03 \x01(\x08\x12\x11\n\tle_2m_phy\x18\x04 \x01(\x08\x12\x14\n\x0cle_coded_phy\x18\x05 \x01(\x08\x12\'\n\x1fle_connected_isochronous_stream\x18\x06 \x01(\x08\"\x8d\x01\n\x10\x43ontrollerQuirks\x12\x30\n(send_acl_data_before_connection_complete\x18\x01 \x01(\x08\x12\"\n\x1ahas_default_random_address\x18\x02 \x01(\x08\x12#\n\x1bhardware_error_before_reset\x18\x03 \x01(\x08\".\n\x0eVendorFeatures\x12\x0b\n\x03\x63sr\x18\x01 \x01(\x08\x12\x0f\n\x07\x61ndroid\x18\x02 \x01(\x08\"\x8a\x02\n\nController\x12\x39\n\x06preset\x18\x01 \x01(\x0e\x32).rootcanal.configuration.ControllerPreset\x12=\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32+.rootcanal.configuration.ControllerFeatures\x12\x39\n\x06quirks\x18\x03 \x01(\x0b\x32).rootcanal.configuration.ControllerQuirks\x12\x0e\n\x06strict\x18\x04 \x01(\x08\x12\x37\n\x06vendor\x18\x05 \x01(\x0b\x32\'.rootcanal.configuration.VendorFeatures\"Y\n\tTcpServer\x12\x10\n\x08tcp_port\x18\x01 \x02(\x05\x12:\n\rconfiguration\x18\x02 \x01(\x0b\x32#.rootcanal.configuration.Controller\"G\n\rConfiguration\x12\x36\n\ntcp_server\x18\x01 \x03(\x0b\x32\".rootcanal.configuration.TcpServer*H\n\x10\x43ontrollerPreset\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\x0f\n\x0bLAIRD_BL654\x10\x01\x12\x16\n\x12\x43SR_RCK_PTS_DONGLE\x10\x02\x42\x02H\x02')
18
+
19
+ _globals = globals()
20
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
21
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'rootcanal.configuration_pb2', _globals)
22
+ if _descriptor._USE_C_DESCRIPTORS == False:
23
+ _globals['DESCRIPTOR']._options = None
24
+ _globals['DESCRIPTOR']._serialized_options = b'H\002'
25
+ _globals['_CONTROLLERPRESET']._serialized_start=874
26
+ _globals['_CONTROLLERPRESET']._serialized_end=946
27
+ _globals['_CONTROLLERFEATURES']._serialized_start=59
28
+ _globals['_CONTROLLERFEATURES']._serialized_end=247
29
+ _globals['_CONTROLLERQUIRKS']._serialized_start=250
30
+ _globals['_CONTROLLERQUIRKS']._serialized_end=391
31
+ _globals['_VENDORFEATURES']._serialized_start=393
32
+ _globals['_VENDORFEATURES']._serialized_end=439
33
+ _globals['_CONTROLLER']._serialized_start=442
34
+ _globals['_CONTROLLER']._serialized_end=708
35
+ _globals['_TCPSERVER']._serialized_start=710
36
+ _globals['_TCPSERVER']._serialized_end=799
37
+ _globals['_CONFIGURATION']._serialized_start=801
38
+ _globals['_CONFIGURATION']._serialized_end=872
39
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,78 @@
1
+ from google.protobuf.internal import containers as _containers
2
+ from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
3
+ from google.protobuf import descriptor as _descriptor
4
+ from google.protobuf import message as _message
5
+ from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
6
+
7
+ DESCRIPTOR: _descriptor.FileDescriptor
8
+
9
+ class ControllerPreset(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
10
+ __slots__ = ()
11
+ DEFAULT: _ClassVar[ControllerPreset]
12
+ LAIRD_BL654: _ClassVar[ControllerPreset]
13
+ CSR_RCK_PTS_DONGLE: _ClassVar[ControllerPreset]
14
+ DEFAULT: ControllerPreset
15
+ LAIRD_BL654: ControllerPreset
16
+ CSR_RCK_PTS_DONGLE: ControllerPreset
17
+
18
+ class ControllerFeatures(_message.Message):
19
+ __slots__ = ("le_extended_advertising", "le_periodic_advertising", "ll_privacy", "le_2m_phy", "le_coded_phy", "le_connected_isochronous_stream")
20
+ LE_EXTENDED_ADVERTISING_FIELD_NUMBER: _ClassVar[int]
21
+ LE_PERIODIC_ADVERTISING_FIELD_NUMBER: _ClassVar[int]
22
+ LL_PRIVACY_FIELD_NUMBER: _ClassVar[int]
23
+ LE_2M_PHY_FIELD_NUMBER: _ClassVar[int]
24
+ LE_CODED_PHY_FIELD_NUMBER: _ClassVar[int]
25
+ LE_CONNECTED_ISOCHRONOUS_STREAM_FIELD_NUMBER: _ClassVar[int]
26
+ le_extended_advertising: bool
27
+ le_periodic_advertising: bool
28
+ ll_privacy: bool
29
+ le_2m_phy: bool
30
+ le_coded_phy: bool
31
+ le_connected_isochronous_stream: bool
32
+ def __init__(self, le_extended_advertising: bool = ..., le_periodic_advertising: bool = ..., ll_privacy: bool = ..., le_2m_phy: bool = ..., le_coded_phy: bool = ..., le_connected_isochronous_stream: bool = ...) -> None: ...
33
+
34
+ class ControllerQuirks(_message.Message):
35
+ __slots__ = ("send_acl_data_before_connection_complete", "has_default_random_address", "hardware_error_before_reset")
36
+ SEND_ACL_DATA_BEFORE_CONNECTION_COMPLETE_FIELD_NUMBER: _ClassVar[int]
37
+ HAS_DEFAULT_RANDOM_ADDRESS_FIELD_NUMBER: _ClassVar[int]
38
+ HARDWARE_ERROR_BEFORE_RESET_FIELD_NUMBER: _ClassVar[int]
39
+ send_acl_data_before_connection_complete: bool
40
+ has_default_random_address: bool
41
+ hardware_error_before_reset: bool
42
+ def __init__(self, send_acl_data_before_connection_complete: bool = ..., has_default_random_address: bool = ..., hardware_error_before_reset: bool = ...) -> None: ...
43
+
44
+ class VendorFeatures(_message.Message):
45
+ __slots__ = ("csr", "android")
46
+ CSR_FIELD_NUMBER: _ClassVar[int]
47
+ ANDROID_FIELD_NUMBER: _ClassVar[int]
48
+ csr: bool
49
+ android: bool
50
+ def __init__(self, csr: bool = ..., android: bool = ...) -> None: ...
51
+
52
+ class Controller(_message.Message):
53
+ __slots__ = ("preset", "features", "quirks", "strict", "vendor")
54
+ PRESET_FIELD_NUMBER: _ClassVar[int]
55
+ FEATURES_FIELD_NUMBER: _ClassVar[int]
56
+ QUIRKS_FIELD_NUMBER: _ClassVar[int]
57
+ STRICT_FIELD_NUMBER: _ClassVar[int]
58
+ VENDOR_FIELD_NUMBER: _ClassVar[int]
59
+ preset: ControllerPreset
60
+ features: ControllerFeatures
61
+ quirks: ControllerQuirks
62
+ strict: bool
63
+ vendor: VendorFeatures
64
+ def __init__(self, preset: _Optional[_Union[ControllerPreset, str]] = ..., features: _Optional[_Union[ControllerFeatures, _Mapping]] = ..., quirks: _Optional[_Union[ControllerQuirks, _Mapping]] = ..., strict: bool = ..., vendor: _Optional[_Union[VendorFeatures, _Mapping]] = ...) -> None: ...
65
+
66
+ class TcpServer(_message.Message):
67
+ __slots__ = ("tcp_port", "configuration")
68
+ TCP_PORT_FIELD_NUMBER: _ClassVar[int]
69
+ CONFIGURATION_FIELD_NUMBER: _ClassVar[int]
70
+ tcp_port: int
71
+ configuration: Controller
72
+ def __init__(self, tcp_port: _Optional[int] = ..., configuration: _Optional[_Union[Controller, _Mapping]] = ...) -> None: ...
73
+
74
+ class Configuration(_message.Message):
75
+ __slots__ = ("tcp_server",)
76
+ TCP_SERVER_FIELD_NUMBER: _ClassVar[int]
77
+ tcp_server: _containers.RepeatedCompositeFieldContainer[TcpServer]
78
+ def __init__(self, tcp_server: _Optional[_Iterable[_Union[TcpServer, _Mapping]]] = ...) -> None: ...
@@ -0,0 +1,4 @@
1
+ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2
+ """Client and server classes corresponding to protobuf-defined services."""
3
+ import grpc
4
+
bumble/transport/pyusb.py CHANGED
@@ -221,8 +221,9 @@ async def open_pyusb_transport(spec: str) -> Transport:
221
221
  async def close(self):
222
222
  await self.source.stop()
223
223
  await self.sink.stop()
224
- devices_in_use.remove(device.address)
225
224
  usb.util.release_interface(self.device, 0)
225
+ if devices_in_use and device.address in devices_in_use:
226
+ devices_in_use.remove(device.address)
226
227
 
227
228
  usb_find = usb.core.find
228
229
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bumble
3
- Version: 0.0.199
3
+ Version: 0.0.201
4
4
  Summary: Bluetooth Stack for Apps, Emulation, Test and Experimentation
5
5
  Home-page: https://github.com/google/bumble
6
6
  Author: Google
@@ -27,7 +27,7 @@ Requires-Dist: pyusb>=1.2; platform_system != "Emscripten"
27
27
  Requires-Dist: websockets>=12.0; platform_system != "Emscripten"
28
28
  Requires-Dist: cryptography>=39.0; platform_system == "Emscripten"
29
29
  Provides-Extra: avatar
30
- Requires-Dist: pandora-avatar==0.0.9; extra == "avatar"
30
+ Requires-Dist: pandora-avatar==0.0.10; extra == "avatar"
31
31
  Requires-Dist: rootcanal==1.10.0; python_version >= "3.10" and extra == "avatar"
32
32
  Provides-Extra: build
33
33
  Requires-Dist: build>=0.7; extra == "build"