Loading system/btif/src/btif_ble_advertiser.cc +1 −1 Original line number Diff line number Diff line Loading @@ -84,7 +84,7 @@ class BleAdvertiserInterfaceImpl : public BleAdvertiserInterface { base::Unretained(BleAdvertisingManager::Get()), advertiser_id)); } void SetParametersCb(StatusCallback cb, uint8_t status) { void SetParametersCb(StatusCallback cb, uint8_t status, int8_t tx_power) { LOG(INFO) << __func__ << " status: " << +status; do_in_jni_thread(Bind(cb, status)); } Loading system/stack/btm/ble_advertiser_hci_interface.cc +33 −11 Original line number Diff line number Diff line Loading @@ -72,6 +72,23 @@ void btm_ble_multi_adv_vsc_cmpl_cback(uint8_t expected_opcode, command_complete.Run(status); } void parameters_response_parser(BleAdvertiserHciInterface::parameters_cb cb, uint8_t* ret_params, uint16_t ret_params_len) { uint8_t status; int8_t tx_power; uint8_t* pp = ret_params; STREAM_TO_UINT8(status, pp); STREAM_TO_INT8(tx_power, pp); cb.Run(status, tx_power); } void known_tx_pwr(BleAdvertiserHciInterface::parameters_cb cb, int8_t tx_power, uint8_t status) { cb.Run(status, tx_power); } class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface { void SendAdvCmd(const tracked_objects::Location& posted_from, uint8_t param_len, uint8_t* param_buf, Loading Loading @@ -100,7 +117,7 @@ class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface { uint8_t primary_phy, uint8_t secondary_max_skip, uint8_t secondary_phy, uint8_t advertising_sid, uint8_t scan_request_notify_enable, status_cb command_complete) override { parameters_cb command_complete) override { VLOG(1) << __func__; uint8_t param[BTM_BLE_MULTI_ADV_SET_PARAM_LEN]; memset(param, 0, BTM_BLE_MULTI_ADV_SET_PARAM_LEN); Loading @@ -119,7 +136,7 @@ class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface { } else { LOG(ERROR) << "Unsupported advertisement type selected:" << std::hex << properties; command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT); command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT, 0); return; } Loading @@ -132,8 +149,9 @@ class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface { UINT8_TO_STREAM(pp, handle); INT8_TO_STREAM(pp, tx_power); SendAdvCmd(FROM_HERE, BTM_BLE_MULTI_ADV_SET_PARAM_LEN, param, command_complete); SendAdvCmd( FROM_HERE, BTM_BLE_MULTI_ADV_SET_PARAM_LEN, param, base::Bind(&known_tx_pwr, std::move(command_complete), tx_power)); } void SetAdvertisingData(uint8_t handle, uint8_t operation, Loading Loading @@ -297,7 +315,7 @@ class BleAdvertiserLegacyHciInterfaceImpl : public BleAdvertiserHciInterface { uint8_t primary_phy, uint8_t secondary_max_skip, uint8_t secondary_phy, uint8_t advertising_sid, uint8_t scan_request_notify_enable, status_cb command_complete) override { parameters_cb command_complete) override { VLOG(1) << __func__; uint8_t param[HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS]; Loading @@ -315,7 +333,7 @@ class BleAdvertiserLegacyHciInterfaceImpl : public BleAdvertiserHciInterface { } else { LOG(ERROR) << "Unsupported advertisement type selected:" << std::hex << properties; command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT); command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT, 0); return; } Loading @@ -325,8 +343,10 @@ class BleAdvertiserLegacyHciInterfaceImpl : public BleAdvertiserHciInterface { UINT8_TO_STREAM(pp, channel_map); UINT8_TO_STREAM(pp, filter_policy); SendAdvCmd(FROM_HERE, HCI_BLE_WRITE_ADV_PARAMS, param, HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS, command_complete); SendAdvCmd( FROM_HERE, HCI_BLE_WRITE_ADV_PARAMS, param, HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS, base::Bind(&known_tx_pwr, std::move(command_complete), (int8_t)0)); } void SetAdvertisingData(uint8_t handle, uint8_t operation, Loading Loading @@ -441,7 +461,7 @@ class BleAdvertiserHciExtendedImpl : public BleAdvertiserHciInterface { uint8_t primary_phy, uint8_t secondary_max_skip, uint8_t secondary_phy, uint8_t advertising_sid, uint8_t scan_request_notify_enable, status_cb command_complete) override { parameters_cb command_complete) override { VLOG(1) << __func__; const uint16_t HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN = 25; uint8_t param[HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN]; Loading @@ -464,8 +484,10 @@ class BleAdvertiserHciExtendedImpl : public BleAdvertiserHciInterface { UINT8_TO_STREAM(pp, advertising_sid); UINT8_TO_STREAM(pp, scan_request_notify_enable); SendAdvCmd(FROM_HERE, HCI_LE_SET_EXT_ADVERTISING_PARAM, param, HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN, command_complete); btu_hcif_send_cmd_with_cb( FROM_HERE, HCI_LE_SET_EXT_ADVERTISING_PARAM, param, HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN, base::Bind(parameters_response_parser, std::move(command_complete))); } void SetAdvertisingData(uint8_t handle, uint8_t operation, Loading system/stack/btm/ble_advertiser_hci_interface.h +3 −1 Original line number Diff line number Diff line Loading @@ -29,6 +29,8 @@ class BleAdvertiserHciInterface { public: using status_cb = base::Callback<void(uint8_t /* status */)>; using parameters_cb = base::Callback<void(uint8_t /* status */, int8_t /* tx_power */)>; static void Initialize(); static BleAdvertiserHciInterface* Get(); Loading Loading @@ -57,7 +59,7 @@ class BleAdvertiserHciInterface { uint8_t secondary_max_skip, uint8_t secondary_phy, uint8_t advertising_sid, uint8_t scan_request_notify_enable, status_cb command_complete) = 0; parameters_cb command_complete) = 0; virtual void SetAdvertisingData(uint8_t handle, uint8_t operation, uint8_t fragment_preference, uint8_t data_length, uint8_t* data, Loading system/stack/btm/btm_ble_multi_adv.cc +7 −6 Original line number Diff line number Diff line Loading @@ -271,13 +271,15 @@ class BleAdvertisingManagerImpl // asynchronous flow // clang-format off c->self->SetParameters(c->inst_id, &c->params, Bind( [](c_type c, uint8_t status) { [](c_type c, uint8_t status, int8_t tx_power) { if (status != 0) { LOG(ERROR) << "setting parameters failed, status: " << +status; c->cb.Run(status); return; } c->self->adv_inst[c->inst_id].tx_power = tx_power; BD_ADDR *rpa = &c->self->adv_inst[c->inst_id].own_address; c->self->GetHciInterface()->SetRandomAddress(c->inst_id, *rpa, Bind( [](c_type c, uint8_t status) { Loading Loading @@ -346,7 +348,7 @@ class BleAdvertisingManagerImpl c->inst_id = advertiser_id; c->self->SetParameters(c->inst_id, &c->params, Bind( [](c_type c, uint8_t status) { [](c_type c, uint8_t status, int8_t tx_power) { if (status != 0) { c->self->Unregister(c->inst_id); LOG(ERROR) << "setting parameters failed, status: " << +status; Loading @@ -354,8 +356,7 @@ class BleAdvertisingManagerImpl return; } //TODO(jpawlowski): obtain real tx_power from set parameters // response, to put into adv data c->self->adv_inst[c->inst_id].tx_power = tx_power; BD_ADDR *rpa = &c->self->adv_inst[c->inst_id].own_address; c->self->GetHciInterface()->SetRandomAddress(c->inst_id, *rpa, Bind( Loading Loading @@ -513,7 +514,7 @@ class BleAdvertisingManagerImpl } void SetParameters(uint8_t inst_id, tBTM_BLE_ADV_PARAMS* p_params, MultiAdvCb cb) override { ParametersCb cb) override { VLOG(1) << __func__ << " inst_id: " << +inst_id; if (inst_id >= inst_count) { LOG(ERROR) << "bad instance id " << +inst_id; Loading @@ -523,7 +524,7 @@ class BleAdvertisingManagerImpl AdvertisingInstance* p_inst = &adv_inst[inst_id]; if (!p_inst->in_use) { LOG(ERROR) << "adv instance not in use" << +inst_id; cb.Run(BTM_BLE_MULTI_ADV_FAILURE); cb.Run(BTM_BLE_MULTI_ADV_FAILURE, 0); return; } Loading system/stack/include/ble_advertiser.h +3 −1 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ #define ADVERTISE_FAILED_TOO_MANY_ADVERTISERS 0x02 using MultiAdvCb = base::Callback<void(uint8_t /* status */)>; using ParametersCb = base::Callback<void(uint8_t /* status */, int8_t /* tx_power */)>; // methods we must have defined void btm_ble_update_dmt_flag_bits(uint8_t* flag_value, Loading Loading @@ -116,7 +118,7 @@ class BleAdvertisingManager { /* This function update a Multi-ADV instance with the specififed adv * parameters. */ virtual void SetParameters(uint8_t inst_id, tBTM_BLE_ADV_PARAMS* p_params, MultiAdvCb cb) = 0; ParametersCb cb) = 0; /* This function configure a Multi-ADV instance with the specified adv data or * scan response data.*/ Loading Loading
system/btif/src/btif_ble_advertiser.cc +1 −1 Original line number Diff line number Diff line Loading @@ -84,7 +84,7 @@ class BleAdvertiserInterfaceImpl : public BleAdvertiserInterface { base::Unretained(BleAdvertisingManager::Get()), advertiser_id)); } void SetParametersCb(StatusCallback cb, uint8_t status) { void SetParametersCb(StatusCallback cb, uint8_t status, int8_t tx_power) { LOG(INFO) << __func__ << " status: " << +status; do_in_jni_thread(Bind(cb, status)); } Loading
system/stack/btm/ble_advertiser_hci_interface.cc +33 −11 Original line number Diff line number Diff line Loading @@ -72,6 +72,23 @@ void btm_ble_multi_adv_vsc_cmpl_cback(uint8_t expected_opcode, command_complete.Run(status); } void parameters_response_parser(BleAdvertiserHciInterface::parameters_cb cb, uint8_t* ret_params, uint16_t ret_params_len) { uint8_t status; int8_t tx_power; uint8_t* pp = ret_params; STREAM_TO_UINT8(status, pp); STREAM_TO_INT8(tx_power, pp); cb.Run(status, tx_power); } void known_tx_pwr(BleAdvertiserHciInterface::parameters_cb cb, int8_t tx_power, uint8_t status) { cb.Run(status, tx_power); } class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface { void SendAdvCmd(const tracked_objects::Location& posted_from, uint8_t param_len, uint8_t* param_buf, Loading Loading @@ -100,7 +117,7 @@ class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface { uint8_t primary_phy, uint8_t secondary_max_skip, uint8_t secondary_phy, uint8_t advertising_sid, uint8_t scan_request_notify_enable, status_cb command_complete) override { parameters_cb command_complete) override { VLOG(1) << __func__; uint8_t param[BTM_BLE_MULTI_ADV_SET_PARAM_LEN]; memset(param, 0, BTM_BLE_MULTI_ADV_SET_PARAM_LEN); Loading @@ -119,7 +136,7 @@ class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface { } else { LOG(ERROR) << "Unsupported advertisement type selected:" << std::hex << properties; command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT); command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT, 0); return; } Loading @@ -132,8 +149,9 @@ class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface { UINT8_TO_STREAM(pp, handle); INT8_TO_STREAM(pp, tx_power); SendAdvCmd(FROM_HERE, BTM_BLE_MULTI_ADV_SET_PARAM_LEN, param, command_complete); SendAdvCmd( FROM_HERE, BTM_BLE_MULTI_ADV_SET_PARAM_LEN, param, base::Bind(&known_tx_pwr, std::move(command_complete), tx_power)); } void SetAdvertisingData(uint8_t handle, uint8_t operation, Loading Loading @@ -297,7 +315,7 @@ class BleAdvertiserLegacyHciInterfaceImpl : public BleAdvertiserHciInterface { uint8_t primary_phy, uint8_t secondary_max_skip, uint8_t secondary_phy, uint8_t advertising_sid, uint8_t scan_request_notify_enable, status_cb command_complete) override { parameters_cb command_complete) override { VLOG(1) << __func__; uint8_t param[HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS]; Loading @@ -315,7 +333,7 @@ class BleAdvertiserLegacyHciInterfaceImpl : public BleAdvertiserHciInterface { } else { LOG(ERROR) << "Unsupported advertisement type selected:" << std::hex << properties; command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT); command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT, 0); return; } Loading @@ -325,8 +343,10 @@ class BleAdvertiserLegacyHciInterfaceImpl : public BleAdvertiserHciInterface { UINT8_TO_STREAM(pp, channel_map); UINT8_TO_STREAM(pp, filter_policy); SendAdvCmd(FROM_HERE, HCI_BLE_WRITE_ADV_PARAMS, param, HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS, command_complete); SendAdvCmd( FROM_HERE, HCI_BLE_WRITE_ADV_PARAMS, param, HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS, base::Bind(&known_tx_pwr, std::move(command_complete), (int8_t)0)); } void SetAdvertisingData(uint8_t handle, uint8_t operation, Loading Loading @@ -441,7 +461,7 @@ class BleAdvertiserHciExtendedImpl : public BleAdvertiserHciInterface { uint8_t primary_phy, uint8_t secondary_max_skip, uint8_t secondary_phy, uint8_t advertising_sid, uint8_t scan_request_notify_enable, status_cb command_complete) override { parameters_cb command_complete) override { VLOG(1) << __func__; const uint16_t HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN = 25; uint8_t param[HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN]; Loading @@ -464,8 +484,10 @@ class BleAdvertiserHciExtendedImpl : public BleAdvertiserHciInterface { UINT8_TO_STREAM(pp, advertising_sid); UINT8_TO_STREAM(pp, scan_request_notify_enable); SendAdvCmd(FROM_HERE, HCI_LE_SET_EXT_ADVERTISING_PARAM, param, HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN, command_complete); btu_hcif_send_cmd_with_cb( FROM_HERE, HCI_LE_SET_EXT_ADVERTISING_PARAM, param, HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN, base::Bind(parameters_response_parser, std::move(command_complete))); } void SetAdvertisingData(uint8_t handle, uint8_t operation, Loading
system/stack/btm/ble_advertiser_hci_interface.h +3 −1 Original line number Diff line number Diff line Loading @@ -29,6 +29,8 @@ class BleAdvertiserHciInterface { public: using status_cb = base::Callback<void(uint8_t /* status */)>; using parameters_cb = base::Callback<void(uint8_t /* status */, int8_t /* tx_power */)>; static void Initialize(); static BleAdvertiserHciInterface* Get(); Loading Loading @@ -57,7 +59,7 @@ class BleAdvertiserHciInterface { uint8_t secondary_max_skip, uint8_t secondary_phy, uint8_t advertising_sid, uint8_t scan_request_notify_enable, status_cb command_complete) = 0; parameters_cb command_complete) = 0; virtual void SetAdvertisingData(uint8_t handle, uint8_t operation, uint8_t fragment_preference, uint8_t data_length, uint8_t* data, Loading
system/stack/btm/btm_ble_multi_adv.cc +7 −6 Original line number Diff line number Diff line Loading @@ -271,13 +271,15 @@ class BleAdvertisingManagerImpl // asynchronous flow // clang-format off c->self->SetParameters(c->inst_id, &c->params, Bind( [](c_type c, uint8_t status) { [](c_type c, uint8_t status, int8_t tx_power) { if (status != 0) { LOG(ERROR) << "setting parameters failed, status: " << +status; c->cb.Run(status); return; } c->self->adv_inst[c->inst_id].tx_power = tx_power; BD_ADDR *rpa = &c->self->adv_inst[c->inst_id].own_address; c->self->GetHciInterface()->SetRandomAddress(c->inst_id, *rpa, Bind( [](c_type c, uint8_t status) { Loading Loading @@ -346,7 +348,7 @@ class BleAdvertisingManagerImpl c->inst_id = advertiser_id; c->self->SetParameters(c->inst_id, &c->params, Bind( [](c_type c, uint8_t status) { [](c_type c, uint8_t status, int8_t tx_power) { if (status != 0) { c->self->Unregister(c->inst_id); LOG(ERROR) << "setting parameters failed, status: " << +status; Loading @@ -354,8 +356,7 @@ class BleAdvertisingManagerImpl return; } //TODO(jpawlowski): obtain real tx_power from set parameters // response, to put into adv data c->self->adv_inst[c->inst_id].tx_power = tx_power; BD_ADDR *rpa = &c->self->adv_inst[c->inst_id].own_address; c->self->GetHciInterface()->SetRandomAddress(c->inst_id, *rpa, Bind( Loading Loading @@ -513,7 +514,7 @@ class BleAdvertisingManagerImpl } void SetParameters(uint8_t inst_id, tBTM_BLE_ADV_PARAMS* p_params, MultiAdvCb cb) override { ParametersCb cb) override { VLOG(1) << __func__ << " inst_id: " << +inst_id; if (inst_id >= inst_count) { LOG(ERROR) << "bad instance id " << +inst_id; Loading @@ -523,7 +524,7 @@ class BleAdvertisingManagerImpl AdvertisingInstance* p_inst = &adv_inst[inst_id]; if (!p_inst->in_use) { LOG(ERROR) << "adv instance not in use" << +inst_id; cb.Run(BTM_BLE_MULTI_ADV_FAILURE); cb.Run(BTM_BLE_MULTI_ADV_FAILURE, 0); return; } Loading
system/stack/include/ble_advertiser.h +3 −1 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ #define ADVERTISE_FAILED_TOO_MANY_ADVERTISERS 0x02 using MultiAdvCb = base::Callback<void(uint8_t /* status */)>; using ParametersCb = base::Callback<void(uint8_t /* status */, int8_t /* tx_power */)>; // methods we must have defined void btm_ble_update_dmt_flag_bits(uint8_t* flag_value, Loading Loading @@ -116,7 +118,7 @@ class BleAdvertisingManager { /* This function update a Multi-ADV instance with the specififed adv * parameters. */ virtual void SetParameters(uint8_t inst_id, tBTM_BLE_ADV_PARAMS* p_params, MultiAdvCb cb) = 0; ParametersCb cb) = 0; /* This function configure a Multi-ADV instance with the specified adv data or * scan response data.*/ Loading