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

Commit 15f5dd4a authored by hong.wang's avatar hong.wang Committed by Automerger Merge Worker
Browse files

Fix Advertising_instance address when multi-adv device is connected am: 09bb036f

parents 40387a47 09bb036f
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -777,6 +777,7 @@ enum SubeventCode : 8 {
// Vendor specific events
enum VseSubeventCode : 8 {
  BLE_THRESHOLD = 0x54,
  BLE_STCHANGE = 0x55,
  BLE_TRACKING = 0x56,
  DEBUG_INFO = 0x57,
  BQR_EVENT = 0x58,
@@ -6000,6 +6001,17 @@ packet LEAdvertisementTrackingEvent : VendorSpecificEvent (subevent_code = BLE_T
  _body_,
}

enum VseStateChangeReason : 8 {
  CONNECTION_RECEIVED = 0x00,
}

packet LEAdvertiseStateChangeEvent : VendorSpecificEvent (subevent_code = BLE_STCHANGE) {
  advertising_instance : 8,
  state_change_reason : VseStateChangeReason,
  connection_handle : 12,
  reserved : 4,
}

packet LEAdvertisementTrackingWithInfoEvent : LEAdvertisementTrackingEvent {
  tx_power : 8,
  rssi : 8,
+37 −5
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include "hci/hci_layer.h"
#include "hci/hci_packets.h"
#include "hci/le_advertising_interface.h"
#include "hci/vendor_specific_event_manager.h"
#include "module.h"
#include "os/handler.h"
#include "os/log.h"
@@ -103,17 +104,25 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
    advertising_sets_.clear();
  }

  void start(os::Handler* handler, hci::HciLayer* hci_layer, hci::Controller* controller,
             hci::AclManager* acl_manager) {
  void start(
      os::Handler* handler,
      hci::HciLayer* hci_layer,
      hci::Controller* controller,
      hci::AclManager* acl_manager,
      hci::VendorSpecificEventManager* vendor_specific_event_manager) {
    module_handler_ = handler;
    hci_layer_ = hci_layer;
    controller_ = controller;
    le_maximum_advertising_data_length_ = controller_->GetLeMaximumAdvertisingDataLength();
    acl_manager_ = acl_manager;
    le_address_manager_ = acl_manager->GetLeAddressManager();
    num_instances_ = controller_->GetLeNumberOfSupportedAdverisingSets();

    le_advertising_interface_ =
        hci_layer_->GetLeAdvertisingInterface(module_handler_->BindOn(this, &LeAdvertisingManager::impl::handle_event));
    num_instances_ = controller_->GetLeNumberOfSupportedAdverisingSets();
    vendor_specific_event_manager->RegisterEventHandler(
        hci::VseSubeventCode::BLE_STCHANGE,
        handler->BindOn(this, &LeAdvertisingManager::impl::multi_advertising_state_change));

    if (controller_->SupportsBleExtendedAdvertising()) {
      advertising_api_type_ = AdvertisingApiType::EXTENDED;
@@ -152,6 +161,24 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
    advertising_callbacks_ = advertising_callback;
  }

  void multi_advertising_state_change(hci::VendorSpecificEventView event) {
    auto view = hci::LEAdvertiseStateChangeEventView::Create(event);
    ASSERT(view.IsValid());
    LOG_INFO(
        "Instance: 0x%x StateChangeReason: 0x%s Handle: 0x%x Address: %s",
        view.GetAdvertisingInstance(),
        VseStateChangeReasonText(view.GetStateChangeReason()).c_str(),
        view.GetConnectionHandle(),
        advertising_sets_[view.GetAdvertisingInstance()].current_address.ToString().c_str());

    if (view.GetStateChangeReason() == VseStateChangeReason::CONNECTION_RECEIVED) {
      acl_manager_->OnAdvertisingSetTerminated(
          ErrorCode::SUCCESS,
          view.GetConnectionHandle(),
          advertising_sets_[view.GetAdvertisingInstance()].current_address);
    }
  }

  void handle_event(LeMetaEventView event) {
    switch (event.GetSubeventCode()) {
      case hci::SubeventCode::SCAN_REQUEST_RECEIVED:
@@ -1374,11 +1401,16 @@ void LeAdvertisingManager::ListDependencies(ModuleList* list) const {
  list->add<hci::HciLayer>();
  list->add<hci::Controller>();
  list->add<hci::AclManager>();
  list->add<hci::VendorSpecificEventManager>();
}

void LeAdvertisingManager::Start() {
  pimpl_->start(GetHandler(), GetDependency<hci::HciLayer>(), GetDependency<hci::Controller>(),
                GetDependency<AclManager>());
  pimpl_->start(
      GetHandler(),
      GetDependency<hci::HciLayer>(),
      GetDependency<hci::Controller>(),
      GetDependency<AclManager>(),
      GetDependency<VendorSpecificEventManager>());
}

void LeAdvertisingManager::Stop() {