1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_bluetooth: 2*61c4878aSAndroid Build Coastguard Worker 3*61c4878aSAndroid Build Coastguard Worker============ 4*61c4878aSAndroid Build Coastguard Workerpw_bluetooth 5*61c4878aSAndroid Build Coastguard Worker============ 6*61c4878aSAndroid Build Coastguard Worker.. pigweed-module:: 7*61c4878aSAndroid Build Coastguard Worker :name: pw_bluetooth 8*61c4878aSAndroid Build Coastguard Worker 9*61c4878aSAndroid Build Coastguard WorkerThe ``pw_bluetooth`` module contains APIs and utilities for the host layer of 10*61c4878aSAndroid Build Coastguard WorkerBluetooth Low Energy. 11*61c4878aSAndroid Build Coastguard Worker 12*61c4878aSAndroid Build Coastguard Worker-------- 13*61c4878aSAndroid Build Coastguard WorkerHost API 14*61c4878aSAndroid Build Coastguard Worker-------- 15*61c4878aSAndroid Build Coastguard Worker.. attention:: 16*61c4878aSAndroid Build Coastguard Worker 17*61c4878aSAndroid Build Coastguard Worker This module is still under construction, the API is not yet stable. 18*61c4878aSAndroid Build Coastguard Worker 19*61c4878aSAndroid Build Coastguard WorkerThe headers in ``public/pw_bluetooth`` constitute generic interfaces and types 20*61c4878aSAndroid Build Coastguard Workerfor a Bluetooth Host API. Currently, only Low Energy APIs exist. 21*61c4878aSAndroid Build Coastguard Worker 22*61c4878aSAndroid Build Coastguard Workerlow_energy::Central2 23*61c4878aSAndroid Build Coastguard Worker==================== 24*61c4878aSAndroid Build Coastguard Worker.. doxygenclass:: pw::bluetooth::low_energy::Central2 25*61c4878aSAndroid Build Coastguard Worker :members: 26*61c4878aSAndroid Build Coastguard Worker 27*61c4878aSAndroid Build Coastguard Workerlow_energy::Peripheral2 28*61c4878aSAndroid Build Coastguard Worker======================= 29*61c4878aSAndroid Build Coastguard Worker.. doxygenclass:: pw::bluetooth::low_energy::Peripheral2 30*61c4878aSAndroid Build Coastguard Worker :members: 31*61c4878aSAndroid Build Coastguard Worker 32*61c4878aSAndroid Build Coastguard Workerlow_energy::AdvertisedPeripheral2 33*61c4878aSAndroid Build Coastguard Worker================================= 34*61c4878aSAndroid Build Coastguard Worker.. doxygenclass:: pw::bluetooth::low_energy::AdvertisedPeripheral2 35*61c4878aSAndroid Build Coastguard Worker :members: 36*61c4878aSAndroid Build Coastguard Worker 37*61c4878aSAndroid Build Coastguard Workerlow_energy::Connection2 38*61c4878aSAndroid Build Coastguard Worker======================= 39*61c4878aSAndroid Build Coastguard Worker.. doxygenclass:: pw::bluetooth::low_energy::Connection2 40*61c4878aSAndroid Build Coastguard Worker :members: 41*61c4878aSAndroid Build Coastguard Worker 42*61c4878aSAndroid Build Coastguard Workerlow_energy::Channel 43*61c4878aSAndroid Build Coastguard Worker=================== 44*61c4878aSAndroid Build Coastguard Worker.. doxygenclass:: pw::bluetooth::low_energy::Channel 45*61c4878aSAndroid Build Coastguard Worker :members: 46*61c4878aSAndroid Build Coastguard Worker 47*61c4878aSAndroid Build Coastguard Worker 48*61c4878aSAndroid Build Coastguard Workerlow_energy::ChannelListenerRegistry 49*61c4878aSAndroid Build Coastguard Worker=================================== 50*61c4878aSAndroid Build Coastguard Worker.. doxygenclass:: pw::bluetooth::low_energy::ChannelListenerRegistry 51*61c4878aSAndroid Build Coastguard Worker :members: 52*61c4878aSAndroid Build Coastguard Worker 53*61c4878aSAndroid Build Coastguard Workerlow_energy::ChannelListener 54*61c4878aSAndroid Build Coastguard Worker=================================== 55*61c4878aSAndroid Build Coastguard Worker.. doxygenclass:: pw::bluetooth::low_energy::ChannelListener 56*61c4878aSAndroid Build Coastguard Worker :members: 57*61c4878aSAndroid Build Coastguard Worker 58*61c4878aSAndroid Build Coastguard Workergatt::Server2 59*61c4878aSAndroid Build Coastguard Worker============= 60*61c4878aSAndroid Build Coastguard Worker.. doxygenclass:: pw::bluetooth::gatt::Server2 61*61c4878aSAndroid Build Coastguard Worker :members: 62*61c4878aSAndroid Build Coastguard Worker 63*61c4878aSAndroid Build Coastguard Workergatt::LocalService2 64*61c4878aSAndroid Build Coastguard Worker=================== 65*61c4878aSAndroid Build Coastguard Worker.. doxygenclass:: pw::bluetooth::gatt::LocalService2 66*61c4878aSAndroid Build Coastguard Worker :members: 67*61c4878aSAndroid Build Coastguard Worker 68*61c4878aSAndroid Build Coastguard Workergatt::LocalServiceDelegate2 69*61c4878aSAndroid Build Coastguard Worker=========================== 70*61c4878aSAndroid Build Coastguard Worker.. doxygenclass:: pw::bluetooth::gatt::LocalServiceDelegate2 71*61c4878aSAndroid Build Coastguard Worker :members: 72*61c4878aSAndroid Build Coastguard Worker 73*61c4878aSAndroid Build Coastguard Workergatt::Client2 74*61c4878aSAndroid Build Coastguard Worker============= 75*61c4878aSAndroid Build Coastguard Worker.. doxygenclass:: pw::bluetooth::gatt::Client2 76*61c4878aSAndroid Build Coastguard Worker :members: 77*61c4878aSAndroid Build Coastguard Worker 78*61c4878aSAndroid Build Coastguard Workergatt::RemoteService2 79*61c4878aSAndroid Build Coastguard Worker==================== 80*61c4878aSAndroid Build Coastguard Worker.. doxygenclass:: pw::bluetooth::gatt::RemoteService2 81*61c4878aSAndroid Build Coastguard Worker :members: 82*61c4878aSAndroid Build Coastguard Worker 83*61c4878aSAndroid Build Coastguard WorkerController2 84*61c4878aSAndroid Build Coastguard Worker=========== 85*61c4878aSAndroid Build Coastguard Worker.. doxygenclass:: pw::bluetooth::Controller2 86*61c4878aSAndroid Build Coastguard Worker :members: 87*61c4878aSAndroid Build Coastguard Worker 88*61c4878aSAndroid Build Coastguard Worker---------------------------- 89*61c4878aSAndroid Build Coastguard WorkerModule Configuration Options 90*61c4878aSAndroid Build Coastguard Worker---------------------------- 91*61c4878aSAndroid Build Coastguard WorkerThe following configurations can be adjusted via compile-time configuration of 92*61c4878aSAndroid Build Coastguard Workerthis module, see the 93*61c4878aSAndroid Build Coastguard Worker:ref:`module documentation <module-structure-compile-time-configuration>` for 94*61c4878aSAndroid Build Coastguard Workermore details. 95*61c4878aSAndroid Build Coastguard Worker 96*61c4878aSAndroid Build Coastguard Worker.. c:macro:: PW_BLUETOOTH_DESCRIPTOR_VEC_SIZE 97*61c4878aSAndroid Build Coastguard Worker 98*61c4878aSAndroid Build Coastguard Worker Controls the size of ``Vector<Descriptor>`` in the above APIs. 99*61c4878aSAndroid Build Coastguard Worker 100*61c4878aSAndroid Build Coastguard Worker------------------------- 101*61c4878aSAndroid Build Coastguard WorkerEmboss Packet Definitions 102*61c4878aSAndroid Build Coastguard Worker------------------------- 103*61c4878aSAndroid Build Coastguard Worker``pw_bluetooth`` contains `Emboss <https://github.com/google/emboss>`_ packet 104*61c4878aSAndroid Build Coastguard Workerdefinitions. So far, some packets and enums from the following protocols are 105*61c4878aSAndroid Build Coastguard Workerdefined: 106*61c4878aSAndroid Build Coastguard Worker 107*61c4878aSAndroid Build Coastguard Worker- HCI 108*61c4878aSAndroid Build Coastguard Worker- L2CAP 109*61c4878aSAndroid Build Coastguard Worker- H4 110*61c4878aSAndroid Build Coastguard Worker 111*61c4878aSAndroid Build Coastguard Worker.. _module-pw_bluetooth-usage: 112*61c4878aSAndroid Build Coastguard Worker 113*61c4878aSAndroid Build Coastguard WorkerUsage 114*61c4878aSAndroid Build Coastguard Worker===== 115*61c4878aSAndroid Build Coastguard Worker1. Add Emboss to your project as described in 116*61c4878aSAndroid Build Coastguard Worker :ref:`module-pw_third_party_emboss`. 117*61c4878aSAndroid Build Coastguard Worker 118*61c4878aSAndroid Build Coastguard Worker.. tab-set:: 119*61c4878aSAndroid Build Coastguard Worker 120*61c4878aSAndroid Build Coastguard Worker .. tab-item:: Bazel 121*61c4878aSAndroid Build Coastguard Worker :sync: bazel 122*61c4878aSAndroid Build Coastguard Worker 123*61c4878aSAndroid Build Coastguard Worker 2. Add the Emboss target you require to your build target's dependency 124*61c4878aSAndroid Build Coastguard Worker list - for example, ``@pigweed//pw_bluetooth:emboss_hci_group`` for HCI 125*61c4878aSAndroid Build Coastguard Worker packets. 126*61c4878aSAndroid Build Coastguard Worker 127*61c4878aSAndroid Build Coastguard Worker .. tab-item:: GN 128*61c4878aSAndroid Build Coastguard Worker :sync: gn 129*61c4878aSAndroid Build Coastguard Worker 130*61c4878aSAndroid Build Coastguard Worker 2. Add the Emboss target you require to your build target's dependency 131*61c4878aSAndroid Build Coastguard Worker list - for example, ``$dir_pw_bluetooth/emboss_hci_group`` for HCI 132*61c4878aSAndroid Build Coastguard Worker packets. 133*61c4878aSAndroid Build Coastguard Worker 134*61c4878aSAndroid Build Coastguard Worker .. tab-item:: CMake 135*61c4878aSAndroid Build Coastguard Worker :sync: cmake 136*61c4878aSAndroid Build Coastguard Worker 137*61c4878aSAndroid Build Coastguard Worker 2. Add the Emboss target you require to your build target's dependency 138*61c4878aSAndroid Build Coastguard Worker list - for example, ``pw_bluetooth.emboss_hci_group`` for HCI packets. 139*61c4878aSAndroid Build Coastguard Worker 140*61c4878aSAndroid Build Coastguard Worker 141*61c4878aSAndroid Build Coastguard Worker3. Include the generated header files you require in your source files. 142*61c4878aSAndroid Build Coastguard Worker 143*61c4878aSAndroid Build Coastguard Worker.. code-block:: cpp 144*61c4878aSAndroid Build Coastguard Worker 145*61c4878aSAndroid Build Coastguard Worker #include "pw_bluetooth/hci_commands.emb.h" 146*61c4878aSAndroid Build Coastguard Worker #include "pw_bluetooth/hci_android.emb.h" 147*61c4878aSAndroid Build Coastguard Worker 148*61c4878aSAndroid Build Coastguard Worker.. inclusive-language: disable 149*61c4878aSAndroid Build Coastguard Worker 150*61c4878aSAndroid Build Coastguard Worker4. Construct an Emboss view over a buffer as described in the `Emboss User Guide 151*61c4878aSAndroid Build Coastguard Worker <https://github.com/google/emboss/blob/master/doc/guide.md>`_. 152*61c4878aSAndroid Build Coastguard Worker 153*61c4878aSAndroid Build Coastguard Worker.. inclusive-language: enable 154*61c4878aSAndroid Build Coastguard Worker 155*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: emboss_test.cc 156*61c4878aSAndroid Build Coastguard Worker :language: cpp 157*61c4878aSAndroid Build Coastguard Worker :start-after: [pw_bluetooth-examples-make_view] 158*61c4878aSAndroid Build Coastguard Worker :end-before: [pw_bluetooth-examples-make_view] 159*61c4878aSAndroid Build Coastguard Worker 160*61c4878aSAndroid Build Coastguard Worker.. note:: 161*61c4878aSAndroid Build Coastguard Worker 162*61c4878aSAndroid Build Coastguard Worker When you first add generated headers, ``clangd`` may complain that the 163*61c4878aSAndroid Build Coastguard Worker generated header files do not exist. You need to build your project to 164*61c4878aSAndroid Build Coastguard Worker resolve this. Similarly, you need to rebuild in order for .emb file updates 165*61c4878aSAndroid Build Coastguard Worker to be reflected in the generated headers. 166*61c4878aSAndroid Build Coastguard Worker 167*61c4878aSAndroid Build Coastguard Worker.. _module-pw_bluetooth-contributing: 168*61c4878aSAndroid Build Coastguard Worker 169*61c4878aSAndroid Build Coastguard WorkerContributing 170*61c4878aSAndroid Build Coastguard Worker============ 171*61c4878aSAndroid Build Coastguard WorkerEmboss ``.emb`` files can be edited to add additional packets and enums. 172*61c4878aSAndroid Build Coastguard Worker 173*61c4878aSAndroid Build Coastguard WorkerEmboss files should be formatted by running the following from the Pigweed root. 174*61c4878aSAndroid Build Coastguard Worker 175*61c4878aSAndroid Build Coastguard Worker.. code-block:: bash 176*61c4878aSAndroid Build Coastguard Worker 177*61c4878aSAndroid Build Coastguard Worker (export EMBOSS_PATH="environment/packages/emboss" && 178*61c4878aSAndroid Build Coastguard Worker export PYTHONPATH+=":${EMBOSS_PATH}" && 179*61c4878aSAndroid Build Coastguard Worker python3 "${EMBOSS_PATH}/compiler/front_end/format.py" pw_bluetooth/public/pw_bluetooth/*.emb) 180*61c4878aSAndroid Build Coastguard Worker 181*61c4878aSAndroid Build Coastguard WorkerIf adding files, be sure to update the GN, Bazel, and CMake build rules. 182*61c4878aSAndroid Build Coastguard WorkerPresubmit runs the ``emboss_test.cc`` test on all three. 183*61c4878aSAndroid Build Coastguard Worker 184*61c4878aSAndroid Build Coastguard Worker 185*61c4878aSAndroid Build Coastguard WorkerSize Report 186*61c4878aSAndroid Build Coastguard Worker=========== 187*61c4878aSAndroid Build Coastguard WorkerDelta of +972 when constructing the first packet view and reading/writing a 188*61c4878aSAndroid Build Coastguard Workerfield. This includes the runtime library and the 4-byte buffer. 189*61c4878aSAndroid Build Coastguard Worker 190*61c4878aSAndroid Build Coastguard Worker.. include:: emboss_size_report 191*61c4878aSAndroid Build Coastguard Worker 192*61c4878aSAndroid Build Coastguard WorkerDelta of +96 when adding a second packet view and reading/writing a field. 193*61c4878aSAndroid Build Coastguard Worker 194*61c4878aSAndroid Build Coastguard Worker.. include:: emboss_size_report_diff 195*61c4878aSAndroid Build Coastguard Worker 196*61c4878aSAndroid Build Coastguard Worker------- 197*61c4878aSAndroid Build Coastguard WorkerRoadmap 198*61c4878aSAndroid Build Coastguard Worker------- 199*61c4878aSAndroid Build Coastguard Worker- Bluetooth Proxy (WIP in in :ref:`module-pw_bluetooth_proxy`) 200*61c4878aSAndroid Build Coastguard Worker- Add automated Emboss file formatting to `pw format` (:bug:`331195584`) 201*61c4878aSAndroid Build Coastguard Worker- Create a backend for the Bluetooth API using Fuchsia's Bluetooth stack 202*61c4878aSAndroid Build Coastguard Worker (Sapphire). 203*61c4878aSAndroid Build Coastguard Worker- Stabilize the Bluetooth API. 204*61c4878aSAndroid Build Coastguard Worker- Add BR/EDR APIs. 205