: public BleAdvertisingManager,
public BleAdvertiserHciInterface::AdvertisingEventObserver {
public:
- BleAdvertisingManagerImpl() {
- adv_inst.reserve(BTM_BleMaxMultiAdvInstanceCount());
+ BleAdvertisingManagerImpl(BleAdvertiserHciInterface *interface) {
+ this->hci_interface = interface;
+ hci_interface->ReadInstanceCount(base::Bind(
+ &BleAdvertisingManagerImpl::ReadInstanceCountCb, base::Unretained(this)));
+ }
+
+ ~BleAdvertisingManagerImpl() { adv_inst.clear(); }
+
+ void ReadInstanceCountCb(uint8_t instance_count) {
+ this->inst_count = instance_count;
+ adv_inst.reserve(inst_count);
/* Initialize adv instance indices and IDs. */
- for (uint8_t i = 0; i < BTM_BleMaxMultiAdvInstanceCount(); i++) {
+ for (uint8_t i = 0; i < inst_count; i++) {
adv_inst.emplace_back(i + 1);
}
}
- ~BleAdvertisingManagerImpl() { adv_inst.clear(); }
-
void OnRpaGenerationComplete(uint8_t inst_id, tBTM_RAND_ENC *p) {
#if (SMP_INCLUDED == TRUE)
AdvertisingInstance *p_inst = &adv_inst[inst_id - 1];
p_inst->rpa[3] = output.param_buf[2];
if (p_inst->inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD &&
- p_inst->inst_id < BTM_BleMaxMultiAdvInstanceCount()) {
+ p_inst->inst_id < inst_count) {
/* set it to controller */
GetHciInterface()->SetRandomAddress(p_inst->rpa, p_inst->inst_id,
Bind(DoNothing));
void RegisterAdvertiser(
base::Callback<void(uint8_t /* inst_id */, uint8_t /* status */)> cb)
override {
- if (BTM_BleMaxMultiAdvInstanceCount() == 0) {
+ if (inst_count == 0) {
LOG(ERROR) << "multi adv not supported";
cb.Run(0xFF, BTM_BLE_MULTI_ADV_FAILURE);
return;
}
AdvertisingInstance *p_inst = &adv_inst[0];
- for (uint8_t i = 0; i < BTM_BleMaxMultiAdvInstanceCount() - 1;
+ for (uint8_t i = 0; i < inst_count - 1;
i++, p_inst++) {
if (!p_inst->in_use) {
p_inst->in_use = TRUE;
AdvertisingInstance *p_inst = &adv_inst[inst_id - 1];
VLOG(1) << __func__ << " inst_id: " << +inst_id << ", enable: " << enable;
- if (BTM_BleMaxMultiAdvInstanceCount() == 0) {
+ if (inst_count == 0) {
LOG(ERROR) << "multi adv not supported";
return;
}
VLOG(1) << __func__ << " inst_id:" << +inst_id;
- if (BTM_BleMaxMultiAdvInstanceCount() == 0) {
+ if (inst_count == 0) {
LOG(ERROR) << "multi adv not supported";
return;
}
- if (inst_id > BTM_BleMaxMultiAdvInstanceCount() || inst_id < 0 ||
+ if (inst_id > inst_count || inst_id < 0 ||
inst_id == BTM_BLE_MULTI_ADV_DEFAULT_STD) {
LOG(ERROR) << "bad instance id " << +inst_id;
return;
VLOG(1) << "inst_id = " << +inst_id << ", is_scan_rsp = " << is_scan_rsp;
- if (BTM_BleMaxMultiAdvInstanceCount() == 0) {
+ if (inst_count == 0) {
LOG(ERROR) << "multi adv not supported";
return;
}
}
}
- if (inst_id > BTM_BleMaxMultiAdvInstanceCount() || inst_id < 0 ||
+ if (inst_id > inst_count || inst_id < 0 ||
inst_id == BTM_BLE_MULTI_ADV_DEFAULT_STD) {
LOG(ERROR) << "bad instance id " << +inst_id;
return;
VLOG(1) << __func__ << " inst_id: " << +inst_id;
- if (BTM_BleMaxMultiAdvInstanceCount() == 0) {
+ if (inst_count == 0) {
LOG(ERROR) << "multi adv not supported";
return;
}
- if (inst_id > BTM_BleMaxMultiAdvInstanceCount() || inst_id < 0 ||
+ if (inst_id > inst_count || inst_id < 0 ||
inst_id == BTM_BLE_MULTI_ADV_DEFAULT_STD) {
LOG(ERROR) << "bad instance id " << +inst_id;
return;
}
#endif
- if (inst_id < BTM_BleMaxMultiAdvInstanceCount() &&
+ if (inst_id < inst_count &&
inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD) {
VLOG(1) << "reneabling advertising";
}
}
- void SetHciInterface(BleAdvertiserHciInterface *interface) {
- hci_interface = interface;
- };
-
private:
BleAdvertiserHciInterface *GetHciInterface() { return hci_interface; }
BleAdvertiserHciInterface *hci_interface = nullptr;
std::vector<AdvertisingInstance> adv_inst;
+ uint8_t inst_count;
};
namespace {
BleAdvertisingManager *instance;
}
-void BleAdvertisingManager::Initialize() {
- instance = new BleAdvertisingManagerImpl();
+void BleAdvertisingManager::Initialize(BleAdvertiserHciInterface *interface) {
+ instance = new BleAdvertisingManagerImpl(interface);
}
BleAdvertisingManager *BleAdvertisingManager::Get() {
**
*******************************************************************************/
void btm_ble_multi_adv_init() {
- BleAdvertisingManager::Initialize();
BleAdvertiserHciInterface::Initialize();
- BleAdvertisingManager::Get()->SetHciInterface(
+ BleAdvertisingManager::Initialize(
BleAdvertiserHciInterface::Get());
}
using ::testing::_;
using ::testing::Args;
using ::testing::ElementsAreArray;
+using ::testing::Exactly;
using ::testing::IsEmpty;
using ::testing::SaveArg;
using status_cb = BleAdvertiserHciInterface::status_cb;
/* Below are methods that must be implemented if we don't want to compile the
* whole stack. They will be removed, or changed into mocks one by one in the
* future, as the refactoring progresses */
-uint8_t BTM_BleMaxMultiAdvInstanceCount() { return num_adv_instances; }
bool BTM_BleLocalPrivacyEnabled() { return true; }
uint16_t BTM_ReadConnectability(uint16_t *p_window, uint16_t *p_interval) {
return true;
AdvertiserHciMock() = default;
~AdvertiserHciMock() override = default;
+ MOCK_METHOD1(ReadInstanceCount, void(base::Callback<void(uint8_t /* inst_cnt*/)>));
MOCK_METHOD4(SetAdvertisingData,
void(uint8_t, uint8_t *, uint8_t, status_cb));
MOCK_METHOD4(SetScanResponseData,
std::unique_ptr<AdvertiserHciMock> hci_mock;
virtual void SetUp() {
- BleAdvertisingManager::Initialize();
hci_mock.reset(new AdvertiserHciMock());
- BleAdvertisingManager::Get()->SetHciInterface(hci_mock.get());
+
+ base::Callback<void(uint8_t)> inst_cnt_Cb;
+ EXPECT_CALL(*hci_mock, ReadInstanceCount(_))
+ .Times(Exactly(1))
+ .WillOnce(SaveArg<0>(&inst_cnt_Cb));
+
+ BleAdvertisingManager::Initialize(hci_mock.get());
+
+ // we are a truly gracious fake controller, let the command succeed!
+ inst_cnt_Cb.Run(num_adv_instances);
+ ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
}
virtual void TearDown() {
base::Bind(&BleAdvertisingManagerTest::SetParametersCb,
base::Unretained(this)));
- // we are a trully gracious fake controller, let the command succeed!
+ // we are a truly gracious fake controller, let the command succeed!
set_params_cb.Run(0);
EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_params_status);
::testing::Mock::VerifyAndClearExpectations(hci_mock.get());