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

Commit 985c11f7 authored by Chienyuan's avatar Chienyuan
Browse files

GD: Reenable advertising when terminated

Tag: #refactor
Bug: 205193215
Test: gd/cert/run
Test: manual
BYPASS_LONG_LINES_REASON: Bluetooth likes 120 lines

Change-Id: Ib940afab707a8a877b98e6565dfb31007734c33b
parent 4cd9f204
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -13,15 +13,17 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include "hci/le_advertising_manager.h"

#include <memory>
#include <mutex>

#include "common/init_flags.h"
#include "hci/acl_manager.h"
#include "hci/controller.h"
#include "hci/hci_layer.h"
#include "hci/hci_packets.h"
#include "hci/le_advertising_interface.h"
#include "hci/le_advertising_manager.h"
#include "module.h"
#include "os/handler.h"
#include "os/log.h"
@@ -56,6 +58,7 @@ struct Advertiser {
  uint8_t max_extended_advertising_events;
  bool started = false;
  bool connectable = false;
  bool directed = false;
  std::unique_ptr<os::Alarm> address_rotation_alarm;
};

@@ -168,6 +171,7 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
      LOG_INFO("Dropping invalid advertising event");
      return;
    }
    LOG_VERBOSE("Received LE Advertising Set Terminated with status %s", ErrorCodeText(event_view.GetStatus()).c_str());

    uint8_t advertiser_id = event_view.GetAdvertisingHandle();

@@ -181,6 +185,15 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb

    acl_manager_->OnAdvertisingSetTerminated(
        event_view.GetStatus(), event_view.GetConnectionHandle(), advertiser_address);

    if (!advertising_sets_[advertiser_id].directed) {
      // TODO calculate remaining duration and advertising events
      if (advertising_sets_[advertiser_id].duration == 0 &&
          advertising_sets_[advertiser_id].max_extended_advertising_events == 0) {
        LOG_INFO("Reenable advertising");
        enable_advertiser(advertiser_id, true, 0, 0);
      }
    }
  }

  AdvertiserId allocate_advertiser() {
@@ -460,6 +473,7 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
  void set_parameters(AdvertiserId advertiser_id, ExtendedAdvertisingConfig config) {
    advertising_sets_[advertiser_id].connectable = config.connectable;
    advertising_sets_[advertiser_id].tx_power = config.tx_power;
    advertising_sets_[advertiser_id].directed = config.directed;

    switch (advertising_api_type_) {
      case (AdvertisingApiType::LEGACY): {