Loading system/gd/hci/le_scanning_manager.cc +56 −0 Original line number Diff line number Diff line Loading @@ -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) {} Loading @@ -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(); } Loading Loading @@ -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; Loading Loading @@ -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}; Loading Loading @@ -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)); } Loading system/gd/hci/le_scanning_manager.h +15 −1 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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); Loading system/main/shim/le_scanning_manager.cc +15 −2 Original line number Diff line number Diff line Loading @@ -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"; } Loading Loading @@ -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, Loading Loading
system/gd/hci/le_scanning_manager.cc +56 −0 Original line number Diff line number Diff line Loading @@ -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) {} Loading @@ -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(); } Loading Loading @@ -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; Loading Loading @@ -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}; Loading Loading @@ -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)); } Loading
system/gd/hci/le_scanning_manager.h +15 −1 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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); Loading
system/main/shim/le_scanning_manager.cc +15 −2 Original line number Diff line number Diff line Loading @@ -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"; } Loading Loading @@ -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, Loading