Loading system/gd/hci/le_scanning_manager.cc +48 −5 Original line number Diff line number Diff line Loading @@ -30,8 +30,14 @@ namespace bluetooth { namespace hci { constexpr uint16_t kDefaultLeScanWindow = 4800; constexpr uint16_t kDefaultLeScanInterval = 4800; constexpr uint16_t kLeScanWindowMin = 0x0004; constexpr uint16_t kLeScanWindowMax = 0x4000; constexpr uint16_t kDefaultLeExtendedScanWindow = 4800; constexpr uint16_t kLeExtendedScanWindowMax = 0xFFFF; constexpr uint16_t kLeScanIntervalMin = 0x0004; constexpr uint16_t kLeScanIntervalMax = 0x4000; constexpr uint16_t kDefaultLeExtendedScanInterval = 4800; constexpr uint16_t kLeExtendedScanIntervalMax = 0xFFFF; constexpr uint8_t kScannableBit = 1; constexpr uint8_t kDirectedBit = 2; Loading Loading @@ -145,6 +151,8 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback module_handler_->BindOn(this, &LeScanningManager::impl::handle_scan_results)); if (controller_->IsSupported(OpCode::LE_SET_EXTENDED_SCAN_PARAMETERS)) { api_type_ = ScanApiType::EXTENDED; interval_ms_ = kDefaultLeExtendedScanInterval; window_ms_ = kDefaultLeExtendedScanWindow; } else if (controller_->IsSupported(OpCode::LE_EXTENDED_SCAN_PARAMS)) { api_type_ = ScanApiType::ANDROID_HCI; } else { Loading Loading @@ -366,12 +374,16 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback void configure_scan() { std::vector<PhyScanParameters> parameter_vector; PhyScanParameters phy_scan_parameters; phy_scan_parameters.le_scan_window_ = kDefaultLeScanWindow; phy_scan_parameters.le_scan_interval_ = kDefaultLeScanInterval; phy_scan_parameters.le_scan_type_ = LeScanType::ACTIVE; phy_scan_parameters.le_scan_window_ = window_ms_; phy_scan_parameters.le_scan_interval_ = interval_ms_; phy_scan_parameters.le_scan_type_ = le_scan_type_; parameter_vector.push_back(phy_scan_parameters); uint8_t phys_in_use = 1; if (le_address_manager_->GetAddressPolicy() != LeAddressManager::USE_PUBLIC_ADDRESS) { own_address_type_ = OwnAddressType::RANDOM_DEVICE_ADDRESS; } switch (api_type_) { case ScanApiType::EXTENDED: le_scanning_interface_->EnqueueCommand(hci::LeSetExtendedScanParametersBuilder::Create( Loading Loading @@ -433,6 +445,7 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback void scan(bool start) { if (start) { configure_scan(); start_scan(); } else { if (address_manager_registered_) { Loading Loading @@ -490,6 +503,31 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback } } void set_scan_parameters(LeScanType scan_type, uint16_t scan_interval, uint16_t scan_window) { uint32_t max_scan_interval = kLeScanIntervalMax; uint32_t max_scan_window = kLeScanWindowMax; if (api_type_ == ScanApiType::EXTENDED) { max_scan_interval = kLeExtendedScanIntervalMax; max_scan_window = kLeExtendedScanWindowMax; } if (scan_type != LeScanType::ACTIVE && scan_type != LeScanType::PASSIVE) { LOG_ERROR("Invalid scan type"); return; } if (scan_interval > max_scan_interval || scan_interval < kLeScanIntervalMin) { LOG_ERROR("Invalid scan_interval %d", scan_interval); return; } if (scan_window > max_scan_window || scan_window < kLeScanWindowMin) { LOG_ERROR("Invalid scan_window %d", scan_window); return; } le_scan_type_ = scan_type; interval_ms_ = scan_interval; window_ms_ = scan_window; } void register_scanning_callback(ScanningCallback* scanning_callbacks) { scanning_callbacks_ = scanning_callbacks; } Loading Loading @@ -529,6 +567,7 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback bool paused_ = false; AdvertisingCache advertising_cache_; LeScanType le_scan_type_ = LeScanType::ACTIVE; uint32_t interval_ms_{1000}; uint16_t window_ms_{1000}; OwnAddressType own_address_type_{OwnAddressType::PUBLIC_DEVICE_ADDRESS}; Loading Loading @@ -602,6 +641,10 @@ void LeScanningManager::Scan(bool start) { CallOn(pimpl_.get(), &impl::scan, start); } void LeScanningManager::SetScanParameters(LeScanType scan_type, uint16_t scan_interval, uint16_t scan_window) { CallOn(pimpl_.get(), &impl::set_scan_parameters, scan_type, scan_interval, scan_window); } void LeScanningManager::RegisterScanningCallback(ScanningCallback* scanning_callback) { CallOn(pimpl_.get(), &impl::register_scanning_callback, scanning_callback); } Loading system/gd/hci/le_scanning_manager.h +2 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,8 @@ class LeScanningManager : public bluetooth::Module { void Scan(bool start); void SetScanParameters(LeScanType scan_type, uint16_t scan_interval, uint16_t scan_window); void RegisterScanningCallback(ScanningCallback* scanning_callback); static const ModuleFactory Factory; Loading system/gd/hci/le_scanning_manager_test.cc +6 −1 Original line number Diff line number Diff line Loading @@ -385,7 +385,12 @@ TEST_F(LeExtendedScanningManagerTest, start_scan_test) { auto result = next_command_future.wait_for(std::chrono::duration(std::chrono::milliseconds(100))); ASSERT_EQ(std::future_status::ready, result); auto packet = test_hci_layer_->GetCommand(OpCode::LE_SET_EXTENDED_SCAN_ENABLE); test_hci_layer_->GetCommand(OpCode::LE_SET_EXTENDED_SCAN_PARAMETERS); test_hci_layer_->IncomingEvent(LeSetExtendedScanParametersCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); result = next_command_future.wait_for(std::chrono::duration(std::chrono::milliseconds(100))); ASSERT_EQ(std::future_status::ready, result); test_hci_layer_->GetCommand(OpCode::LE_SET_EXTENDED_SCAN_ENABLE); test_hci_layer_->IncomingEvent(LeSetScanEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); Loading system/main/shim/le_scanning_manager.cc +4 −0 Original line number Diff line number Diff line Loading @@ -84,6 +84,10 @@ class BleScannerInterfaceImpl : public BleScannerInterface, /** Sets the LE scan interval and window in units of N*0.625 msec */ void SetScanParameters(int scan_interval, int scan_window, Callback cb) { LOG(INFO) << __func__ << " in shim layer"; // use active scan auto scan_type = static_cast<bluetooth::hci::LeScanType>(0x01); bluetooth::shim::GetScanning()->SetScanParameters(scan_type, scan_interval, scan_window); } /* Configure the batchscan storage */ Loading Loading
system/gd/hci/le_scanning_manager.cc +48 −5 Original line number Diff line number Diff line Loading @@ -30,8 +30,14 @@ namespace bluetooth { namespace hci { constexpr uint16_t kDefaultLeScanWindow = 4800; constexpr uint16_t kDefaultLeScanInterval = 4800; constexpr uint16_t kLeScanWindowMin = 0x0004; constexpr uint16_t kLeScanWindowMax = 0x4000; constexpr uint16_t kDefaultLeExtendedScanWindow = 4800; constexpr uint16_t kLeExtendedScanWindowMax = 0xFFFF; constexpr uint16_t kLeScanIntervalMin = 0x0004; constexpr uint16_t kLeScanIntervalMax = 0x4000; constexpr uint16_t kDefaultLeExtendedScanInterval = 4800; constexpr uint16_t kLeExtendedScanIntervalMax = 0xFFFF; constexpr uint8_t kScannableBit = 1; constexpr uint8_t kDirectedBit = 2; Loading Loading @@ -145,6 +151,8 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback module_handler_->BindOn(this, &LeScanningManager::impl::handle_scan_results)); if (controller_->IsSupported(OpCode::LE_SET_EXTENDED_SCAN_PARAMETERS)) { api_type_ = ScanApiType::EXTENDED; interval_ms_ = kDefaultLeExtendedScanInterval; window_ms_ = kDefaultLeExtendedScanWindow; } else if (controller_->IsSupported(OpCode::LE_EXTENDED_SCAN_PARAMS)) { api_type_ = ScanApiType::ANDROID_HCI; } else { Loading Loading @@ -366,12 +374,16 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback void configure_scan() { std::vector<PhyScanParameters> parameter_vector; PhyScanParameters phy_scan_parameters; phy_scan_parameters.le_scan_window_ = kDefaultLeScanWindow; phy_scan_parameters.le_scan_interval_ = kDefaultLeScanInterval; phy_scan_parameters.le_scan_type_ = LeScanType::ACTIVE; phy_scan_parameters.le_scan_window_ = window_ms_; phy_scan_parameters.le_scan_interval_ = interval_ms_; phy_scan_parameters.le_scan_type_ = le_scan_type_; parameter_vector.push_back(phy_scan_parameters); uint8_t phys_in_use = 1; if (le_address_manager_->GetAddressPolicy() != LeAddressManager::USE_PUBLIC_ADDRESS) { own_address_type_ = OwnAddressType::RANDOM_DEVICE_ADDRESS; } switch (api_type_) { case ScanApiType::EXTENDED: le_scanning_interface_->EnqueueCommand(hci::LeSetExtendedScanParametersBuilder::Create( Loading Loading @@ -433,6 +445,7 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback void scan(bool start) { if (start) { configure_scan(); start_scan(); } else { if (address_manager_registered_) { Loading Loading @@ -490,6 +503,31 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback } } void set_scan_parameters(LeScanType scan_type, uint16_t scan_interval, uint16_t scan_window) { uint32_t max_scan_interval = kLeScanIntervalMax; uint32_t max_scan_window = kLeScanWindowMax; if (api_type_ == ScanApiType::EXTENDED) { max_scan_interval = kLeExtendedScanIntervalMax; max_scan_window = kLeExtendedScanWindowMax; } if (scan_type != LeScanType::ACTIVE && scan_type != LeScanType::PASSIVE) { LOG_ERROR("Invalid scan type"); return; } if (scan_interval > max_scan_interval || scan_interval < kLeScanIntervalMin) { LOG_ERROR("Invalid scan_interval %d", scan_interval); return; } if (scan_window > max_scan_window || scan_window < kLeScanWindowMin) { LOG_ERROR("Invalid scan_window %d", scan_window); return; } le_scan_type_ = scan_type; interval_ms_ = scan_interval; window_ms_ = scan_window; } void register_scanning_callback(ScanningCallback* scanning_callbacks) { scanning_callbacks_ = scanning_callbacks; } Loading Loading @@ -529,6 +567,7 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback bool paused_ = false; AdvertisingCache advertising_cache_; LeScanType le_scan_type_ = LeScanType::ACTIVE; uint32_t interval_ms_{1000}; uint16_t window_ms_{1000}; OwnAddressType own_address_type_{OwnAddressType::PUBLIC_DEVICE_ADDRESS}; Loading Loading @@ -602,6 +641,10 @@ void LeScanningManager::Scan(bool start) { CallOn(pimpl_.get(), &impl::scan, start); } void LeScanningManager::SetScanParameters(LeScanType scan_type, uint16_t scan_interval, uint16_t scan_window) { CallOn(pimpl_.get(), &impl::set_scan_parameters, scan_type, scan_interval, scan_window); } void LeScanningManager::RegisterScanningCallback(ScanningCallback* scanning_callback) { CallOn(pimpl_.get(), &impl::register_scanning_callback, scanning_callback); } Loading
system/gd/hci/le_scanning_manager.h +2 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,8 @@ class LeScanningManager : public bluetooth::Module { void Scan(bool start); void SetScanParameters(LeScanType scan_type, uint16_t scan_interval, uint16_t scan_window); void RegisterScanningCallback(ScanningCallback* scanning_callback); static const ModuleFactory Factory; Loading
system/gd/hci/le_scanning_manager_test.cc +6 −1 Original line number Diff line number Diff line Loading @@ -385,7 +385,12 @@ TEST_F(LeExtendedScanningManagerTest, start_scan_test) { auto result = next_command_future.wait_for(std::chrono::duration(std::chrono::milliseconds(100))); ASSERT_EQ(std::future_status::ready, result); auto packet = test_hci_layer_->GetCommand(OpCode::LE_SET_EXTENDED_SCAN_ENABLE); test_hci_layer_->GetCommand(OpCode::LE_SET_EXTENDED_SCAN_PARAMETERS); test_hci_layer_->IncomingEvent(LeSetExtendedScanParametersCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); result = next_command_future.wait_for(std::chrono::duration(std::chrono::milliseconds(100))); ASSERT_EQ(std::future_status::ready, result); test_hci_layer_->GetCommand(OpCode::LE_SET_EXTENDED_SCAN_ENABLE); test_hci_layer_->IncomingEvent(LeSetScanEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); Loading
system/main/shim/le_scanning_manager.cc +4 −0 Original line number Diff line number Diff line Loading @@ -84,6 +84,10 @@ class BleScannerInterfaceImpl : public BleScannerInterface, /** Sets the LE scan interval and window in units of N*0.625 msec */ void SetScanParameters(int scan_interval, int scan_window, Callback cb) { LOG(INFO) << __func__ << " in shim layer"; // use active scan auto scan_type = static_cast<bluetooth::hci::LeScanType>(0x01); bluetooth::shim::GetScanning()->SetScanParameters(scan_type, scan_interval, scan_window); } /* Configure the batchscan storage */ Loading