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

Commit ec5800d2 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "gd: Implement register/unregister scanner"

parents 91a01109 38feeb55
Loading
Loading
Loading
Loading
+56 −0
Original line number Diff line number Diff line
@@ -41,6 +41,11 @@ enum class ScanApiType {
  EXTENDED = 3,
};

struct Scanner {
  Uuid app_uuid;
  bool in_use;
};

struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback {
  impl(Module* module) : module_(module), le_scanning_interface_(nullptr) {}

@@ -65,6 +70,11 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback
    } else {
      api_type_ = ScanApiType::LEGACY;
    }
    scanners_ = std::vector<Scanner>(kMaxAppNum + 1);
    for (size_t i = 0; i < scanners_.size(); i++) {
      scanners_[i].app_uuid = Uuid::kEmpty;
      scanners_[i].in_use = false;
    }
    configure_scan();
  }

@@ -149,6 +159,43 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback
    }
  }

  void register_scanner(const Uuid app_uuid) {
    for (uint8_t i = 1; i <= kMaxAppNum; i++) {
      if (scanners_[i].in_use && scanners_[i].app_uuid == app_uuid) {
        LOG_ERROR("Application already registered %s", app_uuid.ToString().c_str());
        scanning_callbacks_->OnScannerRegistered(app_uuid, 0x00, ScanningCallback::ScanningStatus::INTERNAL_ERROR);
        return;
      }
    }

    // valid value of scanner id : 1 ~ kMaxAppNum
    for (uint8_t i = 1; i <= kMaxAppNum; i++) {
      if (!scanners_[i].in_use) {
        scanners_[i].app_uuid = app_uuid;
        scanners_[i].in_use = true;
        scanning_callbacks_->OnScannerRegistered(app_uuid, i, ScanningCallback::ScanningStatus::SUCCESS);
        return;
      }
    }

    LOG_ERROR("Unable to register scanner, max client reached:%d", kMaxAppNum);
    scanning_callbacks_->OnScannerRegistered(app_uuid, 0x00, ScanningCallback::ScanningStatus::NO_RESOURCES);
  }

  void unregister_scanner(ScannerId scanner_id) {
    if (scanner_id <= 0 || scanner_id > kMaxAppNum) {
      LOG_WARN("Invalid scanner id");
      return;
    }

    if (scanners_[scanner_id].in_use) {
      scanners_[scanner_id].in_use = false;
      scanners_[scanner_id].app_uuid = Uuid::kEmpty;
    } else {
      LOG_WARN("Unregister scanner with unused scanner id");
    }
  }

  void start_scan(LeScanningManagerCallbacks* le_scanning_manager_callbacks) {
    registered_callback_ = le_scanning_manager_callbacks;

@@ -241,6 +288,7 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback
  hci::LeAddressManager* le_address_manager_;
  bool address_manager_registered = false;
  ScanningCallback* scanning_callbacks_ = nullptr;
  std::vector<Scanner> scanners_;

  uint32_t interval_ms_{1000};
  uint16_t window_ms_{1000};
@@ -303,6 +351,14 @@ std::string LeScanningManager::ToString() const {
  return "Le Scanning Manager";
}

void LeScanningManager::RegisterScanner(Uuid app_uuid) {
  CallOn(pimpl_.get(), &impl::register_scanner, app_uuid);
}

void LeScanningManager::Unregister(ScannerId scanner_id) {
  CallOn(pimpl_.get(), &impl::unregister_scanner, scanner_id);
}

void LeScanningManager::StartScan(LeScanningManagerCallbacks* callbacks) {
  GetHandler()->Post(common::Bind(&impl::start_scan, common::Unretained(pimpl_.get()), callbacks));
}
+15 −1
Original line number Diff line number Diff line
@@ -34,10 +34,19 @@ class LeScanningManagerCallbacks {
  virtual os::Handler* Handler() = 0;
};

using ScannerId = uint8_t;

class ScanningCallback {
 public:
  enum ScanningStatus {
    SUCCESS,
    NO_RESOURCES = 0x80,
    INTERNAL_ERROR = 0x85,
  };

  virtual ~ScanningCallback() = default;
  virtual void OnScannerRegistered(const bluetooth::hci::Uuid app_uuid, uint8_t scanner_id, uint8_t status) = 0;
  virtual void OnScannerRegistered(
      const bluetooth::hci::Uuid app_uuid, ScannerId scanner_id, ScanningStatus status) = 0;
  virtual void OnScanResult(
      uint16_t event_type,
      uint8_t addr_type,
@@ -56,8 +65,13 @@ class ScanningCallback {

class LeScanningManager : public bluetooth::Module {
 public:
  static constexpr uint8_t kMaxAppNum = 32;
  LeScanningManager();

  void RegisterScanner(const Uuid app_uuid);

  void Unregister(ScannerId scanner_id);

  void StartScan(LeScanningManagerCallbacks* callbacks);

  void StopScan(common::Callback<void()> on_stopped);
+15 −2
Original line number Diff line number Diff line
@@ -41,10 +41,15 @@ class BleScannerInterfaceImpl : public BleScannerInterface,
  /** Registers a scanner with the stack */
  void RegisterScanner(const bluetooth::Uuid& uuid, RegisterCallback) {
    LOG(INFO) << __func__ << " in shim layer";
    auto app_uuid = bluetooth::hci::Uuid::From128BitBE(uuid.To128BitBE());
    bluetooth::shim::GetScanning()->RegisterScanner(app_uuid);
  }

  /** Unregister a scanner from the stack */
  void Unregister(int scanner_id) { LOG(INFO) << __func__ << " in shim layer"; }
  void Unregister(int scanner_id) {
    LOG(INFO) << __func__ << " in shim layer, scanner_id:" << scanner_id;
    bluetooth::shim::GetScanning()->Unregister(scanner_id);
  }

  /** Start or stop LE device scanning */
  void Scan(bool start) { LOG(INFO) << __func__ << " in shim layer"; }
@@ -120,7 +125,15 @@ class BleScannerInterfaceImpl : public BleScannerInterface,
  }

  void OnScannerRegistered(const bluetooth::hci::Uuid app_uuid,
                           uint8_t scanner_id, uint8_t status){};
                           bluetooth::hci::ScannerId scanner_id,
                           ScanningStatus status) {
    auto uuid = bluetooth::Uuid::From128BitBE(app_uuid.To128BitBE());
    do_in_jni_thread(FROM_HERE,
                     base::Bind(&ScanningCallbacks::OnScannerRegistered,
                                base::Unretained(scanning_callbacks_), uuid,
                                scanner_id, status));
  };

  void OnScanResult(uint16_t event_type, uint8_t addr_type,
                    bluetooth::hci::Address* bda, uint8_t primary_phy,
                    uint8_t secondary_phy, uint8_t advertising_sid,