bumble 0.0.222__py3-none-any.whl → 0.0.223__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.
@@ -18,40 +18,30 @@
18
18
  # -----------------------------------------------------------------------------
19
19
  from __future__ import annotations
20
20
 
21
+ import dataclasses
22
+ import enum
21
23
  import struct
22
- from enum import IntEnum
23
-
24
- from bumble import core
25
- from bumble.att import ATT_Error
26
- from bumble.gatt import (
27
- GATT_BODY_SENSOR_LOCATION_CHARACTERISTIC,
28
- GATT_HEART_RATE_CONTROL_POINT_CHARACTERISTIC,
29
- GATT_HEART_RATE_MEASUREMENT_CHARACTERISTIC,
30
- GATT_HEART_RATE_SERVICE,
31
- Characteristic,
32
- CharacteristicValue,
33
- TemplateService,
34
- )
35
- from bumble.gatt_adapters import (
36
- DelegatedCharacteristicAdapter,
37
- PackedCharacteristicAdapter,
38
- SerializableCharacteristicAdapter,
39
- )
40
- from bumble.gatt_client import CharacteristicProxy, ProfileServiceProxy
24
+ from collections.abc import Callable, Sequence
25
+ from typing import Any
26
+
27
+ from typing_extensions import Self
28
+
29
+ from bumble import att, core, device, gatt, gatt_adapters, gatt_client, utils
41
30
 
42
31
 
43
32
  # -----------------------------------------------------------------------------
44
- class HeartRateService(TemplateService):
45
- UUID = GATT_HEART_RATE_SERVICE
33
+ class HeartRateService(gatt.TemplateService):
34
+ UUID = gatt.GATT_HEART_RATE_SERVICE
35
+
46
36
  HEART_RATE_CONTROL_POINT_FORMAT = 'B'
47
37
  CONTROL_POINT_NOT_SUPPORTED = 0x80
48
38
  RESET_ENERGY_EXPENDED = 0x01
49
39
 
50
- heart_rate_measurement_characteristic: Characteristic[HeartRateMeasurement]
51
- body_sensor_location_characteristic: Characteristic[BodySensorLocation]
52
- heart_rate_control_point_characteristic: Characteristic[int]
40
+ heart_rate_measurement_characteristic: gatt.Characteristic[HeartRateMeasurement]
41
+ body_sensor_location_characteristic: gatt.Characteristic[BodySensorLocation]
42
+ heart_rate_control_point_characteristic: gatt.Characteristic[int]
53
43
 
54
- class BodySensorLocation(IntEnum):
44
+ class BodySensorLocation(utils.OpenIntEnum):
55
45
  OTHER = 0
56
46
  CHEST = 1
57
47
  WRIST = 2
@@ -60,82 +50,90 @@ class HeartRateService(TemplateService):
60
50
  EAR_LOBE = 5
61
51
  FOOT = 6
62
52
 
53
+ @dataclasses.dataclass
63
54
  class HeartRateMeasurement:
64
- def __init__(
65
- self,
66
- heart_rate,
67
- sensor_contact_detected=None,
68
- energy_expended=None,
69
- rr_intervals=None,
70
- ):
71
- if heart_rate < 0 or heart_rate > 0xFFFF:
55
+ heart_rate: int
56
+ sensor_contact_detected: bool | None = None
57
+ energy_expended: int | None = None
58
+ rr_intervals: Sequence[float] | None = None
59
+
60
+ class Flag(enum.IntFlag):
61
+ INT16_HEART_RATE = 1 << 0
62
+ SENSOR_CONTACT_DETECTED = 1 << 1
63
+ SENSOR_CONTACT_SUPPORTED = 1 << 2
64
+ ENERGY_EXPENDED_STATUS = 1 << 3
65
+ RR_INTERVAL = 1 << 4
66
+
67
+ def __post_init__(self) -> None:
68
+ if self.heart_rate < 0 or self.heart_rate > 0xFFFF:
72
69
  raise core.InvalidArgumentError('heart_rate out of range')
73
70
 
74
- if energy_expended is not None and (
75
- energy_expended < 0 or energy_expended > 0xFFFF
71
+ if self.energy_expended is not None and (
72
+ self.energy_expended < 0 or self.energy_expended > 0xFFFF
76
73
  ):
77
74
  raise core.InvalidArgumentError('energy_expended out of range')
78
75
 
79
- if rr_intervals:
80
- for rr_interval in rr_intervals:
76
+ if self.rr_intervals:
77
+ for rr_interval in self.rr_intervals:
81
78
  if rr_interval < 0 or rr_interval * 1024 > 0xFFFF:
82
79
  raise core.InvalidArgumentError('rr_intervals out of range')
83
80
 
84
- self.heart_rate = heart_rate
85
- self.sensor_contact_detected = sensor_contact_detected
86
- self.energy_expended = energy_expended
87
- self.rr_intervals = rr_intervals
88
-
89
81
  @classmethod
90
- def from_bytes(cls, data):
82
+ def from_bytes(cls, data: bytes) -> Self:
91
83
  flags = data[0]
92
84
  offset = 1
93
85
 
94
- if flags & 1:
95
- hr = struct.unpack_from('<H', data, offset)[0]
86
+ if flags & cls.Flag.INT16_HEART_RATE:
87
+ heart_rate = struct.unpack_from('<H', data, offset)[0]
96
88
  offset += 2
97
89
  else:
98
- hr = struct.unpack_from('B', data, offset)[0]
90
+ heart_rate = struct.unpack_from('B', data, offset)[0]
99
91
  offset += 1
100
92
 
101
- if flags & (1 << 2):
102
- sensor_contact_detected = flags & (1 << 1) != 0
93
+ if flags & cls.Flag.SENSOR_CONTACT_SUPPORTED:
94
+ sensor_contact_detected = flags & cls.Flag.SENSOR_CONTACT_DETECTED != 0
103
95
  else:
104
96
  sensor_contact_detected = None
105
97
 
106
- if flags & (1 << 3):
98
+ if flags & cls.Flag.ENERGY_EXPENDED_STATUS:
107
99
  energy_expended = struct.unpack_from('<H', data, offset)[0]
108
100
  offset += 2
109
101
  else:
110
102
  energy_expended = None
111
103
 
112
- if flags & (1 << 4):
104
+ rr_intervals: Sequence[float] | None = None
105
+ if flags & cls.Flag.RR_INTERVAL:
113
106
  rr_intervals = tuple(
114
- struct.unpack_from('<H', data, offset + i * 2)[0] / 1024
115
- for i in range((len(data) - offset) // 2)
107
+ struct.unpack_from('<H', data, i)[0] / 1024
108
+ for i in range(offset, len(data), 2)
116
109
  )
117
- else:
118
- rr_intervals = ()
119
110
 
120
- return cls(hr, sensor_contact_detected, energy_expended, rr_intervals)
111
+ return cls(
112
+ heart_rate=heart_rate,
113
+ sensor_contact_detected=sensor_contact_detected,
114
+ energy_expended=energy_expended,
115
+ rr_intervals=rr_intervals,
116
+ )
121
117
 
122
- def __bytes__(self):
118
+ def __bytes__(self) -> bytes:
119
+ flags = 0
123
120
  if self.heart_rate < 256:
124
- flags = 0
125
121
  data = struct.pack('B', self.heart_rate)
126
122
  else:
127
- flags = 1
123
+ flags |= self.Flag.INT16_HEART_RATE
128
124
  data = struct.pack('<H', self.heart_rate)
129
125
 
130
126
  if self.sensor_contact_detected is not None:
131
- flags |= ((1 if self.sensor_contact_detected else 0) << 1) | (1 << 2)
127
+ flags |= self.Flag.SENSOR_CONTACT_SUPPORTED
128
+ if self.sensor_contact_detected:
129
+ flags |= self.Flag.SENSOR_CONTACT_DETECTED
132
130
 
133
131
  if self.energy_expended is not None:
134
- flags |= 1 << 3
132
+ flags |= self.Flag.ENERGY_EXPENDED_STATUS
135
133
  data += struct.pack('<H', self.energy_expended)
136
134
 
137
- if self.rr_intervals:
138
- flags |= 1 << 4
135
+ if self.rr_intervals is not None:
136
+ flags |= self.Flag.RR_INTERVAL
139
137
  data += b''.join(
140
138
  [
141
139
  struct.pack('<H', int(rr_interval * 1024))
@@ -145,57 +143,67 @@ class HeartRateService(TemplateService):
145
143
 
146
144
  return bytes([flags]) + data
147
145
 
148
- def __str__(self):
149
- return (
150
- f'HeartRateMeasurement(heart_rate={self.heart_rate},'
151
- f' sensor_contact_detected={self.sensor_contact_detected},'
152
- f' energy_expended={self.energy_expended},'
153
- f' rr_intervals={self.rr_intervals})'
154
- )
155
-
156
146
  def __init__(
157
147
  self,
158
- read_heart_rate_measurement,
159
- body_sensor_location=None,
160
- reset_energy_expended=None,
148
+ read_heart_rate_measurement: Callable[
149
+ [device.Connection], HeartRateMeasurement
150
+ ],
151
+ body_sensor_location: HeartRateService.BodySensorLocation | None = None,
152
+ reset_energy_expended: Callable[[device.Connection], Any] | None = None,
161
153
  ):
162
- self.heart_rate_measurement_characteristic = SerializableCharacteristicAdapter(
163
- Characteristic(
164
- GATT_HEART_RATE_MEASUREMENT_CHARACTERISTIC,
165
- Characteristic.Properties.NOTIFY,
166
- 0,
167
- CharacteristicValue(read=read_heart_rate_measurement),
168
- ),
169
- HeartRateService.HeartRateMeasurement,
154
+ self.heart_rate_measurement_characteristic = (
155
+ gatt_adapters.SerializableCharacteristicAdapter(
156
+ gatt.Characteristic(
157
+ uuid=gatt.GATT_HEART_RATE_MEASUREMENT_CHARACTERISTIC,
158
+ properties=gatt.Characteristic.Properties.NOTIFY,
159
+ permissions=gatt.Characteristic.Permissions(0),
160
+ value=gatt.CharacteristicValue(read=read_heart_rate_measurement),
161
+ ),
162
+ HeartRateService.HeartRateMeasurement,
163
+ )
170
164
  )
171
- characteristics = [self.heart_rate_measurement_characteristic]
165
+ characteristics: list[gatt.Characteristic] = [
166
+ self.heart_rate_measurement_characteristic
167
+ ]
172
168
 
173
169
  if body_sensor_location is not None:
174
- self.body_sensor_location_characteristic = Characteristic(
175
- GATT_BODY_SENSOR_LOCATION_CHARACTERISTIC,
176
- Characteristic.Properties.READ,
177
- Characteristic.READABLE,
178
- bytes([int(body_sensor_location)]),
170
+ self.body_sensor_location_characteristic = (
171
+ gatt_adapters.EnumCharacteristicAdapter(
172
+ gatt.Characteristic(
173
+ uuid=gatt.GATT_BODY_SENSOR_LOCATION_CHARACTERISTIC,
174
+ properties=gatt.Characteristic.Properties.READ,
175
+ permissions=gatt.Characteristic.READABLE,
176
+ value=body_sensor_location,
177
+ ),
178
+ cls=self.BodySensorLocation,
179
+ length=1,
180
+ )
179
181
  )
180
182
  characteristics.append(self.body_sensor_location_characteristic)
181
183
 
182
184
  if reset_energy_expended:
183
185
 
184
- def write_heart_rate_control_point_value(connection, value):
186
+ def write_heart_rate_control_point_value(
187
+ connection: device.Connection, value: bytes
188
+ ) -> None:
185
189
  if value == self.RESET_ENERGY_EXPENDED:
186
190
  if reset_energy_expended is not None:
187
191
  reset_energy_expended(connection)
188
192
  else:
189
- raise ATT_Error(self.CONTROL_POINT_NOT_SUPPORTED)
190
-
191
- self.heart_rate_control_point_characteristic = PackedCharacteristicAdapter(
192
- Characteristic(
193
- GATT_HEART_RATE_CONTROL_POINT_CHARACTERISTIC,
194
- Characteristic.Properties.WRITE,
195
- Characteristic.WRITEABLE,
196
- CharacteristicValue(write=write_heart_rate_control_point_value),
197
- ),
198
- pack_format=HeartRateService.HEART_RATE_CONTROL_POINT_FORMAT,
193
+ raise att.ATT_Error(self.CONTROL_POINT_NOT_SUPPORTED)
194
+
195
+ self.heart_rate_control_point_characteristic = (
196
+ gatt_adapters.PackedCharacteristicAdapter(
197
+ gatt.Characteristic(
198
+ uuid=gatt.GATT_HEART_RATE_CONTROL_POINT_CHARACTERISTIC,
199
+ properties=gatt.Characteristic.Properties.WRITE,
200
+ permissions=gatt.Characteristic.WRITEABLE,
201
+ value=gatt.CharacteristicValue(
202
+ write=write_heart_rate_control_point_value
203
+ ),
204
+ ),
205
+ pack_format=HeartRateService.HEART_RATE_CONTROL_POINT_FORMAT,
206
+ )
199
207
  )
200
208
  characteristics.append(self.heart_rate_control_point_characteristic)
201
209
 
@@ -203,50 +211,51 @@ class HeartRateService(TemplateService):
203
211
 
204
212
 
205
213
  # -----------------------------------------------------------------------------
206
- class HeartRateServiceProxy(ProfileServiceProxy):
214
+ class HeartRateServiceProxy(gatt_client.ProfileServiceProxy):
207
215
  SERVICE_CLASS = HeartRateService
208
216
 
209
- heart_rate_measurement: (
210
- CharacteristicProxy[HeartRateService.HeartRateMeasurement] | None
211
- )
217
+ heart_rate_measurement: gatt_client.CharacteristicProxy[
218
+ HeartRateService.HeartRateMeasurement
219
+ ]
212
220
  body_sensor_location: (
213
- CharacteristicProxy[HeartRateService.BodySensorLocation] | None
221
+ gatt_client.CharacteristicProxy[HeartRateService.BodySensorLocation] | None
214
222
  )
215
- heart_rate_control_point: CharacteristicProxy[int] | None
223
+ heart_rate_control_point: gatt_client.CharacteristicProxy[int] | None
216
224
 
217
- def __init__(self, service_proxy):
225
+ def __init__(self, service_proxy: gatt_client.ServiceProxy) -> None:
218
226
  self.service_proxy = service_proxy
219
227
 
220
- if characteristics := service_proxy.get_characteristics_by_uuid(
221
- GATT_HEART_RATE_MEASUREMENT_CHARACTERISTIC
222
- ):
223
- self.heart_rate_measurement = SerializableCharacteristicAdapter(
224
- characteristics[0], HeartRateService.HeartRateMeasurement
228
+ self.heart_rate_measurement = (
229
+ gatt_adapters.SerializableCharacteristicProxyAdapter(
230
+ service_proxy.get_required_characteristic_by_uuid(
231
+ gatt.GATT_HEART_RATE_MEASUREMENT_CHARACTERISTIC
232
+ ),
233
+ HeartRateService.HeartRateMeasurement,
225
234
  )
226
- else:
227
- self.heart_rate_measurement = None
235
+ )
228
236
 
229
237
  if characteristics := service_proxy.get_characteristics_by_uuid(
230
- GATT_BODY_SENSOR_LOCATION_CHARACTERISTIC
238
+ gatt.GATT_BODY_SENSOR_LOCATION_CHARACTERISTIC
231
239
  ):
232
- self.body_sensor_location = DelegatedCharacteristicAdapter(
233
- characteristics[0],
234
- decode=lambda value: HeartRateService.BodySensorLocation(value[0]),
240
+ self.body_sensor_location = gatt_adapters.EnumCharacteristicProxyAdapter(
241
+ characteristics[0], cls=HeartRateService.BodySensorLocation, length=1
235
242
  )
236
243
  else:
237
244
  self.body_sensor_location = None
238
245
 
239
246
  if characteristics := service_proxy.get_characteristics_by_uuid(
240
- GATT_HEART_RATE_CONTROL_POINT_CHARACTERISTIC
247
+ gatt.GATT_HEART_RATE_CONTROL_POINT_CHARACTERISTIC
241
248
  ):
242
- self.heart_rate_control_point = PackedCharacteristicAdapter(
243
- characteristics[0],
244
- pack_format=HeartRateService.HEART_RATE_CONTROL_POINT_FORMAT,
249
+ self.heart_rate_control_point = (
250
+ gatt_adapters.PackedCharacteristicProxyAdapter(
251
+ characteristics[0],
252
+ pack_format=HeartRateService.HEART_RATE_CONTROL_POINT_FORMAT,
253
+ )
245
254
  )
246
255
  else:
247
256
  self.heart_rate_control_point = None
248
257
 
249
- async def reset_energy_expended(self):
258
+ async def reset_energy_expended(self) -> None:
250
259
  if self.heart_rate_control_point is not None:
251
260
  return await self.heart_rate_control_point.write_value(
252
261
  HeartRateService.RESET_ENERGY_EXPENDED
bumble/rfcomm.py CHANGED
@@ -800,7 +800,7 @@ class Multiplexer(utils.EventEmitter):
800
800
 
801
801
  def send_frame(self, frame: RFCOMM_Frame) -> None:
802
802
  logger.debug(f'>>> Multiplexer sending {frame}')
803
- self.l2cap_channel.send_pdu(frame)
803
+ self.l2cap_channel.write(bytes(frame))
804
804
 
805
805
  def on_pdu(self, pdu: bytes) -> None:
806
806
  frame = RFCOMM_Frame.from_bytes(pdu)
bumble/sdp.py CHANGED
@@ -847,7 +847,7 @@ class Client:
847
847
  self.pending_request = request
848
848
 
849
849
  try:
850
- self.channel.send_pdu(bytes(request))
850
+ self.channel.write(bytes(request))
851
851
  return await self.pending_response
852
852
  finally:
853
853
  self.pending_request = None
@@ -1061,7 +1061,7 @@ class Server:
1061
1061
 
1062
1062
  def send_response(self, response):
1063
1063
  logger.debug(f'{color(">>> Sending SDP Response", "blue")}: {response}')
1064
- self.channel.send_pdu(response)
1064
+ self.channel.write(response)
1065
1065
 
1066
1066
  def match_services(self, search_pattern: DataElement) -> dict[int, Service]:
1067
1067
  # Find the services for which the attributes in the pattern is a subset of the
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bumble
3
- Version: 0.0.222
3
+ Version: 0.0.223
4
4
  Summary: Bluetooth Stack for Apps, Emulation, Test and Experimentation
5
5
  Author-email: Google <bumble-dev@google.com>
6
6
  License-Expression: Apache-2.0
@@ -1,11 +1,11 @@
1
1
  bumble/__init__.py,sha256=Q8jkz6rgl95IMAeInQVt_2GLoJl3DcEP2cxtrQ-ho5c,110
2
- bumble/_version.py,sha256=iCVPnXJk250i-zuGezYSSco90VVqd3Imnx_2NCDTb8M,708
2
+ bumble/_version.py,sha256=9uh_9z-AI3P_KHkj7Uha8PG4fBl1EJI_OI6DNBuZeXA,708
3
3
  bumble/a2dp.py,sha256=4eFKYOXkl10TRAJqVw4no6aCilYHdmgtd2ZMNY0yNQo,33436
4
4
  bumble/at.py,sha256=xtboorCqSdRDoIfRFOIhvV5x2cgXaYqKk5FSMNzuYPo,3062
5
- bumble/att.py,sha256=H-6zsJhM59KH7iuDZ3mksHXKdywPlng-AwSSd9SHLZE,36039
5
+ bumble/att.py,sha256=FkpwAauU8RPh25n90v8NxXU276dAEQJwX37jwUoled0,38553
6
6
  bumble/avc.py,sha256=0RY16pJ1zAPqqMjWhNW9MQHrqFo2A32ddYUH8gvRDn0,16352
7
- bumble/avctp.py,sha256=xDvoSGnJLiGPZVchQEcmMALokrt3B_7Xhu5E6AaU39Y,9671
8
- bumble/avdtp.py,sha256=ipl1kFVjy2uMiLQu_1WSt6bpzJgCVRz1SDWL0pSANJc,78298
7
+ bumble/avctp.py,sha256=Q_cb3CU9g85owuhDGNpYt2y68szGP0-8EQ9KUlXnkis,9668
8
+ bumble/avdtp.py,sha256=nsh_9WkukJH8mEuBjnnAxpQ2QmbY5Yk4Sbtd-ujD1IU,78289
9
9
  bumble/avrcp.py,sha256=urh7lTSRoHaT3IhlfxHKkQfkg05HiX7ZZ-j7PA1IjbY,87257
10
10
  bumble/bridge.py,sha256=yXwZNUe7pRpuTt41PEmgtfjBLpQKdDwvcxfbYxObqIU,3015
11
11
  bumble/codecs.py,sha256=JZnz-8XVNg8QP2_Y_x6h3yBUgSJW7lwdrsPTLBW_d10,20933
@@ -15,28 +15,28 @@ bumble/controller.py,sha256=M8ZFo_X-5duyeyvfnxBnBKosWwQeWLvaIJ0uXZbfzS4,98828
15
15
  bumble/core.py,sha256=bmMtfJI4gnNasYGRddLRih5Jp889IMxOO4iXrcOwi88,94451
16
16
  bumble/data_types.py,sha256=vh84h4eHjzNtqbLdoe5_ECXTDGztm7bZ9YpAfwtWNLI,32858
17
17
  bumble/decoder.py,sha256=_mZbnuwURkpSrtoTqFjoqe6z_NxakbUxd3zybhGHHz0,9691
18
- bumble/device.py,sha256=Ee0HzXnrNTgwFWiZTdltlsZ6MMcerzrKmFqUtcDnFVA,249271
18
+ bumble/device.py,sha256=6l4ziCEn58C_joJEhL6lSQXDgC0KTj3zTo4FqFn8iww,249207
19
19
  bumble/gap.py,sha256=j5mevt__i_fSdIc_B3x7YvCJLeCc7bVq8omRphxwXNw,2144
20
- bumble/gatt.py,sha256=f3ru77hYwXjNaypVAWat-Z_2SUwblaJaHJFQEDqdTA0,34462
20
+ bumble/gatt.py,sha256=u_HaOEUzcNp5WnZ7fqQ9z3JUuZOA3DwvL41PD8asNHY,34482
21
21
  bumble/gatt_adapters.py,sha256=gTOji4M7V0R6NhxULDZi4KcN6yAis_q9Colvwj6Skto,13163
22
- bumble/gatt_client.py,sha256=rRMM-3sjsnx316aw8P_RdoTQFBfe862-eUtuhGlKJGI,45964
23
- bumble/gatt_server.py,sha256=cCYQ_o5u5H3xoYBVukdSmJ6LlwZLYBiaPORcqd6qDmk,40013
24
- bumble/hci.py,sha256=KYUayxT8WoApZmCnwZo2ozHgbs1k2DORklIM7-Tayuo,329868
22
+ bumble/gatt_client.py,sha256=yUXcsVYSGS4uyXGpwfWyPjXA_FNCuWxBDelNS2YMVRw,45923
23
+ bumble/gatt_server.py,sha256=DTwlSNnFiuEk-ZglY7uJvITNuN17gv1Hp60RJIQIyjM,43960
24
+ bumble/hci.py,sha256=jiKKrCfDf9cbjbsHurFiI0Xo3_NAyjP-2Bfx8F09hh4,329838
25
25
  bumble/helpers.py,sha256=swdXlElfaw-RbfMIK_Qch1Hh4Rz1B6bjN4Yl0yv-T80,12589
26
26
  bumble/hfp.py,sha256=OwANwtXWBU3cwAnZ6oODvI0reZfKwCuG0DLI18mevr0,76696
27
- bumble/hid.py,sha256=dEFUN22YYjVcf7h6bdXsjWK8xUp6kDT6ffuDr9zSq-I,21031
28
- bumble/host.py,sha256=2W_BFI3q7ZBoL231Ii6oEuBDxcbV2phA9vDpk9ZKZ-Q,67833
27
+ bumble/hid.py,sha256=VAGvSVHFDKMR9n5QKWAdKX_qyP3K0EWlTvoPivxeJS0,21025
28
+ bumble/host.py,sha256=afy8hIJ-WFlnvg1FuewLf3AM6M4BFOSy8T9bF8PUmxg,68159
29
29
  bumble/keys.py,sha256=iioiJZkqCoK2qopjDLLM0aeSy9l4bBrSyHfit4tNJek,13356
30
- bumble/l2cap.py,sha256=DluqPOWcG0vuw4H6fU1PWHDg6a1d8U9NCkHkU_bouEE,111741
30
+ bumble/l2cap.py,sha256=7C2GExYxM2RDkIw-qHRcc8Oqzve2snrwd-NtGwTaxkw,111864
31
31
  bumble/link.py,sha256=3dvwLyUlkfUPHsOthdOvl9wytToQqVweLmXWlub7Z34,5403
32
32
  bumble/ll.py,sha256=EH3OIM-6KL1Q22bqa6G1x-SgFqHOqc3_8nVj66RII0Q,5380
33
33
  bumble/lmp.py,sha256=9TsV8W1lbudCEytzhWg0N492xFbNEWy1-a3VuF1US-k,10433
34
34
  bumble/logging.py,sha256=WvB9v6HxsnmN6DaG-oIcE7DbFcE-jT8YN3T0PGbWbD8,2351
35
35
  bumble/pairing.py,sha256=W0_Mddzl6bdcvzeV3XGtuRD-vBObMt_u9d0mpoRUtPM,10072
36
36
  bumble/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- bumble/rfcomm.py,sha256=eYgUFzaGgd5uAtAqSTeqS5qcKO8vrRzV_k-GAnWF5TY,41020
37
+ bumble/rfcomm.py,sha256=5m1Z22u_vQQywVwfm0hbe3HoiTAYi6hWJBJ3sV-SedM,41024
38
38
  bumble/rtp.py,sha256=wyAQJ3dRU31USfZT5DgpvC_TSVYU1QPDSg_uK9-i8V4,3464
39
- bumble/sdp.py,sha256=T8xChueD1jDyvgTVZ7AAJZF4_AgH6jDx_A312dorodE,49522
39
+ bumble/sdp.py,sha256=vXhf4-JFf1E9T5a6Aval8YJxiUs2OHMtbUSfEBk9iSo,49516
40
40
  bumble/smp.py,sha256=ERvw054hdp_eHxBlod8xIcWpixqsucPTGDK_tagGil0,78514
41
41
  bumble/snoop.py,sha256=-6QEgpOdGYUx3u5fkPTHv_xM9C4RnQFzZQQb6TglZpc,5939
42
42
  bumble/utils.py,sha256=oUIUKOdWuw1g1Gx9GpGGE4H6mNidDkClIo3xWLghP8g,16906
@@ -60,7 +60,7 @@ bumble/apps/rfcomm_bridge.py,sha256=Czxen2DR-XqlLpWWAXn8TU-kC56WiPeHv6CbtOWaFhg,
60
60
  bumble/apps/scan.py,sha256=UD3Ej5YYRZUxGjEG3fhXR4yCr1T-c_4NYQ1BKoME-dE,8530
61
61
  bumble/apps/show.py,sha256=j0Av4WC5FMRsdQ7M47i2CO7q1KYgavuRSwGUf9wkbPY,6313
62
62
  bumble/apps/unbond.py,sha256=jBUpIQdNbWcHitqHT_i6yRMcCxyMjIc2KJSit-6qiZs,3134
63
- bumble/apps/usb_probe.py,sha256=pKYznLtC6oAatxt4t19q_FDO70N08MAuJqU-NJYXjZU,10313
63
+ bumble/apps/usb_probe.py,sha256=N-7Uh1_AZpEE7IOYYGKiiI48RgKK61LI3FRsejTKYsE,10913
64
64
  bumble/apps/lea_unicast/app.py,sha256=maxHMWlU0SErkuUXqrY-kyxKbKcKlb-nFcIfnMxlyXc,17401
65
65
  bumble/apps/lea_unicast/index.html,sha256=d1IHsYd8TGOnxNZKaHolf4Y-7VwT1kO9Z72vpGMdy3k,2354
66
66
  bumble/apps/player/player.py,sha256=RAMtBpkht3rsGh8p2DgA1LK7hTUbzjv4URQ6iN2t3ws,22289
@@ -78,12 +78,12 @@ bumble/crypto/cryptography.py,sha256=yHznoBZ-hd8XqWheipkgn3Vdt5JydLxlTM3nTp5ayvc
78
78
  bumble/drivers/__init__.py,sha256=ZrQx4P-tTeR8XDqVjmKjrrkacsPwD1EA3XPPfnhKWFg,3519
79
79
  bumble/drivers/common.py,sha256=pS783hudolLZAzF8IUWp7g6TXyQsUCEzqCsd1VGeYfQ,1507
80
80
  bumble/drivers/intel.py,sha256=lByfjyZw6MYrJNX_lox6ApQncgymq_6I-R-UQ3zalGs,24571
81
- bumble/drivers/rtk.py,sha256=dJ-cB_GhXydmorf6RoHMHk-kCgG3c9Gz3Gh4--kJs1U,22687
81
+ bumble/drivers/rtk.py,sha256=u_Fl7WeMKHFB5RqcSDMPXF1q-DhEjEgpfPiFn3yrbkg,23291
82
82
  bumble/pandora/__init__.py,sha256=tDrmvwHjMQUPL_kESGsLq5pnk329yzFTB9g-NPW8Wu0,3525
83
83
  bumble/pandora/config.py,sha256=wfmko9UDEZWeRC4fccUdJnHn9D2Bus15R-Tqn2bLoAY,2384
84
84
  bumble/pandora/device.py,sha256=_kL4G0XVjAc8OHlaIoDisb8EFQG4K7kHrvMqq84BrYY,5339
85
85
  bumble/pandora/host.py,sha256=FrQt63Xh7AEH7yz3ZkWVJL-PNwi-vz4jfFhApE7z8Qw,39471
86
- bumble/pandora/l2cap.py,sha256=mAj8tSnBu9La_s6Izc1PAO7-1bYFar4ZROtkWXz7fi8,11763
86
+ bumble/pandora/l2cap.py,sha256=OpfGkp4wNSYlSxxThTiBQahSdkTkBlN11aydIrhaESc,11760
87
87
  bumble/pandora/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
88
  bumble/pandora/security.py,sha256=L-LDRYlw0pTZY7BBs2fzjOt1YAD_JUv2kXwI0CC7vp0,22780
89
89
  bumble/pandora/utils.py,sha256=U0NhTklcnKuHBYovIWpBo7Y74Lm2zJkGTautuUMx7gM,3950
@@ -95,7 +95,7 @@ bumble/profiles/ascs.py,sha256=znqo7Yx2VyHODkc_1hHR6R1ArZUliao5kZ6qjX1_WdE,25845
95
95
  bumble/profiles/asha.py,sha256=Nq7okABxPafbgAhu_SAQeieDH6xSM5L49ZA5JmXY-9A,10464
96
96
  bumble/profiles/bap.py,sha256=uy5eapnxekgYBELpkzNPleoM6fkNZ6wGcWB-RaEVTS8,21594
97
97
  bumble/profiles/bass.py,sha256=81ak6tHnQ8kRz64-khNBlSihAo_cbJ8Su9thNhpWQ2s,14690
98
- bumble/profiles/battery_service.py,sha256=BhyiRiTgxew487BMaIL1M0lWJtetMAfINtSunyr6dJY,2511
98
+ bumble/profiles/battery_service.py,sha256=ri_sAukZwLCLmTTnQFiBsZsx1oLFuwrPa7P0BRt1h_Q,2446
99
99
  bumble/profiles/cap.py,sha256=0cDukO0HfaCOw3yt6Z1fw7DHt_SxBEWCuTRq8YGuH28,1927
100
100
  bumble/profiles/csip.py,sha256=-wLiahw-xRPqEGHdYg8467LiLlJSLY3qHUDcHvOeWeY,10047
101
101
  bumble/profiles/device_information_service.py,sha256=PK_1r21kUMdY8PYu6--kuL66KWeLQaURdjjNZVzMd84,6268
@@ -103,7 +103,7 @@ bumble/profiles/gap.py,sha256=wIbn95AXXTAxb6UBwicr6KwHepdMUgTaW2dbvjRPsBc,3980
103
103
  bumble/profiles/gatt_service.py,sha256=CfIbwsR7yt1jmzvHJIOZSOceUEjvBELeJYNVKNu-Pew,6696
104
104
  bumble/profiles/gmap.py,sha256=SZQJOtgO2xTE5vtF4umiWzN4ZtqLY64n1BlPqpTYiHE,7263
105
105
  bumble/profiles/hap.py,sha256=0bRGrJuJzTVQJmFpyuG7vP9sWtPBTVmJDN4E04ufo2w,26510
106
- bumble/profiles/heart_rate_service.py,sha256=_nT6n_SPUQAS2kTfa4wqAE7NbIv_3eE-7op_us6Enmg,9219
106
+ bumble/profiles/heart_rate_service.py,sha256=VOc7spIsgJo0jdziT35FpS0F596L6m7sL1kAfUFXtYU,10166
107
107
  bumble/profiles/le_audio.py,sha256=X1CrpxjoF2dje-AlrqUXkLfmqeGfLT2W52pPK1Ow0kM,5831
108
108
  bumble/profiles/mcp.py,sha256=OjnxykE8kz8khl8rLRmhKsq4tz67N2S3mPGvvQQQqPQ,17688
109
109
  bumble/profiles/pacs.py,sha256=xel7MIz1-o2hqcRLCxbn6fby_b35lMSeT3vKdNGb7VQ,10333
@@ -177,9 +177,9 @@ bumble/vendor/android/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
177
177
  bumble/vendor/android/hci.py,sha256=Fk1SQVhhdoMGg65TIBX7C3FcgqqKfJ3ulMb5n2jfvkc,10457
178
178
  bumble/vendor/zephyr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
179
  bumble/vendor/zephyr/hci.py,sha256=ysct40uIVohaKKLrWjcWo-7YqozU17xGia2dWeHoMoI,3435
180
- bumble-0.0.222.dist-info/licenses/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
181
- bumble-0.0.222.dist-info/METADATA,sha256=jd7Hsfxcgz2mNZH-dMImjU_S5x4ohYLW9pIBY256RfA,6218
182
- bumble-0.0.222.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
183
- bumble-0.0.222.dist-info/entry_points.txt,sha256=mX5dzixNMRo4CTAEQqiYTr-JIaWF62TYrRvJOstjjL8,1081
184
- bumble-0.0.222.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
185
- bumble-0.0.222.dist-info/RECORD,,
180
+ bumble-0.0.223.dist-info/licenses/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
181
+ bumble-0.0.223.dist-info/METADATA,sha256=LYNBJ-QVHbo9Bkw5QGle8mgX1TUAwlj4WfLIpqtvfJU,6218
182
+ bumble-0.0.223.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
183
+ bumble-0.0.223.dist-info/entry_points.txt,sha256=mX5dzixNMRo4CTAEQqiYTr-JIaWF62TYrRvJOstjjL8,1081
184
+ bumble-0.0.223.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
185
+ bumble-0.0.223.dist-info/RECORD,,