.. _module-pw_bluetooth_profiles:

=====================
pw_bluetooth_profiles
=====================

.. attention::

  ``pw_bluetooth_profiles`` is under construction, depends on the experimental
  ``pw_bluetooth`` module and may see significant breaking API changes.

The ``pw_bluetooth_profiles`` module provides a collection of implementations
for basic Bluetooth profiles built on top of the ``pw_bluetooth`` module API.
These profiles are independent from each other

--------------------------
Device Information Service
--------------------------
The ``device_info_service`` target implements the Device Information Service
(DIS) as defined in the specification version 1.1. It exposes up to nine
different basic properties of the device such as the model, manufacturer or
serial number, all of which are optional. This module implements the GATT
server-side service (``bluetooth::gatt::LocalServiceDelegate``) with the
following limitations:

 - The subset of properties exposed and their values are constant throughout the
   life of the service.
 - The subset of properties is defined at compile time, but the values may be
   defined at runtime before service initialization. For example, the serial
   number property might be different for different devices running the same
   code.
 - All property values must be available in memory while the service is
   published. Rather than using a callback mechanism to let the user produce the
   property value at run-time, this module expects those values to be readily
   available when initialized, but they can be stored in read-only memory.

Usage
-----
The main intended usage of the service consists on creating and publishing the
service, leaving it published forever referencing the values passed on
initialization.

The subset of properties exposed is a template parameter bit field
(``DeviceInfo::Field``) and can't be changed at run-time. The ``pw::span``
values referenced in the ``DeviceInfo`` struct must remain available after
initialization to avoid copying them to RAM in the service, but the
``DeviceInfo`` struct itself can be destroyed after initialization.

Example code:

.. code-block:: cpp

  using pw::bluetooth_profiles::DeviceInfo;
  using pw::bluetooth_profiles::DeviceInfoService;

  // Global serial number for the device, initialized elsewhere.
  pw::InlineString serial_number(...);

  // Select which fields to expose at compile-time with a constexpr template
  // parameter.
  constexpr auto kUsedFields = DeviceInfo::Field::kModelNumber |
                               DeviceInfo::Field::kSerialNumber |
                               DeviceInfo::Field::kSoftwareRevision;

  // Create a DeviceInfo with the values. Values are referenced from the
  // service, not copied, so they must remain available while the service is
  // published.
  DeviceInfo device_info = {};
  device_info.model_number = pw::as_bytes(pw::span{"My Model"sv});
  device_info.software_revision = pw::as_bytes(pw::span{REVISION_MACRO});
  device_info.serial_number = pw::as_bytes(
      pw::span(serial_number.data(), serial_number.size()));

  DeviceInfoService<kUsedFields, pw::bluetooth::gatt::Handle{123}>
      device_info_service{device_info};
  device_info_service.PublishService(...);
