bumble 0.0.198__tar.gz → 0.0.199__tar.gz

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 (587) hide show
  1. {bumble-0.0.198/bumble.egg-info → bumble-0.0.199}/PKG-INFO +1 -1
  2. {bumble-0.0.198 → bumble-0.0.199}/apps/pair.py +32 -5
  3. {bumble-0.0.198 → bumble-0.0.199}/bumble/_version.py +2 -2
  4. {bumble-0.0.198 → bumble-0.0.199}/bumble/att.py +56 -40
  5. {bumble-0.0.198 → bumble-0.0.199}/bumble/avdtp.py +2 -2
  6. {bumble-0.0.198 → bumble-0.0.199}/bumble/decoder.py +14 -10
  7. {bumble-0.0.198 → bumble-0.0.199}/bumble/drivers/rtk.py +19 -5
  8. {bumble-0.0.198 → bumble-0.0.199}/bumble/gatt.py +24 -19
  9. {bumble-0.0.198 → bumble-0.0.199}/bumble/gatt_client.py +5 -25
  10. {bumble-0.0.198 → bumble-0.0.199}/bumble/gatt_server.py +14 -6
  11. {bumble-0.0.198 → bumble-0.0.199}/bumble/hci.py +272 -7
  12. {bumble-0.0.198 → bumble-0.0.199}/bumble/host.py +16 -6
  13. {bumble-0.0.198 → bumble-0.0.199}/bumble/pandora/__init__.py +3 -0
  14. bumble-0.0.199/bumble/pandora/l2cap.py +310 -0
  15. bumble-0.0.199/bumble/profiles/aics.py +520 -0
  16. bumble-0.0.199/bumble/profiles/asha.py +295 -0
  17. bumble-0.0.199/bumble/profiles/hap.py +665 -0
  18. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/vcp.py +5 -3
  19. {bumble-0.0.198 → bumble-0.0.199}/bumble/smp.py +23 -4
  20. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/pyusb.py +19 -2
  21. {bumble-0.0.198 → bumble-0.0.199/bumble.egg-info}/PKG-INFO +1 -1
  22. {bumble-0.0.198 → bumble-0.0.199}/bumble.egg-info/SOURCES.txt +9 -1
  23. bumble-0.0.199/examples/asha_sink.html +95 -0
  24. {bumble-0.0.198 → bumble-0.0.199}/examples/asha_sink1.json +2 -1
  25. {bumble-0.0.198 → bumble-0.0.199}/examples/asha_sink2.json +2 -1
  26. bumble-0.0.199/examples/run_asha_sink.py +119 -0
  27. bumble-0.0.199/examples/run_hap_server.py +107 -0
  28. bumble-0.0.199/tests/aics_test.py +494 -0
  29. bumble-0.0.199/tests/asha_test.py +163 -0
  30. {bumble-0.0.198 → bumble-0.0.199}/tests/gatt_test.py +28 -0
  31. bumble-0.0.199/tests/hap_test.py +227 -0
  32. {bumble-0.0.198 → bumble-0.0.199}/tests/hci_test.py +47 -0
  33. {bumble-0.0.198 → bumble-0.0.199}/tests/vcp_test.py +3 -0
  34. bumble-0.0.198/bumble/profiles/asha_service.py +0 -193
  35. bumble-0.0.198/examples/run_asha_sink.py +0 -207
  36. {bumble-0.0.198 → bumble-0.0.199}/.devcontainer/devcontainer.json +0 -0
  37. {bumble-0.0.198 → bumble-0.0.199}/.git-blame-ignore-revs +0 -0
  38. {bumble-0.0.198 → bumble-0.0.199}/.github/workflows/code-check.yml +0 -0
  39. {bumble-0.0.198 → bumble-0.0.199}/.github/workflows/codeql-analysis.yml +0 -0
  40. {bumble-0.0.198 → bumble-0.0.199}/.github/workflows/python-avatar.yml +0 -0
  41. {bumble-0.0.198 → bumble-0.0.199}/.github/workflows/python-build-test.yml +0 -0
  42. {bumble-0.0.198 → bumble-0.0.199}/.github/workflows/python-publish.yml +0 -0
  43. {bumble-0.0.198 → bumble-0.0.199}/.gitignore +0 -0
  44. {bumble-0.0.198 → bumble-0.0.199}/.vscode/settings.json +0 -0
  45. {bumble-0.0.198 → bumble-0.0.199}/CONTRIBUTING.md +0 -0
  46. {bumble-0.0.198 → bumble-0.0.199}/LICENSE +0 -0
  47. {bumble-0.0.198 → bumble-0.0.199}/README.md +0 -0
  48. {bumble-0.0.198 → bumble-0.0.199}/apps/README.md +0 -0
  49. {bumble-0.0.198 → bumble-0.0.199}/apps/__init__.py +0 -0
  50. {bumble-0.0.198 → bumble-0.0.199}/apps/auracast.py +0 -0
  51. {bumble-0.0.198 → bumble-0.0.199}/apps/bench.py +0 -0
  52. {bumble-0.0.198 → bumble-0.0.199}/apps/ble_rpa_tool.py +0 -0
  53. {bumble-0.0.198 → bumble-0.0.199}/apps/console.py +0 -0
  54. {bumble-0.0.198 → bumble-0.0.199}/apps/controller_info.py +0 -0
  55. {bumble-0.0.198 → bumble-0.0.199}/apps/controller_loopback.py +0 -0
  56. {bumble-0.0.198 → bumble-0.0.199}/apps/controllers.py +0 -0
  57. {bumble-0.0.198 → bumble-0.0.199}/apps/device_info.py +0 -0
  58. {bumble-0.0.198 → bumble-0.0.199}/apps/gatt_dump.py +0 -0
  59. {bumble-0.0.198 → bumble-0.0.199}/apps/gg_bridge.py +0 -0
  60. {bumble-0.0.198 → bumble-0.0.199}/apps/hci_bridge.py +0 -0
  61. {bumble-0.0.198 → bumble-0.0.199}/apps/l2cap_bridge.py +0 -0
  62. {bumble-0.0.198 → bumble-0.0.199}/apps/lea_unicast/app.py +0 -0
  63. {bumble-0.0.198 → bumble-0.0.199}/apps/lea_unicast/index.html +0 -0
  64. {bumble-0.0.198 → bumble-0.0.199}/apps/lea_unicast/liblc3.wasm +0 -0
  65. {bumble-0.0.198 → bumble-0.0.199}/apps/link_relay/__init__.py +0 -0
  66. {bumble-0.0.198 → bumble-0.0.199}/apps/link_relay/link_relay.py +0 -0
  67. {bumble-0.0.198 → bumble-0.0.199}/apps/link_relay/logging.yml +0 -0
  68. {bumble-0.0.198 → bumble-0.0.199}/apps/pandora_server.py +0 -0
  69. {bumble-0.0.198 → bumble-0.0.199}/apps/rfcomm_bridge.py +0 -0
  70. {bumble-0.0.198 → bumble-0.0.199}/apps/scan.py +0 -0
  71. {bumble-0.0.198 → bumble-0.0.199}/apps/show.py +0 -0
  72. {bumble-0.0.198 → bumble-0.0.199}/apps/speaker/__init__.py +0 -0
  73. {bumble-0.0.198 → bumble-0.0.199}/apps/speaker/logo.svg +0 -0
  74. {bumble-0.0.198 → bumble-0.0.199}/apps/speaker/speaker.css +0 -0
  75. {bumble-0.0.198 → bumble-0.0.199}/apps/speaker/speaker.html +0 -0
  76. {bumble-0.0.198 → bumble-0.0.199}/apps/speaker/speaker.js +0 -0
  77. {bumble-0.0.198 → bumble-0.0.199}/apps/speaker/speaker.py +0 -0
  78. {bumble-0.0.198 → bumble-0.0.199}/apps/unbond.py +0 -0
  79. {bumble-0.0.198 → bumble-0.0.199}/apps/usb_probe.py +0 -0
  80. {bumble-0.0.198 → bumble-0.0.199}/bumble/__init__.py +0 -0
  81. {bumble-0.0.198 → bumble-0.0.199}/bumble/a2dp.py +0 -0
  82. {bumble-0.0.198 → bumble-0.0.199}/bumble/at.py +0 -0
  83. {bumble-0.0.198 → bumble-0.0.199}/bumble/avc.py +0 -0
  84. {bumble-0.0.198 → bumble-0.0.199}/bumble/avctp.py +0 -0
  85. {bumble-0.0.198 → bumble-0.0.199}/bumble/avrcp.py +0 -0
  86. {bumble-0.0.198 → bumble-0.0.199}/bumble/bridge.py +0 -0
  87. {bumble-0.0.198 → bumble-0.0.199}/bumble/codecs.py +0 -0
  88. {bumble-0.0.198 → bumble-0.0.199}/bumble/colors.py +0 -0
  89. {bumble-0.0.198 → bumble-0.0.199}/bumble/company_ids.py +0 -0
  90. {bumble-0.0.198 → bumble-0.0.199}/bumble/controller.py +0 -0
  91. {bumble-0.0.198 → bumble-0.0.199}/bumble/core.py +0 -0
  92. {bumble-0.0.198 → bumble-0.0.199}/bumble/crypto.py +0 -0
  93. {bumble-0.0.198 → bumble-0.0.199}/bumble/device.py +0 -0
  94. {bumble-0.0.198 → bumble-0.0.199}/bumble/drivers/__init__.py +0 -0
  95. {bumble-0.0.198 → bumble-0.0.199}/bumble/drivers/common.py +0 -0
  96. {bumble-0.0.198 → bumble-0.0.199}/bumble/drivers/intel.py +0 -0
  97. {bumble-0.0.198 → bumble-0.0.199}/bumble/gap.py +0 -0
  98. {bumble-0.0.198 → bumble-0.0.199}/bumble/helpers.py +0 -0
  99. {bumble-0.0.198 → bumble-0.0.199}/bumble/hfp.py +0 -0
  100. {bumble-0.0.198 → bumble-0.0.199}/bumble/hid.py +0 -0
  101. {bumble-0.0.198 → bumble-0.0.199}/bumble/keys.py +0 -0
  102. {bumble-0.0.198 → bumble-0.0.199}/bumble/l2cap.py +0 -0
  103. {bumble-0.0.198 → bumble-0.0.199}/bumble/link.py +0 -0
  104. {bumble-0.0.198 → bumble-0.0.199}/bumble/pairing.py +0 -0
  105. {bumble-0.0.198 → bumble-0.0.199}/bumble/pandora/config.py +0 -0
  106. {bumble-0.0.198 → bumble-0.0.199}/bumble/pandora/device.py +0 -0
  107. {bumble-0.0.198 → bumble-0.0.199}/bumble/pandora/host.py +0 -0
  108. {bumble-0.0.198 → bumble-0.0.199}/bumble/pandora/py.typed +0 -0
  109. {bumble-0.0.198 → bumble-0.0.199}/bumble/pandora/security.py +0 -0
  110. {bumble-0.0.198 → bumble-0.0.199}/bumble/pandora/utils.py +0 -0
  111. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/__init__.py +0 -0
  112. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/ascs.py +0 -0
  113. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/bap.py +0 -0
  114. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/bass.py +0 -0
  115. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/battery_service.py +0 -0
  116. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/cap.py +0 -0
  117. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/csip.py +0 -0
  118. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/device_information_service.py +0 -0
  119. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/gap.py +0 -0
  120. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/heart_rate_service.py +0 -0
  121. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/le_audio.py +0 -0
  122. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/mcp.py +0 -0
  123. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/pacs.py +0 -0
  124. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/pbp.py +0 -0
  125. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/py.typed +0 -0
  126. {bumble-0.0.198 → bumble-0.0.199}/bumble/profiles/tmap.py +0 -0
  127. {bumble-0.0.198 → bumble-0.0.199}/bumble/py.typed +0 -0
  128. {bumble-0.0.198 → bumble-0.0.199}/bumble/rfcomm.py +0 -0
  129. {bumble-0.0.198 → bumble-0.0.199}/bumble/sdp.py +0 -0
  130. {bumble-0.0.198 → bumble-0.0.199}/bumble/snoop.py +0 -0
  131. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/__init__.py +0 -0
  132. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/android_emulator.py +0 -0
  133. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/android_netsim.py +0 -0
  134. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/common.py +0 -0
  135. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/file.py +0 -0
  136. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/__init__.py +0 -0
  137. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/common_pb2.py +0 -0
  138. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/common_pb2.pyi +0 -0
  139. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/common_pb2_grpc.py +0 -0
  140. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2.py +0 -0
  141. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2.pyi +0 -0
  142. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2_grpc.py +0 -0
  143. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/emulated_bluetooth_packets_pb2.py +0 -0
  144. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/emulated_bluetooth_packets_pb2.pyi +0 -0
  145. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/emulated_bluetooth_packets_pb2_grpc.py +0 -0
  146. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/emulated_bluetooth_pb2.py +0 -0
  147. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/emulated_bluetooth_pb2.pyi +0 -0
  148. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/emulated_bluetooth_pb2_grpc.py +0 -0
  149. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/emulated_bluetooth_vhci_pb2.py +0 -0
  150. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/emulated_bluetooth_vhci_pb2.pyi +0 -0
  151. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/emulated_bluetooth_vhci_pb2_grpc.py +0 -0
  152. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/grpc_endpoint_description_pb2.py +0 -0
  153. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/grpc_endpoint_description_pb2.pyi +0 -0
  154. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/grpc_endpoint_description_pb2_grpc.py +0 -0
  155. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/hci_packet_pb2.py +0 -0
  156. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/hci_packet_pb2.pyi +0 -0
  157. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/hci_packet_pb2_grpc.py +0 -0
  158. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/packet_streamer_pb2.py +0 -0
  159. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/packet_streamer_pb2.pyi +0 -0
  160. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/packet_streamer_pb2_grpc.py +0 -0
  161. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/startup_pb2.py +0 -0
  162. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/startup_pb2.pyi +0 -0
  163. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/grpc_protobuf/startup_pb2_grpc.py +0 -0
  164. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/hci_socket.py +0 -0
  165. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/pty.py +0 -0
  166. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/py.typed +0 -0
  167. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/serial.py +0 -0
  168. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/tcp_client.py +0 -0
  169. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/tcp_server.py +0 -0
  170. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/udp.py +0 -0
  171. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/unix.py +0 -0
  172. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/usb.py +0 -0
  173. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/vhci.py +0 -0
  174. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/ws_client.py +0 -0
  175. {bumble-0.0.198 → bumble-0.0.199}/bumble/transport/ws_server.py +0 -0
  176. {bumble-0.0.198 → bumble-0.0.199}/bumble/utils.py +0 -0
  177. {bumble-0.0.198 → bumble-0.0.199}/bumble/vendor/__init__.py +0 -0
  178. {bumble-0.0.198 → bumble-0.0.199}/bumble/vendor/android/__init__.py +0 -0
  179. {bumble-0.0.198 → bumble-0.0.199}/bumble/vendor/android/hci.py +0 -0
  180. {bumble-0.0.198 → bumble-0.0.199}/bumble/vendor/zephyr/__init__.py +0 -0
  181. {bumble-0.0.198 → bumble-0.0.199}/bumble/vendor/zephyr/hci.py +0 -0
  182. {bumble-0.0.198 → bumble-0.0.199}/bumble.egg-info/dependency_links.txt +0 -0
  183. {bumble-0.0.198 → bumble-0.0.199}/bumble.egg-info/entry_points.txt +0 -0
  184. {bumble-0.0.198 → bumble-0.0.199}/bumble.egg-info/requires.txt +0 -0
  185. {bumble-0.0.198 → bumble-0.0.199}/bumble.egg-info/top_level.txt +0 -0
  186. {bumble-0.0.198 → bumble-0.0.199}/docs/README.md +0 -0
  187. {bumble-0.0.198 → bumble-0.0.199}/docs/images/favicon.ico +0 -0
  188. {bumble-0.0.198 → bumble-0.0.199}/docs/images/logo.png +0 -0
  189. {bumble-0.0.198 → bumble-0.0.199}/docs/images/logo.svg +0 -0
  190. {bumble-0.0.198 → bumble-0.0.199}/docs/images/logo.vectornator/Artboard0.json +0 -0
  191. {bumble-0.0.198 → bumble-0.0.199}/docs/images/logo.vectornator/Document.json +0 -0
  192. {bumble-0.0.198 → bumble-0.0.199}/docs/images/logo.vectornator/Manifest.json +0 -0
  193. {bumble-0.0.198 → bumble-0.0.199}/docs/images/logo.vectornator/Thumbnail.png +0 -0
  194. {bumble-0.0.198 → bumble-0.0.199}/docs/images/logo.vectornator/UndoHistory.json +0 -0
  195. {bumble-0.0.198 → bumble-0.0.199}/docs/images/logo_framed.png +0 -0
  196. {bumble-0.0.198 → bumble-0.0.199}/docs/images/logo_framed.svg +0 -0
  197. {bumble-0.0.198 → bumble-0.0.199}/docs/images/logo_framed.vectornator/Artboard0.json +0 -0
  198. {bumble-0.0.198 → bumble-0.0.199}/docs/images/logo_framed.vectornator/Document.json +0 -0
  199. {bumble-0.0.198 → bumble-0.0.199}/docs/images/logo_framed.vectornator/Manifest.json +0 -0
  200. {bumble-0.0.198 → bumble-0.0.199}/docs/images/logo_framed.vectornator/Thumbnail.png +0 -0
  201. {bumble-0.0.198 → bumble-0.0.199}/docs/images/logo_framed.vectornator/UndoHistory.json +0 -0
  202. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/mkdocs.yml +0 -0
  203. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/requirements.txt +0 -0
  204. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/api/examples.md +0 -0
  205. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/api/guide.md +0 -0
  206. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/api/reference.md +0 -0
  207. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/apps_and_tools/bench.md +0 -0
  208. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/apps_and_tools/console.md +0 -0
  209. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/apps_and_tools/gatt_dump.md +0 -0
  210. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/apps_and_tools/gg_bridge.md +0 -0
  211. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/apps_and_tools/hci_bridge.md +0 -0
  212. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/apps_and_tools/index.md +0 -0
  213. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/apps_and_tools/link_relay.md +0 -0
  214. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/apps_and_tools/pair.md +0 -0
  215. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/apps_and_tools/show.md +0 -0
  216. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/apps_and_tools/speaker.md +0 -0
  217. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/apps_and_tools/unbond.md +0 -0
  218. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/apps_and_tools/usb_probe.md +0 -0
  219. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/components/controller.md +0 -0
  220. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/components/gatt.md +0 -0
  221. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/components/host.md +0 -0
  222. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/components/security_manager.md +0 -0
  223. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/development/code_style.md +0 -0
  224. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/development/contributing.md +0 -0
  225. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/development/python_environments.md +0 -0
  226. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/downloads/zephyr/hci_usb.zip +0 -0
  227. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/drivers/index.md +0 -0
  228. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/drivers/realtek.md +0 -0
  229. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/examples/index.md +0 -0
  230. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/extras/android_bt_bench.md +0 -0
  231. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/extras/android_remote_hci.md +0 -0
  232. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/extras/index.md +0 -0
  233. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/getting_started.md +0 -0
  234. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hardware/index.md +0 -0
  235. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/index.md +0 -0
  236. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/index.toml +0 -0
  237. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/web/bumble.js +0 -0
  238. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/web/heart_rate_monitor/heart_rate_monitor.html +0 -0
  239. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/web/heart_rate_monitor/heart_rate_monitor.js +0 -0
  240. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/web/heart_rate_monitor/heart_rate_monitor.py +0 -0
  241. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/web/scanner/scanner.css +0 -0
  242. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/web/scanner/scanner.html +0 -0
  243. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/web/scanner/scanner.js +0 -0
  244. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/web/scanner/scanner.py +0 -0
  245. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/web/speaker/logo.svg +0 -0
  246. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/web/speaker/speaker.css +0 -0
  247. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/web/speaker/speaker.html +0 -0
  248. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/web/speaker/speaker.js +0 -0
  249. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/web/speaker/speaker.py +0 -0
  250. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/hive/web/ui.js +0 -0
  251. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/images/bumble_layers.svg +0 -0
  252. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/images/console_screenshot.png +0 -0
  253. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/images/favicon.ico +0 -0
  254. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/images/logo.png +0 -0
  255. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/images/logo_framed.png +0 -0
  256. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/images/speaker_screenshot.png +0 -0
  257. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/index.md +0 -0
  258. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/platforms/android.md +0 -0
  259. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/platforms/index.md +0 -0
  260. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/platforms/linux.md +0 -0
  261. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/platforms/macos.md +0 -0
  262. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/platforms/windows.md +0 -0
  263. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/platforms/winusb_driver.png +0 -0
  264. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/platforms/zephyr.md +0 -0
  265. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/transports/android_emulator.md +0 -0
  266. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/transports/file.md +0 -0
  267. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/transports/hci_socket.md +0 -0
  268. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/transports/index.md +0 -0
  269. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/transports/pty.md +0 -0
  270. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/transports/serial.md +0 -0
  271. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/transports/tcp_client.md +0 -0
  272. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/transports/tcp_server.md +0 -0
  273. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/transports/udp.md +0 -0
  274. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/transports/usb.md +0 -0
  275. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/transports/vhci.md +0 -0
  276. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/transports/ws_client.md +0 -0
  277. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/transports/ws_server.md +0 -0
  278. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/use_cases/index.md +0 -0
  279. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/use_cases/use_case_1.md +0 -0
  280. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/use_cases/use_case_2.md +0 -0
  281. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/use_cases/use_case_3.md +0 -0
  282. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/use_cases/use_case_4.md +0 -0
  283. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/use_cases/use_case_5.md +0 -0
  284. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/src/use_cases/use_case_6.md +0 -0
  285. {bumble-0.0.198 → bumble-0.0.199}/docs/mkdocs/theme/partials/footer.html +0 -0
  286. {bumble-0.0.198 → bumble-0.0.199}/environment.yml +0 -0
  287. {bumble-0.0.198 → bumble-0.0.199}/examples/README.md +0 -0
  288. {bumble-0.0.198 → bumble-0.0.199}/examples/a2dp_sink1.json +0 -0
  289. {bumble-0.0.198 → bumble-0.0.199}/examples/async_runner.py +0 -0
  290. {bumble-0.0.198 → bumble-0.0.199}/examples/avrcp_as_sink.html +0 -0
  291. {bumble-0.0.198 → bumble-0.0.199}/examples/battery_client.py +0 -0
  292. {bumble-0.0.198 → bumble-0.0.199}/examples/battery_server.py +0 -0
  293. {bumble-0.0.198 → bumble-0.0.199}/examples/classic1.json +0 -0
  294. {bumble-0.0.198 → bumble-0.0.199}/examples/classic2.json +0 -0
  295. {bumble-0.0.198 → bumble-0.0.199}/examples/device1.json +0 -0
  296. {bumble-0.0.198 → bumble-0.0.199}/examples/device2.json +0 -0
  297. {bumble-0.0.198 → bumble-0.0.199}/examples/device3.json +0 -0
  298. {bumble-0.0.198 → bumble-0.0.199}/examples/device_information_client.py +0 -0
  299. {bumble-0.0.198 → bumble-0.0.199}/examples/device_information_server.py +0 -0
  300. {bumble-0.0.198 → bumble-0.0.199}/examples/device_with_rpa.json +0 -0
  301. {bumble-0.0.198 → bumble-0.0.199}/examples/heart_rate_client.py +0 -0
  302. {bumble-0.0.198 → bumble-0.0.199}/examples/heart_rate_server.py +0 -0
  303. {bumble-0.0.198 → bumble-0.0.199}/examples/hfp_gateway.html +0 -0
  304. {bumble-0.0.198 → bumble-0.0.199}/examples/hfp_gateway.json +0 -0
  305. {bumble-0.0.198 → bumble-0.0.199}/examples/hfp_handsfree.html +0 -0
  306. {bumble-0.0.198 → bumble-0.0.199}/examples/hfp_handsfree.json +0 -0
  307. {bumble-0.0.198 → bumble-0.0.199}/examples/hid_key_map.py +0 -0
  308. {bumble-0.0.198 → bumble-0.0.199}/examples/hid_keyboard.json +0 -0
  309. {bumble-0.0.198 → bumble-0.0.199}/examples/hid_report_parser.py +0 -0
  310. {bumble-0.0.198 → bumble-0.0.199}/examples/keyboard.html +0 -0
  311. {bumble-0.0.198 → bumble-0.0.199}/examples/keyboard.json +0 -0
  312. {bumble-0.0.198 → bumble-0.0.199}/examples/keyboard.py +0 -0
  313. {bumble-0.0.198 → bumble-0.0.199}/examples/leaudio.json +0 -0
  314. {bumble-0.0.198 → bumble-0.0.199}/examples/leaudio_with_classic.json +0 -0
  315. {bumble-0.0.198 → bumble-0.0.199}/examples/mcp_server.html +0 -0
  316. {bumble-0.0.198 → bumble-0.0.199}/examples/run_a2dp_info.py +0 -0
  317. {bumble-0.0.198 → bumble-0.0.199}/examples/run_a2dp_sink.py +0 -0
  318. {bumble-0.0.198 → bumble-0.0.199}/examples/run_a2dp_source.py +0 -0
  319. {bumble-0.0.198 → bumble-0.0.199}/examples/run_advertiser.py +0 -0
  320. {bumble-0.0.198 → bumble-0.0.199}/examples/run_avrcp.py +0 -0
  321. {bumble-0.0.198 → bumble-0.0.199}/examples/run_cig_setup.py +0 -0
  322. {bumble-0.0.198 → bumble-0.0.199}/examples/run_classic_connect.py +0 -0
  323. {bumble-0.0.198 → bumble-0.0.199}/examples/run_classic_discoverable.py +0 -0
  324. {bumble-0.0.198 → bumble-0.0.199}/examples/run_classic_discovery.py +0 -0
  325. {bumble-0.0.198 → bumble-0.0.199}/examples/run_connect_and_encrypt.py +0 -0
  326. {bumble-0.0.198 → bumble-0.0.199}/examples/run_controller.py +0 -0
  327. {bumble-0.0.198 → bumble-0.0.199}/examples/run_controller_with_scanner.py +0 -0
  328. {bumble-0.0.198 → bumble-0.0.199}/examples/run_csis_servers.py +0 -0
  329. {bumble-0.0.198 → bumble-0.0.199}/examples/run_device_with_snooper.py +0 -0
  330. {bumble-0.0.198 → bumble-0.0.199}/examples/run_esco_connection.py +0 -0
  331. {bumble-0.0.198 → bumble-0.0.199}/examples/run_extended_advertiser.py +0 -0
  332. {bumble-0.0.198 → bumble-0.0.199}/examples/run_extended_advertiser_2.py +0 -0
  333. {bumble-0.0.198 → bumble-0.0.199}/examples/run_gatt_client.py +0 -0
  334. {bumble-0.0.198 → bumble-0.0.199}/examples/run_gatt_client_and_server.py +0 -0
  335. {bumble-0.0.198 → bumble-0.0.199}/examples/run_gatt_server.py +0 -0
  336. {bumble-0.0.198 → bumble-0.0.199}/examples/run_hfp_gateway.py +0 -0
  337. {bumble-0.0.198 → bumble-0.0.199}/examples/run_hfp_handsfree.py +0 -0
  338. {bumble-0.0.198 → bumble-0.0.199}/examples/run_hid_device.py +0 -0
  339. {bumble-0.0.198 → bumble-0.0.199}/examples/run_hid_host.py +0 -0
  340. {bumble-0.0.198 → bumble-0.0.199}/examples/run_mcp_client.py +0 -0
  341. {bumble-0.0.198 → bumble-0.0.199}/examples/run_notifier.py +0 -0
  342. {bumble-0.0.198 → bumble-0.0.199}/examples/run_rfcomm_client.py +0 -0
  343. {bumble-0.0.198 → bumble-0.0.199}/examples/run_rfcomm_server.py +0 -0
  344. {bumble-0.0.198 → bumble-0.0.199}/examples/run_scanner.py +0 -0
  345. {bumble-0.0.198 → bumble-0.0.199}/examples/run_unicast_server.py +0 -0
  346. {bumble-0.0.198 → bumble-0.0.199}/examples/run_vcp_renderer.py +0 -0
  347. {bumble-0.0.198 → bumble-0.0.199}/examples/speaker.json +0 -0
  348. {bumble-0.0.198 → bumble-0.0.199}/examples/vcp_renderer.html +0 -0
  349. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/.gitignore +0 -0
  350. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/.gitignore +0 -0
  351. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/build.gradle.kts +0 -0
  352. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/proguard-rules.pro +0 -0
  353. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/AndroidManifest.xml +0 -0
  354. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/ic_launcher-playstore.png +0 -0
  355. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/L2capClient.kt +0 -0
  356. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/L2capServer.kt +0 -0
  357. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/MainActivity.kt +0 -0
  358. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Model.kt +0 -0
  359. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Packet.kt +0 -0
  360. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Receiver.kt +0 -0
  361. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/RfcommClient.kt +0 -0
  362. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/RfcommServer.kt +0 -0
  363. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Scan.kt +0 -0
  364. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/Sender.kt +0 -0
  365. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/SocketClient.kt +0 -0
  366. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/SocketServer.kt +0 -0
  367. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/ui/theme/Color.kt +0 -0
  368. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/ui/theme/Theme.kt +0 -0
  369. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/java/com/github/google/bumble/btbench/ui/theme/Type.kt +0 -0
  370. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/drawable/ic_launcher_background.xml +0 -0
  371. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/drawable/ic_launcher_foreground.xml +0 -0
  372. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -0
  373. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -0
  374. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp +0 -0
  375. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
  376. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp +0 -0
  377. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
  378. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp +0 -0
  379. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
  380. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp +0 -0
  381. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
  382. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp +0 -0
  383. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
  384. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/values/colors.xml +0 -0
  385. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/values/ic_launcher_background.xml +0 -0
  386. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/values/strings.xml +0 -0
  387. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/values/themes.xml +0 -0
  388. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/xml/backup_rules.xml +0 -0
  389. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/app/src/main/res/xml/data_extraction_rules.xml +0 -0
  390. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/build.gradle.kts +0 -0
  391. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/gradle/libs.versions.toml +0 -0
  392. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/gradle/wrapper/gradle-wrapper.jar +0 -0
  393. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/gradle/wrapper/gradle-wrapper.properties +0 -0
  394. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/gradle.properties +0 -0
  395. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/gradlew +0 -0
  396. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/gradlew.bat +0 -0
  397. {bumble-0.0.198 → bumble-0.0.199}/extras/android/BtBench/settings.gradle.kts +0 -0
  398. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/.gitignore +0 -0
  399. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/.gitignore +0 -0
  400. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/build.gradle.kts +0 -0
  401. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/proguard-rules.pro +0 -0
  402. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/AndroidManifest.xml +0 -0
  403. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/aidl/android/hardware/bluetooth/IBluetoothHci.aidl +0 -0
  404. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/aidl/android/hardware/bluetooth/IBluetoothHciCallbacks.aidl +0 -0
  405. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/aidl/android/hardware/bluetooth/Status.aidl +0 -0
  406. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/hidl/bluetooth/1.1/IBluetoothHci.hal +0 -0
  407. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/hidl/bluetooth/1.1/IBluetoothHciCallbacks.hal +0 -0
  408. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/ic_launcher-playstore.png +0 -0
  409. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/IBluetoothHci.java +0 -0
  410. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/IBluetoothHciCallbacks.java +0 -0
  411. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/Status.java +0 -0
  412. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/V1_0/IBluetoothHci.java +0 -0
  413. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/V1_0/IBluetoothHciCallbacks.java +0 -0
  414. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/V1_0/Status.java +0 -0
  415. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/V1_1/IBluetoothHci.java +0 -0
  416. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/android/hardware/bluetooth/V1_1/IBluetoothHciCallbacks.java +0 -0
  417. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/CommandLineInterface.kt +0 -0
  418. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciHal.java +0 -0
  419. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciHalCallback.java +0 -0
  420. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciPacket.java +0 -0
  421. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciParser.java +0 -0
  422. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciProxy.java +0 -0
  423. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/HciServer.java +0 -0
  424. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/MainActivity.kt +0 -0
  425. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/ui/theme/Color.kt +0 -0
  426. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/ui/theme/Theme.kt +0 -0
  427. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/java/com/github/google/bumble/remotehci/ui/theme/Type.kt +0 -0
  428. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -0
  429. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -0
  430. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
  431. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp +0 -0
  432. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
  433. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
  434. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp +0 -0
  435. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
  436. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
  437. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp +0 -0
  438. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
  439. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
  440. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp +0 -0
  441. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
  442. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
  443. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp +0 -0
  444. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
  445. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/values/colors.xml +0 -0
  446. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/values/ic_launcher_background.xml +0 -0
  447. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/values/strings.xml +0 -0
  448. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/values/themes.xml +0 -0
  449. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/xml/backup_rules.xml +0 -0
  450. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/app/src/main/res/xml/data_extraction_rules.xml +0 -0
  451. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/build.gradle.kts +0 -0
  452. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/gradle/libs.versions.toml +0 -0
  453. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/gradle/wrapper/gradle-wrapper.jar +0 -0
  454. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/gradle/wrapper/gradle-wrapper.properties +0 -0
  455. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/gradle.properties +0 -0
  456. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/gradlew +0 -0
  457. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/gradlew.bat +0 -0
  458. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/lib/.gitignore +0 -0
  459. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/lib/build.gradle.kts +0 -0
  460. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/lib/consumer-rules.pro +0 -0
  461. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/lib/proguard-rules.pro +0 -0
  462. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/lib/src/main/AndroidManifest.xml +0 -0
  463. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/lib/src/main/java/android/internal/hidl/base/V1_0/DebugInfo.java +0 -0
  464. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/lib/src/main/java/android/internal/hidl/base/V1_0/IBase.java +0 -0
  465. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/lib/src/main/java/android/os/HidlSupport.java +0 -0
  466. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/lib/src/main/java/android/os/HwBinder.java +0 -0
  467. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/lib/src/main/java/android/os/HwBlob.java +0 -0
  468. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/lib/src/main/java/android/os/HwParcel.java +0 -0
  469. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/lib/src/main/java/android/os/IHwBinder.java +0 -0
  470. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/lib/src/main/java/android/os/IHwInterface.java +0 -0
  471. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/lib/src/main/java/android/os/NativeHandle.java +0 -0
  472. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/lib/src/main/java/android/os/ServiceManager.java +0 -0
  473. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/scripts/generate_java_from_aidl.sh +0 -0
  474. {bumble-0.0.198 → bumble-0.0.199}/extras/android/RemoteHCI/settings.gradle.kts +0 -0
  475. {bumble-0.0.198 → bumble-0.0.199}/noxfile.py +0 -0
  476. {bumble-0.0.198 → bumble-0.0.199}/pyproject.toml +0 -0
  477. {bumble-0.0.198 → bumble-0.0.199}/rust/.gitignore +0 -0
  478. {bumble-0.0.198 → bumble-0.0.199}/rust/CHANGELOG.md +0 -0
  479. {bumble-0.0.198 → bumble-0.0.199}/rust/Cargo.lock +0 -0
  480. {bumble-0.0.198 → bumble-0.0.199}/rust/Cargo.toml +0 -0
  481. {bumble-0.0.198 → bumble-0.0.199}/rust/README.md +0 -0
  482. {bumble-0.0.198 → bumble-0.0.199}/rust/examples/battery_client.rs +0 -0
  483. {bumble-0.0.198 → bumble-0.0.199}/rust/examples/broadcast.rs +0 -0
  484. {bumble-0.0.198 → bumble-0.0.199}/rust/examples/scanner.rs +0 -0
  485. {bumble-0.0.198 → bumble-0.0.199}/rust/pytests/assigned_numbers.rs +0 -0
  486. {bumble-0.0.198 → bumble-0.0.199}/rust/pytests/pytests.rs +0 -0
  487. {bumble-0.0.198 → bumble-0.0.199}/rust/pytests/wrapper/drivers.rs +0 -0
  488. {bumble-0.0.198 → bumble-0.0.199}/rust/pytests/wrapper/hci.rs +0 -0
  489. {bumble-0.0.198 → bumble-0.0.199}/rust/pytests/wrapper/mod.rs +0 -0
  490. {bumble-0.0.198 → bumble-0.0.199}/rust/pytests/wrapper/transport.rs +0 -0
  491. {bumble-0.0.198 → bumble-0.0.199}/rust/resources/test/firmware/realtek/README.md +0 -0
  492. {bumble-0.0.198 → bumble-0.0.199}/rust/resources/test/firmware/realtek/rtl8723b_fw_structure.bin +0 -0
  493. {bumble-0.0.198 → bumble-0.0.199}/rust/resources/test/firmware/realtek/rtl8761bu_fw_structure.bin +0 -0
  494. {bumble-0.0.198 → bumble-0.0.199}/rust/src/adv.rs +0 -0
  495. {bumble-0.0.198 → bumble-0.0.199}/rust/src/cli/firmware/mod.rs +0 -0
  496. {bumble-0.0.198 → bumble-0.0.199}/rust/src/cli/firmware/rtk.rs +0 -0
  497. {bumble-0.0.198 → bumble-0.0.199}/rust/src/cli/l2cap/client_bridge.rs +0 -0
  498. {bumble-0.0.198 → bumble-0.0.199}/rust/src/cli/l2cap/mod.rs +0 -0
  499. {bumble-0.0.198 → bumble-0.0.199}/rust/src/cli/l2cap/server_bridge.rs +0 -0
  500. {bumble-0.0.198 → bumble-0.0.199}/rust/src/cli/mod.rs +0 -0
  501. {bumble-0.0.198 → bumble-0.0.199}/rust/src/cli/usb/mod.rs +0 -0
  502. {bumble-0.0.198 → bumble-0.0.199}/rust/src/internal/drivers/mod.rs +0 -0
  503. {bumble-0.0.198 → bumble-0.0.199}/rust/src/internal/drivers/rtk.rs +0 -0
  504. {bumble-0.0.198 → bumble-0.0.199}/rust/src/internal/hci/mod.rs +0 -0
  505. {bumble-0.0.198 → bumble-0.0.199}/rust/src/internal/hci/packets.pdl +0 -0
  506. {bumble-0.0.198 → bumble-0.0.199}/rust/src/internal/hci/tests.rs +0 -0
  507. {bumble-0.0.198 → bumble-0.0.199}/rust/src/internal/mod.rs +0 -0
  508. {bumble-0.0.198 → bumble-0.0.199}/rust/src/lib.rs +0 -0
  509. {bumble-0.0.198 → bumble-0.0.199}/rust/src/main.rs +0 -0
  510. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/assigned_numbers/company_ids.rs +0 -0
  511. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/assigned_numbers/mod.rs +0 -0
  512. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/assigned_numbers/services.rs +0 -0
  513. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/common.rs +0 -0
  514. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/controller.rs +0 -0
  515. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/core.rs +0 -0
  516. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/device/mod.rs +0 -0
  517. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/device/tests.rs +0 -0
  518. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/drivers/mod.rs +0 -0
  519. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/drivers/rtk.rs +0 -0
  520. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/gatt_client.rs +0 -0
  521. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/hci.rs +0 -0
  522. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/host.rs +0 -0
  523. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/l2cap.rs +0 -0
  524. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/link.rs +0 -0
  525. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/logging.rs +0 -0
  526. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/mod.rs +0 -0
  527. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/profile.rs +0 -0
  528. {bumble-0.0.198 → bumble-0.0.199}/rust/src/wrapper/transport.rs +0 -0
  529. {bumble-0.0.198 → bumble-0.0.199}/rust/tools/file_header.rs +0 -0
  530. {bumble-0.0.198 → bumble-0.0.199}/rust/tools/gen_assigned_numbers.rs +0 -0
  531. {bumble-0.0.198 → bumble-0.0.199}/scripts/process_android_emulator_protos.sh +0 -0
  532. {bumble-0.0.198 → bumble-0.0.199}/scripts/process_android_netsim_protos.sh +0 -0
  533. {bumble-0.0.198 → bumble-0.0.199}/setup.cfg +0 -0
  534. {bumble-0.0.198 → bumble-0.0.199}/setup.py +0 -0
  535. {bumble-0.0.198 → bumble-0.0.199}/tasks.py +0 -0
  536. {bumble-0.0.198 → bumble-0.0.199}/tests/__init__.py +0 -0
  537. {bumble-0.0.198 → bumble-0.0.199}/tests/a2dp_test.py +0 -0
  538. {bumble-0.0.198 → bumble-0.0.199}/tests/at_test.py +0 -0
  539. {bumble-0.0.198 → bumble-0.0.199}/tests/avdtp_test.py +0 -0
  540. {bumble-0.0.198 → bumble-0.0.199}/tests/avrcp_test.py +0 -0
  541. {bumble-0.0.198 → bumble-0.0.199}/tests/bap_test.py +0 -0
  542. {bumble-0.0.198 → bumble-0.0.199}/tests/bass_test.py +0 -0
  543. {bumble-0.0.198 → bumble-0.0.199}/tests/cap_test.py +0 -0
  544. {bumble-0.0.198 → bumble-0.0.199}/tests/codecs_test.py +0 -0
  545. {bumble-0.0.198 → bumble-0.0.199}/tests/core_test.py +0 -0
  546. {bumble-0.0.198 → bumble-0.0.199}/tests/csip_test.py +0 -0
  547. {bumble-0.0.198 → bumble-0.0.199}/tests/decoder_test.py +0 -0
  548. {bumble-0.0.198 → bumble-0.0.199}/tests/device_test.py +0 -0
  549. {bumble-0.0.198 → bumble-0.0.199}/tests/g722_sample.g722 +0 -0
  550. {bumble-0.0.198 → bumble-0.0.199}/tests/hci_data_001.bin +0 -0
  551. {bumble-0.0.198 → bumble-0.0.199}/tests/hfp_test.py +0 -0
  552. {bumble-0.0.198 → bumble-0.0.199}/tests/host_test.py +0 -0
  553. {bumble-0.0.198 → bumble-0.0.199}/tests/import_test.py +0 -0
  554. {bumble-0.0.198 → bumble-0.0.199}/tests/keystore_test.py +0 -0
  555. {bumble-0.0.198 → bumble-0.0.199}/tests/l2cap_test.py +0 -0
  556. {bumble-0.0.198 → bumble-0.0.199}/tests/le_audio_test.py +0 -0
  557. {bumble-0.0.198 → bumble-0.0.199}/tests/mcp_test.py +0 -0
  558. {bumble-0.0.198 → bumble-0.0.199}/tests/pytest.ini +0 -0
  559. {bumble-0.0.198 → bumble-0.0.199}/tests/rfcomm_test.py +0 -0
  560. {bumble-0.0.198 → bumble-0.0.199}/tests/sdp_test.py +0 -0
  561. {bumble-0.0.198 → bumble-0.0.199}/tests/self_test.py +0 -0
  562. {bumble-0.0.198 → bumble-0.0.199}/tests/smp_test.py +0 -0
  563. {bumble-0.0.198 → bumble-0.0.199}/tests/test_utils.py +0 -0
  564. {bumble-0.0.198 → bumble-0.0.199}/tests/transport_tcp_server_test.py +0 -0
  565. {bumble-0.0.198 → bumble-0.0.199}/tests/transport_test.py +0 -0
  566. {bumble-0.0.198 → bumble-0.0.199}/tests/utils_test.py +0 -0
  567. {bumble-0.0.198 → bumble-0.0.199}/tools/__init__.py +0 -0
  568. {bumble-0.0.198 → bumble-0.0.199}/tools/generate_company_id_list.py +0 -0
  569. {bumble-0.0.198 → bumble-0.0.199}/tools/rtk_fw_download.py +0 -0
  570. {bumble-0.0.198 → bumble-0.0.199}/tools/rtk_util.py +0 -0
  571. {bumble-0.0.198 → bumble-0.0.199}/web/.gitignore +0 -0
  572. {bumble-0.0.198 → bumble-0.0.199}/web/README.md +0 -0
  573. {bumble-0.0.198 → bumble-0.0.199}/web/bumble.js +0 -0
  574. {bumble-0.0.198 → bumble-0.0.199}/web/favicon.ico +0 -0
  575. {bumble-0.0.198 → bumble-0.0.199}/web/heart_rate_monitor/heart_rate_monitor.html +0 -0
  576. {bumble-0.0.198 → bumble-0.0.199}/web/heart_rate_monitor/heart_rate_monitor.js +0 -0
  577. {bumble-0.0.198 → bumble-0.0.199}/web/heart_rate_monitor/heart_rate_monitor.py +0 -0
  578. {bumble-0.0.198 → bumble-0.0.199}/web/scanner/scanner.css +0 -0
  579. {bumble-0.0.198 → bumble-0.0.199}/web/scanner/scanner.html +0 -0
  580. {bumble-0.0.198 → bumble-0.0.199}/web/scanner/scanner.js +0 -0
  581. {bumble-0.0.198 → bumble-0.0.199}/web/scanner/scanner.py +0 -0
  582. {bumble-0.0.198 → bumble-0.0.199}/web/speaker/logo.svg +0 -0
  583. {bumble-0.0.198 → bumble-0.0.199}/web/speaker/speaker.css +0 -0
  584. {bumble-0.0.198 → bumble-0.0.199}/web/speaker/speaker.html +0 -0
  585. {bumble-0.0.198 → bumble-0.0.199}/web/speaker/speaker.js +0 -0
  586. {bumble-0.0.198 → bumble-0.0.199}/web/speaker/speaker.py +0 -0
  587. {bumble-0.0.198 → bumble-0.0.199}/web/ui.js +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bumble
3
- Version: 0.0.198
3
+ Version: 0.0.199
4
4
  Summary: Bluetooth Stack for Apps, Emulation, Test and Experimentation
5
5
  Home-page: https://github.com/google/bumble
6
6
  Author: Google
@@ -46,6 +46,12 @@ from bumble.att import (
46
46
  ATT_INSUFFICIENT_AUTHENTICATION_ERROR,
47
47
  ATT_INSUFFICIENT_ENCRYPTION_ERROR,
48
48
  )
49
+ from bumble.utils import AsyncRunner
50
+
51
+ # -----------------------------------------------------------------------------
52
+ # Constants
53
+ # -----------------------------------------------------------------------------
54
+ POST_PAIRING_DELAY = 1
49
55
 
50
56
 
51
57
  # -----------------------------------------------------------------------------
@@ -235,8 +241,10 @@ def on_connection(connection, request):
235
241
 
236
242
  # Listen for pairing events
237
243
  connection.on('pairing_start', on_pairing_start)
238
- connection.on('pairing', lambda keys: on_pairing(connection.peer_address, keys))
239
- connection.on('pairing_failure', on_pairing_failure)
244
+ connection.on('pairing', lambda keys: on_pairing(connection, keys))
245
+ connection.on(
246
+ 'pairing_failure', lambda reason: on_pairing_failure(connection, reason)
247
+ )
240
248
 
241
249
  # Listen for encryption changes
242
250
  connection.on(
@@ -270,19 +278,24 @@ def on_pairing_start():
270
278
 
271
279
 
272
280
  # -----------------------------------------------------------------------------
273
- def on_pairing(address, keys):
281
+ @AsyncRunner.run_in_task()
282
+ async def on_pairing(connection, keys):
274
283
  print(color('***-----------------------------------', 'cyan'))
275
- print(color(f'*** Paired! (peer identity={address})', 'cyan'))
284
+ print(color(f'*** Paired! (peer identity={connection.peer_address})', 'cyan'))
276
285
  keys.print(prefix=color('*** ', 'cyan'))
277
286
  print(color('***-----------------------------------', 'cyan'))
287
+ await asyncio.sleep(POST_PAIRING_DELAY)
288
+ await connection.disconnect()
278
289
  Waiter.instance.terminate()
279
290
 
280
291
 
281
292
  # -----------------------------------------------------------------------------
282
- def on_pairing_failure(reason):
293
+ @AsyncRunner.run_in_task()
294
+ async def on_pairing_failure(connection, reason):
283
295
  print(color('***-----------------------------------', 'red'))
284
296
  print(color(f'*** Pairing failed: {smp_error_name(reason)}', 'red'))
285
297
  print(color('***-----------------------------------', 'red'))
298
+ await connection.disconnect()
286
299
  Waiter.instance.terminate()
287
300
 
288
301
 
@@ -293,6 +306,7 @@ async def pair(
293
306
  mitm,
294
307
  bond,
295
308
  ctkd,
309
+ identity_address,
296
310
  linger,
297
311
  io,
298
312
  oob,
@@ -382,11 +396,18 @@ async def pair(
382
396
  oob_contexts = None
383
397
 
384
398
  # Set up a pairing config factory
399
+ if identity_address == 'public':
400
+ identity_address_type = PairingConfig.AddressType.PUBLIC
401
+ elif identity_address == 'random':
402
+ identity_address_type = PairingConfig.AddressType.RANDOM
403
+ else:
404
+ identity_address_type = None
385
405
  device.pairing_config_factory = lambda connection: PairingConfig(
386
406
  sc=sc,
387
407
  mitm=mitm,
388
408
  bonding=bond,
389
409
  oob=oob_contexts,
410
+ identity_address_type=identity_address_type,
390
411
  delegate=Delegate(mode, connection, io, prompt),
391
412
  )
392
413
 
@@ -457,6 +478,10 @@ class LogHandler(logging.Handler):
457
478
  help='Enable CTKD',
458
479
  show_default=True,
459
480
  )
481
+ @click.option(
482
+ '--identity-address',
483
+ type=click.Choice(['random', 'public']),
484
+ )
460
485
  @click.option('--linger', default=False, is_flag=True, help='Linger after pairing')
461
486
  @click.option(
462
487
  '--io',
@@ -493,6 +518,7 @@ def main(
493
518
  mitm,
494
519
  bond,
495
520
  ctkd,
521
+ identity_address,
496
522
  linger,
497
523
  io,
498
524
  oob,
@@ -518,6 +544,7 @@ def main(
518
544
  mitm,
519
545
  bond,
520
546
  ctkd,
547
+ identity_address,
521
548
  linger,
522
549
  io,
523
550
  oob,
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.0.198'
16
- __version_tuple__ = version_tuple = (0, 0, 198)
15
+ __version__ = version = '0.0.199'
16
+ __version_tuple__ = version_tuple = (0, 0, 199)
@@ -23,6 +23,7 @@
23
23
  # Imports
24
24
  # -----------------------------------------------------------------------------
25
25
  from __future__ import annotations
26
+
26
27
  import enum
27
28
  import functools
28
29
  import inspect
@@ -41,6 +42,7 @@ from typing import (
41
42
 
42
43
  from pyee import EventEmitter
43
44
 
45
+ from bumble import utils
44
46
  from bumble.core import UUID, name_or_number, ProtocolError
45
47
  from bumble.hci import HCI_Object, key_with_value
46
48
  from bumble.colors import color
@@ -145,43 +147,57 @@ ATT_RESPONSES = [
145
147
  ATT_EXECUTE_WRITE_RESPONSE
146
148
  ]
147
149
 
148
- ATT_INVALID_HANDLE_ERROR = 0x01
149
- ATT_READ_NOT_PERMITTED_ERROR = 0x02
150
- ATT_WRITE_NOT_PERMITTED_ERROR = 0x03
151
- ATT_INVALID_PDU_ERROR = 0x04
152
- ATT_INSUFFICIENT_AUTHENTICATION_ERROR = 0x05
153
- ATT_REQUEST_NOT_SUPPORTED_ERROR = 0x06
154
- ATT_INVALID_OFFSET_ERROR = 0x07
155
- ATT_INSUFFICIENT_AUTHORIZATION_ERROR = 0x08
156
- ATT_PREPARE_QUEUE_FULL_ERROR = 0x09
157
- ATT_ATTRIBUTE_NOT_FOUND_ERROR = 0x0A
158
- ATT_ATTRIBUTE_NOT_LONG_ERROR = 0x0B
159
- ATT_INSUFFICIENT_ENCRYPTION_KEY_SIZE_ERROR = 0x0C
160
- ATT_INVALID_ATTRIBUTE_LENGTH_ERROR = 0x0D
161
- ATT_UNLIKELY_ERROR_ERROR = 0x0E
162
- ATT_INSUFFICIENT_ENCRYPTION_ERROR = 0x0F
163
- ATT_UNSUPPORTED_GROUP_TYPE_ERROR = 0x10
164
- ATT_INSUFFICIENT_RESOURCES_ERROR = 0x11
165
-
166
- ATT_ERROR_NAMES = {
167
- ATT_INVALID_HANDLE_ERROR: 'ATT_INVALID_HANDLE_ERROR',
168
- ATT_READ_NOT_PERMITTED_ERROR: 'ATT_READ_NOT_PERMITTED_ERROR',
169
- ATT_WRITE_NOT_PERMITTED_ERROR: 'ATT_WRITE_NOT_PERMITTED_ERROR',
170
- ATT_INVALID_PDU_ERROR: 'ATT_INVALID_PDU_ERROR',
171
- ATT_INSUFFICIENT_AUTHENTICATION_ERROR: 'ATT_INSUFFICIENT_AUTHENTICATION_ERROR',
172
- ATT_REQUEST_NOT_SUPPORTED_ERROR: 'ATT_REQUEST_NOT_SUPPORTED_ERROR',
173
- ATT_INVALID_OFFSET_ERROR: 'ATT_INVALID_OFFSET_ERROR',
174
- ATT_INSUFFICIENT_AUTHORIZATION_ERROR: 'ATT_INSUFFICIENT_AUTHORIZATION_ERROR',
175
- ATT_PREPARE_QUEUE_FULL_ERROR: 'ATT_PREPARE_QUEUE_FULL_ERROR',
176
- ATT_ATTRIBUTE_NOT_FOUND_ERROR: 'ATT_ATTRIBUTE_NOT_FOUND_ERROR',
177
- ATT_ATTRIBUTE_NOT_LONG_ERROR: 'ATT_ATTRIBUTE_NOT_LONG_ERROR',
178
- ATT_INSUFFICIENT_ENCRYPTION_KEY_SIZE_ERROR: 'ATT_INSUFFICIENT_ENCRYPTION_KEY_SIZE_ERROR',
179
- ATT_INVALID_ATTRIBUTE_LENGTH_ERROR: 'ATT_INVALID_ATTRIBUTE_LENGTH_ERROR',
180
- ATT_UNLIKELY_ERROR_ERROR: 'ATT_UNLIKELY_ERROR_ERROR',
181
- ATT_INSUFFICIENT_ENCRYPTION_ERROR: 'ATT_INSUFFICIENT_ENCRYPTION_ERROR',
182
- ATT_UNSUPPORTED_GROUP_TYPE_ERROR: 'ATT_UNSUPPORTED_GROUP_TYPE_ERROR',
183
- ATT_INSUFFICIENT_RESOURCES_ERROR: 'ATT_INSUFFICIENT_RESOURCES_ERROR'
184
- }
150
+ class ErrorCode(utils.OpenIntEnum):
151
+ '''
152
+ See
153
+
154
+ * Bluetooth spec @ Vol 3, Part F - 3.4.1.1 Error Response
155
+ * Core Specification Supplement: Common Profile And Service Error Codes
156
+ '''
157
+ INVALID_HANDLE = 0x01
158
+ READ_NOT_PERMITTED = 0x02
159
+ WRITE_NOT_PERMITTED = 0x03
160
+ INVALID_PDU = 0x04
161
+ INSUFFICIENT_AUTHENTICATION = 0x05
162
+ REQUEST_NOT_SUPPORTED = 0x06
163
+ INVALID_OFFSET = 0x07
164
+ INSUFFICIENT_AUTHORIZATION = 0x08
165
+ PREPARE_QUEUE_FULL = 0x09
166
+ ATTRIBUTE_NOT_FOUND = 0x0A
167
+ ATTRIBUTE_NOT_LONG = 0x0B
168
+ INSUFFICIENT_ENCRYPTION_KEY_SIZE = 0x0C
169
+ INVALID_ATTRIBUTE_LENGTH = 0x0D
170
+ UNLIKELY_ERROR = 0x0E
171
+ INSUFFICIENT_ENCRYPTION = 0x0F
172
+ UNSUPPORTED_GROUP_TYPE = 0x10
173
+ INSUFFICIENT_RESOURCES = 0x11
174
+ DATABASE_OUT_OF_SYNC = 0x12
175
+ VALUE_NOT_ALLOWED = 0x13
176
+ # 0x80 – 0x9F: Application Error
177
+ # 0xE0 – 0xFF: Common Profile and Service Error Codes
178
+ WRITE_REQUEST_REJECTED = 0xFC
179
+ CCCD_IMPROPERLY_CONFIGURED = 0xFD
180
+ PROCEDURE_ALREADY_IN_PROGRESS = 0xFE
181
+ OUT_OF_RANGE = 0xFF
182
+
183
+ # Backward Compatible Constants
184
+ ATT_INVALID_HANDLE_ERROR = ErrorCode.INVALID_HANDLE
185
+ ATT_READ_NOT_PERMITTED_ERROR = ErrorCode.READ_NOT_PERMITTED
186
+ ATT_WRITE_NOT_PERMITTED_ERROR = ErrorCode.WRITE_NOT_PERMITTED
187
+ ATT_INVALID_PDU_ERROR = ErrorCode.INVALID_PDU
188
+ ATT_INSUFFICIENT_AUTHENTICATION_ERROR = ErrorCode.INSUFFICIENT_AUTHENTICATION
189
+ ATT_REQUEST_NOT_SUPPORTED_ERROR = ErrorCode.REQUEST_NOT_SUPPORTED
190
+ ATT_INVALID_OFFSET_ERROR = ErrorCode.INVALID_OFFSET
191
+ ATT_INSUFFICIENT_AUTHORIZATION_ERROR = ErrorCode.INSUFFICIENT_AUTHORIZATION
192
+ ATT_PREPARE_QUEUE_FULL_ERROR = ErrorCode.PREPARE_QUEUE_FULL
193
+ ATT_ATTRIBUTE_NOT_FOUND_ERROR = ErrorCode.ATTRIBUTE_NOT_FOUND
194
+ ATT_ATTRIBUTE_NOT_LONG_ERROR = ErrorCode.ATTRIBUTE_NOT_LONG
195
+ ATT_INSUFFICIENT_ENCRYPTION_KEY_SIZE_ERROR = ErrorCode.INSUFFICIENT_ENCRYPTION_KEY_SIZE
196
+ ATT_INVALID_ATTRIBUTE_LENGTH_ERROR = ErrorCode.INVALID_ATTRIBUTE_LENGTH
197
+ ATT_UNLIKELY_ERROR_ERROR = ErrorCode.UNLIKELY_ERROR
198
+ ATT_INSUFFICIENT_ENCRYPTION_ERROR = ErrorCode.INSUFFICIENT_ENCRYPTION
199
+ ATT_UNSUPPORTED_GROUP_TYPE_ERROR = ErrorCode.UNSUPPORTED_GROUP_TYPE
200
+ ATT_INSUFFICIENT_RESOURCES_ERROR = ErrorCode.INSUFFICIENT_RESOURCES
185
201
 
186
202
  ATT_DEFAULT_MTU = 23
187
203
 
@@ -245,9 +261,9 @@ class ATT_PDU:
245
261
  def pdu_name(op_code):
246
262
  return name_or_number(ATT_PDU_NAMES, op_code, 2)
247
263
 
248
- @staticmethod
249
- def error_name(error_code):
250
- return name_or_number(ATT_ERROR_NAMES, error_code, 2)
264
+ @classmethod
265
+ def error_name(cls, error_code: int) -> str:
266
+ return ErrorCode(error_code).name
251
267
 
252
268
  @staticmethod
253
269
  def subclass(fields):
@@ -580,10 +580,10 @@ class ServiceCapabilities:
580
580
  self.service_category = service_category
581
581
  self.service_capabilities_bytes = service_capabilities_bytes
582
582
 
583
- def to_string(self, details: List[str] = []) -> str:
583
+ def to_string(self, details: Optional[List[str]] = None) -> str:
584
584
  attributes = ','.join(
585
585
  [name_or_number(AVDTP_SERVICE_CATEGORY_NAMES, self.service_category)]
586
- + details
586
+ + (details or [])
587
587
  )
588
588
  return f'ServiceCapabilities({attributes})'
589
589
 
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from typing import Union
16
+
15
17
  # -----------------------------------------------------------------------------
16
18
  # Constants
17
19
  # -----------------------------------------------------------------------------
@@ -149,7 +151,7 @@ QMF_COEFFS = [3, -11, 12, 32, -210, 951, 3876, -805, 362, -156, 53, -11]
149
151
  # -----------------------------------------------------------------------------
150
152
  # Classes
151
153
  # -----------------------------------------------------------------------------
152
- class G722Decoder(object):
154
+ class G722Decoder:
153
155
  """G.722 decoder with bitrate 64kbit/s.
154
156
 
155
157
  For the Blocks in the sub-band decoders, please refer to the G.722
@@ -157,7 +159,7 @@ class G722Decoder(object):
157
159
  https://www.itu.int/rec/T-REC-G.722-201209-I
158
160
  """
159
161
 
160
- def __init__(self):
162
+ def __init__(self) -> None:
161
163
  self._x = [0] * 24
162
164
  self._band = [Band(), Band()]
163
165
  # The initial value in BLOCK 3L
@@ -165,12 +167,12 @@ class G722Decoder(object):
165
167
  # The initial value in BLOCK 3H
166
168
  self._band[1].det = 8
167
169
 
168
- def decode_frame(self, encoded_data) -> bytearray:
170
+ def decode_frame(self, encoded_data: Union[bytes, bytearray]) -> bytearray:
169
171
  result_array = bytearray(len(encoded_data) * 4)
170
172
  self.g722_decode(result_array, encoded_data)
171
173
  return result_array
172
174
 
173
- def g722_decode(self, result_array, encoded_data) -> int:
175
+ def g722_decode(self, result_array, encoded_data: Union[bytes, bytearray]) -> int:
174
176
  """Decode the data frame using g722 decoder."""
175
177
  result_length = 0
176
178
 
@@ -198,14 +200,16 @@ class G722Decoder(object):
198
200
 
199
201
  return result_length
200
202
 
201
- def update_decoded_result(self, xout, byte_length, byte_array) -> int:
203
+ def update_decoded_result(
204
+ self, xout: int, byte_length: int, byte_array: bytearray
205
+ ) -> int:
202
206
  result = (int)(xout >> 11)
203
207
  bytes_result = result.to_bytes(2, 'little', signed=True)
204
208
  byte_array[byte_length] = bytes_result[0]
205
209
  byte_array[byte_length + 1] = bytes_result[1]
206
210
  return byte_length + 2
207
211
 
208
- def lower_sub_band_decoder(self, lower_bits) -> int:
212
+ def lower_sub_band_decoder(self, lower_bits: int) -> int:
209
213
  """Lower sub-band decoder for last six bits."""
210
214
 
211
215
  # Block 5L
@@ -258,7 +262,7 @@ class G722Decoder(object):
258
262
 
259
263
  return rlow
260
264
 
261
- def higher_sub_band_decoder(self, higher_bits) -> int:
265
+ def higher_sub_band_decoder(self, higher_bits: int) -> int:
262
266
  """Higher sub-band decoder for first two bits."""
263
267
 
264
268
  # Block 2H
@@ -306,14 +310,14 @@ class G722Decoder(object):
306
310
 
307
311
 
308
312
  # -----------------------------------------------------------------------------
309
- class Band(object):
310
- """Structure for G722 decode proccessing."""
313
+ class Band:
314
+ """Structure for G722 decode processing."""
311
315
 
312
316
  s: int = 0
313
317
  nb: int = 0
314
318
  det: int = 0
315
319
 
316
- def __init__(self):
320
+ def __init__(self) -> None:
317
321
  self._sp = 0
318
322
  self._sz = 0
319
323
  self._r = [0] * 3
@@ -301,6 +301,8 @@ class Driver(common.Driver):
301
301
  fw_name: str = ""
302
302
  config_name: str = ""
303
303
 
304
+ POST_RESET_DELAY: float = 0.2
305
+
304
306
  DRIVER_INFOS = [
305
307
  # 8723A
306
308
  DriverInfo(
@@ -495,12 +497,24 @@ class Driver(common.Driver):
495
497
 
496
498
  @classmethod
497
499
  async def driver_info_for_host(cls, host):
498
- await host.send_command(HCI_Reset_Command(), check_result=True)
499
- host.ready = True # Needed to let the host know the controller is ready.
500
+ try:
501
+ await host.send_command(
502
+ HCI_Reset_Command(),
503
+ check_result=True,
504
+ response_timeout=cls.POST_RESET_DELAY,
505
+ )
506
+ host.ready = True # Needed to let the host know the controller is ready.
507
+ except asyncio.exceptions.TimeoutError:
508
+ logger.warning("timeout waiting for hci reset, retrying")
509
+ await host.send_command(HCI_Reset_Command(), check_result=True)
510
+ host.ready = True
511
+
512
+ command = HCI_Read_Local_Version_Information_Command()
513
+ response = await host.send_command(command, check_result=True)
514
+ if response.command_opcode != command.op_code:
515
+ logger.error("failed to probe local version information")
516
+ return None
500
517
 
501
- response = await host.send_command(
502
- HCI_Read_Local_Version_Information_Command(), check_result=True
503
- )
504
518
  local_version = response.return_parameters
505
519
 
506
520
  logger.debug(
@@ -238,22 +238,22 @@ GATT_SEARCH_CONTROL_POINT_CHARACTERISTIC = UUID.from_16_bits(0x
238
238
  GATT_CONTENT_CONTROL_ID_CHARACTERISTIC = UUID.from_16_bits(0x2BBA, 'Content Control Id')
239
239
 
240
240
  # Telephone Bearer Service (TBS)
241
- GATT_BEARER_PROVIDER_NAME_CHARACTERISTIC = UUID.from_16_bits(0x2BB4, 'Bearer Provider Name')
242
- GATT_BEARER_UCI_CHARACTERISTIC = UUID.from_16_bits(0x2BB5, 'Bearer UCI')
243
- GATT_BEARER_TECHNOLOGY_CHARACTERISTIC = UUID.from_16_bits(0x2BB6, 'Bearer Technology')
244
- GATT_BEARER_URI_SCHEMES_SUPPORTED_LIST_CHARACTERISTIC = UUID.from_16_bits(0x2BB7, 'Bearer URI Schemes Supported List')
245
- GATT_BEARER_SIGNAL_STRENGTH_CHARACTERISTIC = UUID.from_16_bits(0x2BB8, 'Bearer Signal Strength')
246
- GATT_BEARER_SIGNAL_STRENGTH_REPORTING_INTERVAL_CHARACTERISTIC = UUID.from_16_bits(0x2BB9, 'Bearer Signal Strength Reporting Interval')
247
- GATT_BEARER_LIST_CURRENT_CALLS_CHARACTERISTIC = UUID.from_16_bits(0x2BBA, 'Bearer List Current Calls')
248
- GATT_CONTENT_CONTROL_ID_CHARACTERISTIC = UUID.from_16_bits(0x2BBB, 'Content Control ID')
249
- GATT_STATUS_FLAGS_CHARACTERISTIC = UUID.from_16_bits(0x2BBC, 'Status Flags')
250
- GATT_INCOMING_CALL_TARGET_BEARER_URI_CHARACTERISTIC = UUID.from_16_bits(0x2BBD, 'Incoming Call Target Bearer URI')
251
- GATT_CALL_STATE_CHARACTERISTIC = UUID.from_16_bits(0x2BBE, 'Call State')
252
- GATT_CALL_CONTROL_POINT_CHARACTERISTIC = UUID.from_16_bits(0x2BBF, 'Call Control Point')
253
- GATT_CALL_CONTROL_POINT_OPTIONAL_OPCODES_CHARACTERISTIC = UUID.from_16_bits(0x2BC0, 'Call Control Point Optional Opcodes')
254
- GATT_TERMINATION_REASON_CHARACTERISTIC = UUID.from_16_bits(0x2BC1, 'Termination Reason')
255
- GATT_INCOMING_CALL_CHARACTERISTIC = UUID.from_16_bits(0x2BC2, 'Incoming Call')
256
- GATT_CALL_FRIENDLY_NAME_CHARACTERISTIC = UUID.from_16_bits(0x2BC3, 'Call Friendly Name')
241
+ GATT_BEARER_PROVIDER_NAME_CHARACTERISTIC = UUID.from_16_bits(0x2BB3, 'Bearer Provider Name')
242
+ GATT_BEARER_UCI_CHARACTERISTIC = UUID.from_16_bits(0x2BB4, 'Bearer UCI')
243
+ GATT_BEARER_TECHNOLOGY_CHARACTERISTIC = UUID.from_16_bits(0x2BB5, 'Bearer Technology')
244
+ GATT_BEARER_URI_SCHEMES_SUPPORTED_LIST_CHARACTERISTIC = UUID.from_16_bits(0x2BB6, 'Bearer URI Schemes Supported List')
245
+ GATT_BEARER_SIGNAL_STRENGTH_CHARACTERISTIC = UUID.from_16_bits(0x2BB7, 'Bearer Signal Strength')
246
+ GATT_BEARER_SIGNAL_STRENGTH_REPORTING_INTERVAL_CHARACTERISTIC = UUID.from_16_bits(0x2BB8, 'Bearer Signal Strength Reporting Interval')
247
+ GATT_BEARER_LIST_CURRENT_CALLS_CHARACTERISTIC = UUID.from_16_bits(0x2BB9, 'Bearer List Current Calls')
248
+ GATT_CONTENT_CONTROL_ID_CHARACTERISTIC = UUID.from_16_bits(0x2BBA, 'Content Control ID')
249
+ GATT_STATUS_FLAGS_CHARACTERISTIC = UUID.from_16_bits(0x2BBB, 'Status Flags')
250
+ GATT_INCOMING_CALL_TARGET_BEARER_URI_CHARACTERISTIC = UUID.from_16_bits(0x2BBC, 'Incoming Call Target Bearer URI')
251
+ GATT_CALL_STATE_CHARACTERISTIC = UUID.from_16_bits(0x2BBD, 'Call State')
252
+ GATT_CALL_CONTROL_POINT_CHARACTERISTIC = UUID.from_16_bits(0x2BBE, 'Call Control Point')
253
+ GATT_CALL_CONTROL_POINT_OPTIONAL_OPCODES_CHARACTERISTIC = UUID.from_16_bits(0x2BBF, 'Call Control Point Optional Opcodes')
254
+ GATT_TERMINATION_REASON_CHARACTERISTIC = UUID.from_16_bits(0x2BC0, 'Termination Reason')
255
+ GATT_INCOMING_CALL_CHARACTERISTIC = UUID.from_16_bits(0x2BC1, 'Incoming Call')
256
+ GATT_CALL_FRIENDLY_NAME_CHARACTERISTIC = UUID.from_16_bits(0x2BC2, 'Call Friendly Name')
257
257
 
258
258
  # Microphone Control Service (MICS)
259
259
  GATT_MUTE_CHARACTERISTIC = UUID.from_16_bits(0x2BC3, 'Mute')
@@ -275,6 +275,11 @@ GATT_SOURCE_AUDIO_LOCATION_CHARACTERISTIC = UUID.from_16_bits(0x2BCC, 'Sou
275
275
  GATT_AVAILABLE_AUDIO_CONTEXTS_CHARACTERISTIC = UUID.from_16_bits(0x2BCD, 'Available Audio Contexts')
276
276
  GATT_SUPPORTED_AUDIO_CONTEXTS_CHARACTERISTIC = UUID.from_16_bits(0x2BCE, 'Supported Audio Contexts')
277
277
 
278
+ # Hearing Access Service
279
+ GATT_HEARING_AID_FEATURES_CHARACTERISTIC = UUID.from_16_bits(0x2BDA, 'Hearing Aid Features')
280
+ GATT_HEARING_AID_PRESET_CONTROL_POINT_CHARACTERISTIC = UUID.from_16_bits(0x2BDB, 'Hearing Aid Preset Control Point')
281
+ GATT_ACTIVE_PRESET_INDEX_CHARACTERISTIC = UUID.from_16_bits(0x2BDC, 'Active Preset Index')
282
+
278
283
  # ASHA Service
279
284
  GATT_ASHA_SERVICE = UUID.from_16_bits(0xFDF0, 'Audio Streaming for Hearing Aid')
280
285
  GATT_ASHA_READ_ONLY_PROPERTIES_CHARACTERISTIC = UUID('6333651e-c481-4a3e-9169-7c902aad37bb', 'ReadOnlyProperties')
@@ -340,7 +345,7 @@ class Service(Attribute):
340
345
  uuid: Union[str, UUID],
341
346
  characteristics: List[Characteristic],
342
347
  primary=True,
343
- included_services: List[Service] = [],
348
+ included_services: Iterable[Service] = (),
344
349
  ) -> None:
345
350
  # Convert the uuid to a UUID object if it isn't already
346
351
  if isinstance(uuid, str):
@@ -356,7 +361,7 @@ class Service(Attribute):
356
361
  uuid.to_pdu_bytes(),
357
362
  )
358
363
  self.uuid = uuid
359
- self.included_services = included_services[:]
364
+ self.included_services = list(included_services)
360
365
  self.characteristics = characteristics[:]
361
366
  self.primary = primary
362
367
 
@@ -390,7 +395,7 @@ class TemplateService(Service):
390
395
  self,
391
396
  characteristics: List[Characteristic],
392
397
  primary: bool = True,
393
- included_services: List[Service] = [],
398
+ included_services: Iterable[Service] = (),
394
399
  ) -> None:
395
400
  super().__init__(self.UUID, characteristics, primary, included_services)
396
401
 
@@ -68,7 +68,7 @@ from .att import (
68
68
  ATT_Error,
69
69
  )
70
70
  from . import core
71
- from .core import UUID, InvalidStateError, ProtocolError
71
+ from .core import UUID, InvalidStateError
72
72
  from .gatt import (
73
73
  GATT_CHARACTERISTIC_ATTRIBUTE_TYPE,
74
74
  GATT_CLIENT_CHARACTERISTIC_CONFIGURATION_DESCRIPTOR,
@@ -345,12 +345,7 @@ class Client:
345
345
  self.mtu_exchange_done = True
346
346
  response = await self.send_request(ATT_Exchange_MTU_Request(client_rx_mtu=mtu))
347
347
  if response.op_code == ATT_ERROR_RESPONSE:
348
- raise ProtocolError(
349
- response.error_code,
350
- 'att',
351
- ATT_PDU.error_name(response.error_code),
352
- response,
353
- )
348
+ raise ATT_Error(error_code=response.error_code, message=response)
354
349
 
355
350
  # Compute the final MTU
356
351
  self.connection.att_mtu = min(mtu, response.server_rx_mtu)
@@ -936,12 +931,7 @@ class Client:
936
931
  if response is None:
937
932
  raise TimeoutError('read timeout')
938
933
  if response.op_code == ATT_ERROR_RESPONSE:
939
- raise ProtocolError(
940
- response.error_code,
941
- 'att',
942
- ATT_PDU.error_name(response.error_code),
943
- response,
944
- )
934
+ raise ATT_Error(error_code=response.error_code, message=response)
945
935
 
946
936
  # If the value is the max size for the MTU, try to read more unless the caller
947
937
  # specifically asked not to do that
@@ -963,12 +953,7 @@ class Client:
963
953
  ATT_INVALID_OFFSET_ERROR,
964
954
  ):
965
955
  break
966
- raise ProtocolError(
967
- response.error_code,
968
- 'att',
969
- ATT_PDU.error_name(response.error_code),
970
- response,
971
- )
956
+ raise ATT_Error(error_code=response.error_code, message=response)
972
957
 
973
958
  part = response.part_attribute_value
974
959
  attribute_value += part
@@ -1061,12 +1046,7 @@ class Client:
1061
1046
  )
1062
1047
  )
1063
1048
  if response.op_code == ATT_ERROR_RESPONSE:
1064
- raise ProtocolError(
1065
- response.error_code,
1066
- 'att',
1067
- ATT_PDU.error_name(response.error_code),
1068
- response,
1069
- )
1049
+ raise ATT_Error(error_code=response.error_code, message=response)
1070
1050
  else:
1071
1051
  await self.send_command(
1072
1052
  ATT_Write_Command(
@@ -915,7 +915,7 @@ class Server(EventEmitter):
915
915
  See Bluetooth spec Vol 3, Part F - 3.4.5.1 Write Request
916
916
  '''
917
917
 
918
- # Check that the attribute exists
918
+ # Check that the attribute exists
919
919
  attribute = self.get_attribute(request.attribute_handle)
920
920
  if attribute is None:
921
921
  self.send_response(
@@ -942,11 +942,19 @@ class Server(EventEmitter):
942
942
  )
943
943
  return
944
944
 
945
- # Accept the value
946
- await attribute.write_value(connection, request.attribute_value)
947
-
948
- # Done
949
- self.send_response(connection, ATT_Write_Response())
945
+ try:
946
+ # Accept the value
947
+ await attribute.write_value(connection, request.attribute_value)
948
+ except ATT_Error as error:
949
+ response = ATT_Error_Response(
950
+ request_opcode_in_error=request.op_code,
951
+ attribute_handle_in_error=request.attribute_handle,
952
+ error_code=error.error_code,
953
+ )
954
+ else:
955
+ # Done
956
+ response = ATT_Write_Response()
957
+ self.send_response(connection, response)
950
958
 
951
959
  @AsyncRunner.run_in_task()
952
960
  async def on_att_write_command(self, connection, request):