Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 858d2c39 authored by Chienyuan's avatar Chienyuan
Browse files

gd: Handle periodic advertising in start advertising

Tag: #gd-refactor
Bug: 169125803
Test: cert/run --host
Test: atest --host bluetooth_test_gd
Change-Id: Ie07221ad62a5d7674f8cfc6b2253231b5f15f668
parent a61e6c92
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -284,6 +284,12 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
    }
    set_data(id, false, config.advertisement);

    if (!config.periodic_data.empty()) {
      set_periodic_parameter(id, config.periodic_advertising_parameters);
      set_periodic_data(id, config.periodic_data);
      enable_periodic_advertising(id, true);
    }

    if (!paused) {
      enable_advertiser(id, true, 0, 0);
    } else {
+10 −9
Original line number Diff line number Diff line
@@ -25,6 +25,14 @@
namespace bluetooth {
namespace hci {

class PeriodicAdvertisingParameters {
 public:
  uint16_t min_interval;
  uint16_t max_interval;
  uint16_t properties;
  enum AdvertisingProperty { INCLUDE_TX_POWER = 0x06 };
};

class AdvertisingConfig {
 public:
  std::vector<GapData> advertisement;
@@ -54,19 +62,12 @@ class ExtendedAdvertisingConfig : public AdvertisingConfig {
  SecondaryPhyType secondary_advertising_phy;
  uint8_t sid = 0x00;
  Enable enable_scan_request_notifications = Enable::DISABLED;
  std::vector<GapData> periodic_data;
  PeriodicAdvertisingParameters periodic_advertising_parameters;
  ExtendedAdvertisingConfig() = default;
  ExtendedAdvertisingConfig(const AdvertisingConfig& config);
};

class PeriodicAdvertisingParameters {
 public:
  uint16_t min_interval;
  uint16_t max_interval;
  uint16_t properties;

  enum AdvertisingProperty { INCLUDE_TX_POWER = 0x06 };
};

using AdvertiserId = uint8_t;

class AdvertisingCallback {
+20 −0
Original line number Diff line number Diff line
@@ -140,6 +140,12 @@ class BleAdvertiserInterfaceImpl : public BleAdvertiserInterface,

    bluetooth::hci::ExtendedAdvertisingConfig config{};
    parse_parameter(config, params);
    bluetooth::hci::PeriodicAdvertisingParameters periodic_parameters;
    periodic_parameters.max_interval = periodic_params.max_interval;
    periodic_parameters.min_interval = periodic_params.min_interval;
    periodic_parameters.properties =
        periodic_params.periodic_advertising_properties;
    config.periodic_advertising_parameters = periodic_parameters;

    size_t offset = 0;
    while (offset < advertise_data.size()) {
@@ -169,6 +175,20 @@ class BleAdvertiserInterfaceImpl : public BleAdvertiserInterface,
      offset += len + 1;  // 1 byte for len
    }

    offset = 0;
    while (offset < periodic_data.size()) {
      GapData gap_data;
      uint8_t len = periodic_data[offset];
      auto begin = periodic_data.begin() + offset;
      auto end = begin + len + 1;  // 1 byte for len
      auto data_copy = std::make_shared<std::vector<uint8_t>>(begin, end);
      bluetooth::packet::PacketView<bluetooth::packet::kLittleEndian> packet(
          data_copy);
      GapData::Parse(&gap_data, packet.begin());
      config.periodic_data.push_back(gap_data);
      offset += len + 1;  // 1 byte for len
    }

    bluetooth::hci::AdvertiserId id =
        bluetooth::shim::GetAdvertising()->ExtendedCreateAdvertiser(
            reg_id, config, scan_callback, set_terminated_callback,