diff --git a/system/bta/dm/bta_dm_act.cc b/system/bta/dm/bta_dm_act.cc index b7adf9e07d9f223bd35abb8502cb663e59181e32..e08b8943cc04cee81937e895899f4c6dc2ec292a 100644 --- a/system/bta/dm/bta_dm_act.cc +++ b/system/bta/dm/bta_dm_act.cc @@ -4378,155 +4378,6 @@ void bta_dm_ble_set_data_length(tBTA_DM_MSG* p_data) { } } -/******************************************************************************* - * - * Function bta_dm_ble_setup_storage - * - * Description This function configures up the storage parameters for ADV - * batch scanning - * - * Parameters: - * - ******************************************************************************/ -void bta_dm_ble_setup_storage(uint8_t batch_scan_full_max, - uint8_t batch_scan_trunc_max, - uint8_t batch_scan_notify_threshold, - tBTA_BLE_SCAN_SETUP_CBACK* p_setup_cback, - tBTA_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback, - tBTA_BLE_SCAN_REP_CBACK* p_read_rep_cback, - tBTM_BLE_REF_VALUE ref_value) { - tBTM_STATUS btm_status = BTM_BleSetStorageConfig( - batch_scan_full_max, batch_scan_trunc_max, batch_scan_notify_threshold, - p_setup_cback, p_thres_cback, p_read_rep_cback, ref_value); - if (btm_status != BTM_CMD_STARTED) - bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, ref_value, - btm_status); -} - -/******************************************************************************* - * - * Function bta_dm_ble_enable_batch_scan - * - * Description This function sets up the parameters and enables batch scan - * - * Parameters: - * - ******************************************************************************/ -void bta_dm_ble_enable_batch_scan(tBTA_BLE_BATCH_SCAN_MODE scan_mode, - uint32_t scan_int, uint32_t scan_window, - tBTA_BLE_DISCARD_RULE discard_rule, - tBLE_ADDR_TYPE addr_type, - tBTM_BLE_REF_VALUE ref_value) { - tBTM_STATUS btm_status = BTM_BleEnableBatchScan( - scan_mode, scan_int, scan_window, discard_rule, addr_type, ref_value); - if (BTM_CMD_STARTED != btm_status) - bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_ENABLE_EVT, ref_value, btm_status); -} - -/******************************************************************************* - * - * Function bta_dm_ble_disable_batch_scan - * - * Description This function disables the batch scan - * - * Parameters: - * - ******************************************************************************/ -void bta_dm_ble_disable_batch_scan(tBTM_BLE_REF_VALUE ref_value) { - tBTM_STATUS btm_status = BTM_BleDisableBatchScan(ref_value); - if (btm_status != BTM_CMD_STARTED) - bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_DISABLE_EVT, ref_value, - btm_status); -} - -/******************************************************************************* - * - * Function bta_dm_ble_read_scan_reports - * - * Description This function reads the batch scan reports - * - * Parameters: - * - ******************************************************************************/ -void bta_dm_ble_read_scan_reports(tBTA_BLE_BATCH_SCAN_MODE scan_type, - tBTM_BLE_REF_VALUE ref_value) { - tBTM_STATUS btm_status = BTM_BleReadScanReports(scan_type, ref_value); - if (btm_status != BTM_CMD_STARTED) - bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, ref_value, - btm_status); -} - -/******************************************************************************* - * - * Function bta_dm_ble_track_advertiser - * - * Description This function tracks the specific advertiser - * - * Parameters: - * - ******************************************************************************/ -void bta_dm_ble_track_advertiser(tBTA_DM_MSG* p_data) { - tBTM_STATUS btm_status = 0; - BD_ADDR bda; - memset(&bda, 0, sizeof(BD_ADDR)); - tBTM_BLE_VSC_CB cmn_ble_vsc_cb; - tBTA_DM_BLE_TRACK_ADV_DATA track_adv_data; - - BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - - if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) { - btm_status = BTM_BleTrackAdvertiser( - (tBTM_BLE_TRACK_ADV_CBACK*)p_data->ble_track_advert.p_track_adv_cback, - p_data->ble_track_advert.ref_value); - } - - if (BTM_CMD_STARTED != btm_status) { - memset(&track_adv_data, 0, sizeof(tBTA_DM_BLE_TRACK_ADV_DATA)); - track_adv_data.advertiser_info_present = - NO_ADV_INFO_PRESENT; /* Indicates failure */ - track_adv_data.client_if = (uint8_t)p_data->ble_track_advert.ref_value; - p_data->ble_track_advert.p_track_adv_cback(&track_adv_data); - } -} - -/******************************************************************************* - * - * Function bta_ble_scan_setup_cb - * - * Description Handle the setup callback from BTM layer and forward it to - * app layer - * - * Parameters: - * - ******************************************************************************/ -void bta_ble_scan_setup_cb(tBTM_BLE_BATCH_SCAN_EVT evt, - tBTM_BLE_REF_VALUE ref_value, tBTM_STATUS status) { - tBTA_BLE_BATCH_SCAN_EVT bta_evt = 0; - - APPL_TRACE_DEBUG("bta_ble_scan_setup_cb : evt: %d, ref_value: %d, status:%d", - evt, ref_value, status); - - switch (evt) { - case BTM_BLE_BATCH_SCAN_ENABLE_EVT: - bta_evt = BTA_BLE_BATCH_SCAN_ENB_EVT; - break; - case BTM_BLE_BATCH_SCAN_CFG_STRG_EVT: - bta_evt = BTA_BLE_BATCH_SCAN_CFG_STRG_EVT; - break; - case BTM_BLE_BATCH_SCAN_DISABLE_EVT: - bta_evt = BTA_BLE_BATCH_SCAN_DIS_EVT; - break; - case BTM_BLE_BATCH_SCAN_PARAM_EVT: - bta_evt = BTA_BLE_BATCH_SCAN_PARAM_EVT; - break; - default: - break; - } - - if (NULL != bta_dm_cb.p_setup_cback) - bta_dm_cb.p_setup_cback(bta_evt, ref_value, status); -} - /******************************************************************************* * * Function bta_ble_enable_scan_cmpl diff --git a/system/bta/dm/bta_dm_api.cc b/system/bta/dm/bta_dm_api.cc index 8c750441e2163ef26d68ef42f5bded324ec73209..91d38a68009e8f3413dbf08ff738a031b5769881 100644 --- a/system/bta/dm/bta_dm_api.cc +++ b/system/bta/dm/bta_dm_api.cc @@ -783,160 +783,6 @@ void BTA_DmSetBleConnScanParams(uint32_t scan_interval, uint32_t scan_window) { bta_sys_sendmsg(p_msg); } -/******************************************************************************* - * - * Function BTA_DmSetBleScanParams - * - * Description This function is called to set scan parameters - * - * Parameters: client_if - Client IF - * scan_interval - scan interval - * scan_window - scan window - * scan_mode - scan mode - * scan_param_setup_status_cback - Set scan param status - * callback - * - * Returns void - * - ******************************************************************************/ - -void BTA_DmSetBleScanParams( - tGATT_IF client_if, uint32_t scan_interval, uint32_t scan_window, - tBLE_SCAN_MODE scan_mode, - tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_cback) { - do_in_bta_thread(FROM_HERE, - base::Bind(&BTM_BleSetScanParams, client_if, scan_interval, - scan_window, scan_mode, scan_param_setup_cback)); -} - -/******************************************************************************* - * BLE ADV data management API - ******************************************************************************/ - -/******************************************************************************* - * - * Function BTA_DmBleSetStorageParams - * - * Description This function is called to override the BTA scan response. - * - * Parameters batch_scan_full_max -Max storage space (in %) allocated to - * full scanning - * batch_scan_trunc_max -Max storage space (in %) allocated to - * truncated scanning - * batch_scan_notify_threshold -Setup notification level based - * on total space - * p_setup_cback - Setup callback pointer - * p_thres_cback - Threshold callback pointer - * p_rep_cback - Reports callback pointer - * ref_value - Ref value - * - * Returns None - * - ******************************************************************************/ -extern void BTA_DmBleSetStorageParams( - uint8_t batch_scan_full_max, uint8_t batch_scan_trunc_max, - uint8_t batch_scan_notify_threshold, - tBTA_BLE_SCAN_SETUP_CBACK* p_setup_cback, - tBTA_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback, - tBTA_BLE_SCAN_REP_CBACK* p_rep_cback, tBTM_BLE_REF_VALUE ref_value) { - bta_dm_cb.p_setup_cback = p_setup_cback; - do_in_bta_thread( - FROM_HERE, - base::Bind(&bta_dm_ble_setup_storage, batch_scan_full_max, - batch_scan_trunc_max, batch_scan_notify_threshold, - bta_ble_scan_setup_cb, p_thres_cback, p_rep_cback, ref_value)); -} - -/******************************************************************************* - * - * Function BTA_DmBleEnableBatchScan - * - * Description This function is called to enable the batch scan - * - * Parameters scan_mode -Batch scan mode - * scan_interval - Scan interval - * scan_window - Scan window - * discard_rule -Discard rules - * addr_type - Address type - * ref_value - Reference value - * - * Returns None - * - ******************************************************************************/ -extern void BTA_DmBleEnableBatchScan(tBTA_BLE_BATCH_SCAN_MODE scan_mode, - uint32_t scan_interval, - uint32_t scan_window, - tBTA_BLE_DISCARD_RULE discard_rule, - tBLE_ADDR_TYPE addr_type, - tBTM_BLE_REF_VALUE ref_value) { - do_in_bta_thread(FROM_HERE, base::Bind(&bta_dm_ble_enable_batch_scan, - scan_mode, scan_interval, scan_window, - discard_rule, addr_type, ref_value)); -} - -/******************************************************************************* - * - * Function BTA_DmBleDisableBatchScan - * - * Description This function is called to disable the batch scan - * - * Parameters ref_value - Reference value - * - * Returns None - * - ******************************************************************************/ -extern void BTA_DmBleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value) { - do_in_bta_thread(FROM_HERE, - base::Bind(&bta_dm_ble_disable_batch_scan, ref_value)); -} - -/******************************************************************************* - * - * Function BTA_DmBleReadScanReports - * - * Description This function is called to read scan reports - * - * Parameters scan_type -Batch scan mode - * ref_value - Reference value - * - * Returns None - * - ******************************************************************************/ -extern void BTA_DmBleReadScanReports(tBTA_BLE_BATCH_SCAN_MODE scan_type, - tBTM_BLE_REF_VALUE ref_value) { - do_in_bta_thread(FROM_HERE, base::Bind(&bta_dm_ble_read_scan_reports, - scan_type, ref_value)); -} - -/******************************************************************************* - * - * Function BTA_DmBleTrackAdvertiser - * - * Description This function is called to track advertiser - * - * Parameters ref_value - Reference value - * p_track_adv_cback - Track ADV callback - * - * Returns None - * - ******************************************************************************/ -extern void BTA_DmBleTrackAdvertiser( - tBTM_BLE_REF_VALUE ref_value, tBTA_BLE_TRACK_ADV_CBACK* p_track_adv_cback) { - tBTA_DM_API_TRACK_ADVERTISER* p_msg = - (tBTA_DM_API_TRACK_ADVERTISER*)osi_malloc( - sizeof(tBTA_DM_API_TRACK_ADVERTISER)); - - p_msg->hdr.event = BTA_DM_API_BLE_TRACK_ADVERTISER_EVT; - p_msg->p_track_adv_cback = p_track_adv_cback; - p_msg->ref_value = ref_value; - - bta_sys_sendmsg(p_msg); -} - -/******************************************************************************* - * BLE ADV data management API - ******************************************************************************/ - /** * Set BLE connectable mode to auto connect */ diff --git a/system/bta/dm/bta_dm_int.h b/system/bta/dm/bta_dm_int.h index 96a293562f7e1097a02befa9102cdb4b27382c5a..de6b7284d5557bb1c07a09c70697add21755adef 100644 --- a/system/bta/dm/bta_dm_int.h +++ b/system/bta/dm/bta_dm_int.h @@ -89,7 +89,6 @@ enum { BTA_DM_API_LOCAL_PRIVACY_EVT, #endif BTA_DM_API_SET_DATA_LENGTH_EVT, - BTA_DM_API_BLE_TRACK_ADVERTISER_EVT, BTA_DM_API_BLE_ENERGY_INFO_EVT, BTA_DM_API_ENABLE_TEST_MODE_EVT, @@ -414,13 +413,6 @@ typedef struct { } tBTA_DM_API_BLE_FEATURE; -/* adv data structure */ -typedef struct { - BT_HDR hdr; - tBTM_BLE_REF_VALUE ref_value; - tBTA_BLE_TRACK_ADV_CBACK* p_track_adv_cback; -} tBTA_DM_API_TRACK_ADVERTISER; - typedef struct { BT_HDR hdr; tBTA_BLE_ENERGY_INFO_CBACK* p_energy_info_cback; @@ -511,7 +503,6 @@ typedef union { tBTA_DM_API_UPDATE_CONN_PARAM ble_update_conn_params; tBTA_DM_API_BLE_SET_DATA_LENGTH ble_set_data_length; - tBTA_DM_API_TRACK_ADVERTISER ble_track_advert; tBTA_DM_API_ENERGY_INFO ble_energy_info; tBTA_DM_API_REMOVE_ACL remove_acl; @@ -617,7 +608,6 @@ typedef struct { bool is_bta_dm_active; tBTA_DM_ACTIVE_LINK device_list; tBTA_DM_SEC_CBACK* p_sec_cback; - tBTA_BLE_SCAN_SETUP_CBACK* p_setup_cback; tBTA_BLE_ENERGY_INFO_CBACK* p_energy_info_cback; uint16_t state; bool disabling; @@ -840,22 +830,6 @@ extern void bta_dm_ble_set_adv_params(uint16_t adv_int_min, extern void bta_dm_ble_set_data_length(tBTA_DM_MSG* p_data); -extern void bta_dm_ble_setup_storage( - uint8_t batch_scan_full_max, uint8_t batch_scan_trunc_max, - uint8_t batch_scan_notify_threshold, - tBTA_BLE_SCAN_SETUP_CBACK* p_setup_cback, - tBTA_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback, - tBTA_BLE_SCAN_REP_CBACK* p_read_rep_cback, tBTM_BLE_REF_VALUE ref_value); -extern void bta_dm_ble_enable_batch_scan(tBTA_BLE_BATCH_SCAN_MODE scan_mode, - uint32_t scan_int, - uint32_t scan_window, - tBTA_BLE_DISCARD_RULE discard_rule, - tBLE_ADDR_TYPE addr_type, - tBTM_BLE_REF_VALUE ref_value); -extern void bta_dm_ble_disable_batch_scan(tBTM_BLE_REF_VALUE ref_value); -extern void bta_dm_ble_read_scan_reports(tBTA_BLE_BATCH_SCAN_MODE scan_type, - tBTM_BLE_REF_VALUE ref_value); -extern void bta_dm_ble_track_advertiser(tBTA_DM_MSG* p_data); extern void bta_dm_ble_get_energy_info(tBTA_DM_MSG* p_data); extern void bta_dm_set_encryption(tBTA_DM_MSG* p_data); diff --git a/system/bta/dm/bta_dm_main.cc b/system/bta/dm/bta_dm_main.cc index 72a356b6afebf7ac0fb334c138dd58fb6fa1ea76..d91eaba541876544caf3c632c9ca74d1917a0ca5 100644 --- a/system/bta/dm/bta_dm_main.cc +++ b/system/bta/dm/bta_dm_main.cc @@ -83,7 +83,6 @@ const tBTA_DM_ACTION bta_dm_action[] = { bta_dm_ble_config_local_privacy, /* BTA_DM_API_LOCAL_PRIVACY_EVT */ #endif bta_dm_ble_set_data_length, /* BTA_DM_API_SET_DATA_LENGTH_EVT */ - bta_dm_ble_track_advertiser, /* BTA_DM_API_BLE_TRACK_ADVERTISER_EVT */ bta_dm_ble_get_energy_info, /* BTA_DM_API_BLE_ENERGY_INFO_EVT */ bta_dm_enable_test_mode, /* BTA_DM_API_ENABLE_TEST_MODE_EVT */ diff --git a/system/bta/include/bta_api.h b/system/bta/include/bta_api.h index a8a7240cdc7b43586f8e9c2bf6592d64f2fff7b4..c1cfa8cd68d901291065557ca46a6c062b8c2427 100644 --- a/system/bta/include/bta_api.h +++ b/system/bta/include/bta_api.h @@ -332,18 +332,6 @@ typedef uint8_t tBTA_BLE_DISCARD_RULE; enum { BTA_BLE_ADV_SEEN_FIRST_TIME = 0, BTA_BLE_ADV_TRACKING_TIMEOUT = 1 }; typedef uint8_t tBTA_BLE_ADV_CHANGE_REASON; -enum { - BTA_BLE_BATCH_SCAN_ENB_EVT = 1, - BTA_BLE_BATCH_SCAN_CFG_STRG_EVT = 2, - BTA_BLE_BATCH_SCAN_DATA_EVT = 3, - BTA_BLE_BATCH_SCAN_THRES_EVT = 4, - BTA_BLE_BATCH_SCAN_PARAM_EVT = 5, - BTA_BLE_BATCH_SCAN_DIS_EVT = 6 -}; -typedef tBTM_BLE_BATCH_SCAN_EVT tBTA_BLE_BATCH_SCAN_EVT; - -typedef tBTM_BLE_TRACK_ADV_ACTION tBTA_BLE_TRACK_ADV_ACTION; - /* BLE customer specific feature function type definitions */ /* data type used on customer specific feature for RSSI monitoring */ #define BTA_BLE_RSSI_ALERT_HI 0 @@ -828,25 +816,6 @@ typedef uint8_t tBTA_DM_BLE_ADV_INFO_PRESENT; typedef uint8_t tBTA_DM_BLE_RSSI_VALUE; typedef uint16_t tBTA_DM_BLE_ADV_INFO_TIMESTAMP; -typedef tBTM_BLE_TRACK_ADV_DATA tBTA_DM_BLE_TRACK_ADV_DATA; - -typedef void(tBTA_BLE_SCAN_THRESHOLD_CBACK)(tBTM_BLE_REF_VALUE ref_value); - -typedef void(tBTA_BLE_SCAN_REP_CBACK)(tBTM_BLE_REF_VALUE ref_value, - uint8_t report_format, - uint8_t num_records, uint16_t data_len, - uint8_t* p_rep_data, tBTA_STATUS status); - -typedef void(tBTA_BLE_SCAN_SETUP_CBACK)(tBTA_BLE_BATCH_SCAN_EVT evt, - tBTM_BLE_REF_VALUE ref_value, - tBTA_STATUS status); - -typedef void(tBTA_BLE_TRACK_ADV_CMPL_CBACK)(int action, tBTA_STATUS status, - tBTM_BLE_PF_AVBL_SPACE avbl_space, - tBTM_BLE_REF_VALUE ref_value); - -typedef void(tBTA_BLE_TRACK_ADV_CBACK)(tBTA_DM_BLE_TRACK_ADV_DATA* p_adv_data); - typedef void(tBTA_BLE_ENERGY_INFO_CBACK)(tBTA_DM_BLE_TX_TIME_MS tx_time, tBTA_DM_BLE_RX_TIME_MS rx_time, tBTA_DM_BLE_IDLE_TIME_MS idle_time, @@ -1563,27 +1532,6 @@ extern void BTA_DmSetBlePrefConnParams(const BD_ADDR bd_addr, extern void BTA_DmSetBleConnScanParams(uint32_t scan_interval, uint32_t scan_window); -/******************************************************************************* - * - * Function BTA_DmSetBleScanParams - * - * Description This function is called to set scan parameters - * - * Parameters: client_if - Client IF - * scan_interval - scan interval - * scan_window - scan window - * scan_mode - scan mode - * scan_param_setup_status_cback - Set scan param status - * callback - * - * Returns void - * - ******************************************************************************/ -extern void BTA_DmSetBleScanParams( - tGATT_IF client_if, uint32_t scan_interval, uint32_t scan_window, - tBLE_SCAN_MODE scan_mode, - tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_status_cback); - /******************************************************************************* * * Function BTA_DmSearchExt @@ -1754,102 +1702,6 @@ extern void BTA_DmBleUpdateConnectionParams(const BD_ADDR bd_addr, extern void BTA_DmBleSetDataLength(BD_ADDR remote_device, uint16_t tx_data_length); -/******************************************************************************* - * - * Function BTA_DmBleSetStorageParams - * - * Description This function is called to set the storage parameters - * - * Parameters batch_scan_full_max -Max storage space (in %) allocated to - * full scanning - * batch_scan_trunc_max -Max storage space (in %) allocated to - * truncated scanning - * batch_scan_notify_threshold - Setup notification level based - * on total space consumed by - * both pools. Setting it to 0 - * will disable threshold - * notification - * p_setup_cback - Setup callback - * p_thres_cback - Threshold callback - * p_rep_cback - Reports callback - * ref_value - Reference value - * - * Returns None - * - ******************************************************************************/ -extern void BTA_DmBleSetStorageParams( - uint8_t batch_scan_full_max, uint8_t batch_scan_trunc_max, - uint8_t batch_scan_notify_threshold, - tBTA_BLE_SCAN_SETUP_CBACK* p_setup_cback, - tBTA_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback, - tBTA_BLE_SCAN_REP_CBACK* p_rep_cback, tBTM_BLE_REF_VALUE ref_value); - -/******************************************************************************* - * - * Function BTA_DmBleEnableBatchScan - * - * Description This function is called to enable the batch scan - * - * Parameters scan_mode -Batch scan mode - * scan_interval - Scan interval - * scan_window - Scan window - * discard_rule -Discard rules - * addr_type - Address type - * ref_value - Reference value - * - * Returns None - * - ******************************************************************************/ -extern void BTA_DmBleEnableBatchScan(tBTA_BLE_BATCH_SCAN_MODE scan_mode, - uint32_t scan_interval, - uint32_t scan_window, - tBTA_BLE_DISCARD_RULE discard_rule, - tBLE_ADDR_TYPE addr_type, - tBTM_BLE_REF_VALUE ref_value); - -/******************************************************************************* - * - * Function BTA_DmBleReadScanReports - * - * Description This function is called to read the batch scan reports - * - * Parameters scan_mode -Batch scan mode - * ref_value - Reference value - * - * Returns None - * - ******************************************************************************/ -extern void BTA_DmBleReadScanReports(tBTA_BLE_BATCH_SCAN_MODE scan_type, - tBTM_BLE_REF_VALUE ref_value); - -/******************************************************************************* - * - * Function BTA_DmBleDisableBatchScan - * - * Description This function is called to disable the batch scanning - * - * Parameters ref_value - Reference value - * - * Returns None - * - ******************************************************************************/ -extern void BTA_DmBleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value); - -/******************************************************************************* - * - * Function BTA_DmBleTrackAdvertiser - * - * Description This function is called to track the advertiser - * - * Parameters ref_value - Reference value - * p_track_adv_cback - ADV callback - * - * Returns None - * - ******************************************************************************/ -extern void BTA_DmBleTrackAdvertiser( - tBTM_BLE_REF_VALUE ref_value, tBTA_BLE_TRACK_ADV_CBACK* p_track_adv_cback); - /******************************************************************************* * * Function BTA_DmBleGetEnergyInfo diff --git a/system/btif/src/btif_ble_scanner.cc b/system/btif/src/btif_ble_scanner.cc index 60aa5f3785da7e7febb42bb03b4ecc9d0ced5499..0dddfd73cc22a7be0e8d1aada094964a6f7dda18 100644 --- a/system/btif/src/btif_ble_scanner.cc +++ b/system/btif/src/btif_ble_scanner.cc @@ -204,64 +204,15 @@ void bta_scan_filt_status_cb(tBTM_BLE_REF_VALUE ref_value, uint8_t action, SCAN_CBACK_IN_JNI(scan_filter_status_cb, action, ref_value, status); } -void bta_batch_scan_setup_cb(tBTA_BLE_BATCH_SCAN_EVT evt, - tBTM_BLE_REF_VALUE ref_value, tBTA_STATUS status) { - BTIF_TRACE_DEBUG("bta_batch_scan_setup_cb-Status:%x, client_if:%d, evt=%d", - status, ref_value, evt); - - switch (evt) { - case BTA_BLE_BATCH_SCAN_ENB_EVT: { - SCAN_CBACK_IN_JNI(batchscan_enb_disable_cb, 1, ref_value, status); - return; - } - - case BTA_BLE_BATCH_SCAN_DIS_EVT: { - SCAN_CBACK_IN_JNI(batchscan_enb_disable_cb, 0, ref_value, status); - return; - } - - case BTA_BLE_BATCH_SCAN_CFG_STRG_EVT: { - SCAN_CBACK_IN_JNI(batchscan_cfg_storage_cb, ref_value, status); - return; - } - - case BTA_BLE_BATCH_SCAN_DATA_EVT: { - SCAN_CBACK_IN_JNI(batchscan_reports_cb, ref_value, status, 0, 0, - vector<uint8_t>()); - return; - } - - case BTA_BLE_BATCH_SCAN_THRES_EVT: { - SCAN_CBACK_IN_JNI(batchscan_threshold_cb, ref_value); - return; - } - - default: - return; - } -} - void bta_batch_scan_threshold_cb(tBTM_BLE_REF_VALUE ref_value) { SCAN_CBACK_IN_JNI(batchscan_threshold_cb, ref_value); } -void bta_batch_scan_reports_cb(tBTM_BLE_REF_VALUE ref_value, +void bta_batch_scan_reports_cb(int client_id, tBTA_STATUS status, uint8_t report_format, uint8_t num_records, - uint16_t data_len, uint8_t* p_rep_data, - tBTA_STATUS status) { - BTIF_TRACE_DEBUG("%s - client_if:%d, %d, %d, %d", __func__, ref_value, status, - num_records, data_len); - - if (data_len > 0) { - vector<uint8_t> data(p_rep_data, p_rep_data + data_len); - osi_free(p_rep_data); - - SCAN_CBACK_IN_JNI(batchscan_reports_cb, ref_value, status, report_format, - num_records, std::move(data)); - } else { - SCAN_CBACK_IN_JNI(batchscan_reports_cb, ref_value, status, report_format, - num_records, vector<uint8_t>()); - } + std::vector<uint8_t> data) { + SCAN_CBACK_IN_JNI(batchscan_reports_cb, client_id, status, report_format, + num_records, std::move(data)); } void bta_scan_results_cb_impl(bt_bdaddr_t bd_addr, tBT_DEVICE_TYPE device_type, @@ -340,7 +291,7 @@ void bta_scan_results_cb(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) { p_data->inq_res.ble_addr_type, std::move(value))); } -void bta_track_adv_event_cb(tBTA_DM_BLE_TRACK_ADV_DATA* p_track_adv_data) { +void bta_track_adv_event_cb(tBTM_BLE_TRACK_ADV_DATA* p_track_adv_data) { btgatt_track_adv_info_t* btif_scan_track_cb = new btgatt_track_adv_info_t; BTIF_TRACE_DEBUG("%s", __func__); @@ -392,7 +343,9 @@ class BleScannerInterfaceImpl : public BleScannerInterface { BTIF_TRACE_DEBUG("%s", __func__); if (filt_param && filt_param->dely_mode == 1) { - BTA_DmBleTrackAdvertiser(client_if, bta_track_adv_event_cb); + do_in_bta_thread( + FROM_HERE, base::Bind(BTM_BleTrackAdvertiser, bta_track_adv_event_cb, + client_if)); } do_in_bta_thread( @@ -509,35 +462,57 @@ class BleScannerInterfaceImpl : public BleScannerInterface { void SetScanParameters(int client_if, int scan_interval, int scan_window) override { - BTA_DmSetBleScanParams( - client_if, scan_interval, scan_window, BTM_BLE_SCAN_MODE_ACTI, - (tBLE_SCAN_PARAM_SETUP_CBACK)bta_scan_param_setup_cb); + do_in_bta_thread( + FROM_HERE, + base::Bind(&BTM_BleSetScanParams, client_if, scan_interval, scan_window, + BTM_BLE_SCAN_MODE_ACTI, bta_scan_param_setup_cb)); } void BatchscanConfigStorage(int client_if, int batch_scan_full_max, int batch_scan_trunc_max, int batch_scan_notify_threshold) override { - BTA_DmBleSetStorageParams( - batch_scan_full_max, batch_scan_trunc_max, batch_scan_notify_threshold, - (tBTA_BLE_SCAN_SETUP_CBACK*)bta_batch_scan_setup_cb, - (tBTA_BLE_SCAN_THRESHOLD_CBACK*)bta_batch_scan_threshold_cb, - (tBTA_BLE_SCAN_REP_CBACK*)bta_batch_scan_reports_cb, - (tBTM_BLE_REF_VALUE)client_if); + base::Callback<void(uint8_t /* status */)> cb = base::Bind( + [](int client_if, uint8_t status) { + SCAN_CBACK_IN_JNI(batchscan_cfg_storage_cb, client_if, status); + }, + client_if); + + do_in_bta_thread( + FROM_HERE, + base::Bind(&BTM_BleSetStorageConfig, (uint8_t)batch_scan_full_max, + (uint8_t)batch_scan_trunc_max, + (uint8_t)batch_scan_notify_threshold, cb, + bta_batch_scan_threshold_cb, (tBTM_BLE_REF_VALUE)client_if)); } void BatchscanEnable(int client_if, int scan_mode, int scan_interval, int scan_window, int addr_type, int discard_rule) override { - BTA_DmBleEnableBatchScan(scan_mode, scan_interval, scan_window, - discard_rule, addr_type, client_if); + auto cb = base::Bind( + [](int client_if, uint8_t status) { + SCAN_CBACK_IN_JNI(batchscan_enb_disable_cb, 1, client_if, status); + }, + client_if); + + do_in_bta_thread( + FROM_HERE, base::Bind(&BTM_BleEnableBatchScan, scan_mode, scan_interval, + scan_window, discard_rule, addr_type, cb)); } void BatchscanDisable(int client_if) override { - BTA_DmBleDisableBatchScan(client_if); + auto cb = base::Bind( + [](int client_if, uint8_t status) { + SCAN_CBACK_IN_JNI(batchscan_enb_disable_cb, 1, client_if, status); + }, + client_if); + + do_in_bta_thread(FROM_HERE, base::Bind(&BTM_BleDisableBatchScan, cb)); } void BatchscanReadReports(int client_if, int scan_mode) override { - BTA_DmBleReadScanReports(scan_mode, client_if); + do_in_bta_thread(FROM_HERE, + base::Bind(&BTM_BleReadScanReports, (uint8_t)scan_mode, + Bind(bta_batch_scan_reports_cb, client_if))); } }; diff --git a/system/stack/btm/btm_ble_batchscan.cc b/system/stack/btm/btm_ble_batchscan.cc index 43db5ef6162a10576837cbd111f1ea034c7feea2..21900e995fed9461f2956175bb7c9f3cfed61a10 100644 --- a/system/stack/btm/btm_ble_batchscan.cc +++ b/system/stack/btm/btm_ble_batchscan.cc @@ -15,9 +15,11 @@ * limitations under the License. * ******************************************************************************/ +#include <base/bind.h> #include <stddef.h> #include <stdio.h> #include <string.h> +#include <vector> #include "bt_target.h" #include "bt_types.h" @@ -28,6 +30,11 @@ #include "device/include/controller.h" #include "hcimsgs.h" +using base::Bind; +using base::Callback; +using hci_cmd_cb = base::Callback<void(uint8_t* /* return_parameters */, + uint16_t /* return_parameters_length*/)>; + tBTM_BLE_BATCH_SCAN_CB ble_batchscan_cb; tBTM_BLE_ADV_TRACK_CB ble_advtrack_cb; @@ -37,24 +44,20 @@ tBTM_BLE_ADV_TRACK_CB ble_advtrack_cb; #define BTM_BLE_BATCH_SCAN_ENB_DISB_LEN 2 #define BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN 2 -#define BTM_BLE_BATCH_SCAN_CB_EVT_MASK 0xF0 -#define BTM_BLE_BATCH_SCAN_SUBCODE_MASK 0x0F +namespace { -/******************************************************************************* - * Local functions - ******************************************************************************/ -void btm_ble_batchscan_vsc_cmpl_cback(tBTM_VSC_CMPL* p_params); -void btm_ble_batchscan_cleanup(void); +bool can_do_batch_scan() { + if (!controller_get_interface()->supports_ble()) return false; -/******************************************************************************* - * - * Function btm_ble_batchscan_filter_track_adv_vse_cback - * - * Description VSE callback for batch scan, filter, and tracking events. - * - * Returns None - * - ******************************************************************************/ + tBTM_BLE_VSC_CB cmn_ble_vsc_cb; + BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); + + if (cmn_ble_vsc_cb.tot_scan_results_strg == 0) return false; + + return true; +} + +/* VSE callback for batch scan, filter, and tracking events */ void btm_ble_batchscan_filter_track_adv_vse_cback(uint8_t len, uint8_t* p) { tBTM_BLE_TRACK_ADV_DATA adv_data; @@ -126,348 +129,165 @@ void btm_ble_batchscan_filter_track_adv_vse_cback(uint8_t len, uint8_t* p) { } } -/******************************************************************************* - * - * Function btm_ble_batchscan_enq_op_q - * - * Description enqueue a batchscan operation in q to check command complete - * status - * - * Returns void - * - ******************************************************************************/ -void btm_ble_batchscan_enq_op_q(uint8_t opcode, - tBTM_BLE_BATCH_SCAN_STATE cur_state, - uint8_t cb_evt, tBTM_BLE_REF_VALUE ref_value) { - ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.next_idx] = - (opcode | (cb_evt << 4)); - ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.next_idx] = cur_state; - ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.next_idx] = ref_value; - BTM_TRACE_DEBUG( - "btm_ble_batchscan_enq_op_q: subcode:%d, Cur_state:%d, ref_value:%d", - ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.next_idx], - ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.next_idx], - ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.next_idx]); - ble_batchscan_cb.op_q.next_idx = - (ble_batchscan_cb.op_q.next_idx + 1) % BTM_BLE_BATCH_SCAN_MAX; -} +void feat_enable_cb(uint8_t* p, uint16_t len) { + if (len < 2) { + BTM_TRACE_ERROR("%s: wrong length", __func__); + return; + } -/******************************************************************************* - * - * Function btm_ble_batchscan_enq_rep_q - * - * Description enqueue a batchscan report operation in q to check command - * complete status - * - * Returns void - * - ******************************************************************************/ -tBTM_STATUS btm_ble_batchscan_enq_rep_q(uint8_t report_format, - tBTM_BLE_REF_VALUE ref_value) { - int i = 0; - for (i = 0; i < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; i++) { - if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[i]) - return BTM_ILLEGAL_VALUE; + uint8_t status, subcode; + STREAM_TO_UINT8(status, p); + STREAM_TO_UINT8(subcode, p); + + uint8_t expected_opcode = BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE; + if (subcode != expected_opcode) { + BTM_TRACE_ERROR("%s: bad subcode, expected: %d got: %d", __func__, + expected_opcode, subcode); + return; } - ble_batchscan_cb.main_rep_q.rep_mode[ble_batchscan_cb.main_rep_q.next_idx] = - report_format; - ble_batchscan_cb.main_rep_q.ref_value[ble_batchscan_cb.main_rep_q.next_idx] = - ref_value; - ble_batchscan_cb.main_rep_q - .num_records[ble_batchscan_cb.main_rep_q.next_idx] = 0; - ble_batchscan_cb.main_rep_q.data_len[ble_batchscan_cb.main_rep_q.next_idx] = - 0; - ble_batchscan_cb.main_rep_q.p_data[ble_batchscan_cb.main_rep_q.next_idx] = - NULL; - BTM_TRACE_DEBUG("btm_ble_batchscan_enq_rep_q: index:%d, rep %d, ref %d", - ble_batchscan_cb.main_rep_q.next_idx, report_format, - ref_value); - - ble_batchscan_cb.main_rep_q.next_idx = - (ble_batchscan_cb.main_rep_q.next_idx + 1) % - BTM_BLE_BATCH_REP_MAIN_Q_SIZE; - return BTM_SUCCESS; -} + if (ble_batchscan_cb.cur_state != BTM_BLE_SCAN_ENABLE_CALLED) + BTM_TRACE_ERROR("%s: state should be ENABLE_CALLED", __func__); -/******************************************************************************* - * - * Function btm_ble_batchscan_enq_rep_data - * - * Description setup the data in the main report queue - * - * Returns void - * - ******************************************************************************/ -void btm_ble_batchscan_enq_rep_data(uint8_t report_format, uint8_t num_records, - uint8_t* p_data, uint8_t data_len) { - int index = 0; + ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLED_STATE; +} - for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++) { - if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[index]) break; +void storage_config_cb(Callback<void(uint8_t /* status */)> cb, uint8_t* p, + uint16_t len) { + if (len < 2) { + BTM_TRACE_ERROR("%s: wrong length", __func__); + return; } - BTM_TRACE_DEBUG( - "btm_ble_batchscan_enq_rep_data: index:%d, rep %d, num %d len : %d", - index, report_format, num_records, data_len); - - if (index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE && data_len > 0 && - num_records > 0) { - int len = ble_batchscan_cb.main_rep_q.data_len[index]; - uint8_t* p_orig_data = ble_batchscan_cb.main_rep_q.p_data[index]; - uint8_t* p_app_data; - - if (NULL != p_orig_data) { - p_app_data = static_cast<uint8_t*>(osi_malloc(len + data_len)); - memcpy(p_app_data, p_orig_data, len); - memcpy(p_app_data + len, p_data, data_len); - osi_free(p_orig_data); - ble_batchscan_cb.main_rep_q.p_data[index] = p_app_data; - ble_batchscan_cb.main_rep_q.num_records[index] += num_records; - ble_batchscan_cb.main_rep_q.data_len[index] += data_len; - } else { - p_app_data = static_cast<uint8_t*>(osi_malloc(data_len)); - memcpy(p_app_data, p_data, data_len); - ble_batchscan_cb.main_rep_q.p_data[index] = p_app_data; - ble_batchscan_cb.main_rep_q.num_records[index] = num_records; - ble_batchscan_cb.main_rep_q.data_len[index] = data_len; - } + uint8_t status, subcode; + STREAM_TO_UINT8(status, p); + STREAM_TO_UINT8(subcode, p); + + uint8_t expected_opcode = BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM; + if (subcode != expected_opcode) { + BTM_TRACE_ERROR("%s: bad subcode, expected: %d got: %d", __func__, + expected_opcode, subcode); + return; } + + cb.Run(status); } -/******************************************************************************* - * - * Function btm_ble_batchscan_deq_rep_q - * - * Description dequeue a batchscan report in q when command complete - * is received - * - * Returns void - * - ******************************************************************************/ -void btm_ble_batchscan_deq_rep_data(uint8_t report_format, - tBTM_BLE_REF_VALUE* p_ref_value, - uint8_t* p_num_records, uint8_t** p_data, - uint16_t* p_data_len) { - int index = 0; - - for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++) { - if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[index]) break; +void param_enable_cb(Callback<void(uint8_t /* status */)> cb, uint8_t* p, + uint16_t len) { + if (len < 2) { + BTM_TRACE_ERROR("%s: wrong length", __func__); + return; } - if (BTM_BLE_BATCH_REP_MAIN_Q_SIZE == index) { - BTM_TRACE_ERROR("btm_ble_batchscan_deq_rep_data: rep_format:%d not found", - report_format); + uint8_t status, subcode; + STREAM_TO_UINT8(status, p); + STREAM_TO_UINT8(subcode, p); + + uint8_t expected_opcode = BTM_BLE_BATCH_SCAN_SET_PARAMS; + if (subcode != expected_opcode) { + BTM_TRACE_ERROR("%s: bad subcode: 0x%02x 0x%02x", __func__, expected_opcode, + subcode); return; } - *p_num_records = ble_batchscan_cb.main_rep_q.num_records[index]; - *p_ref_value = ble_batchscan_cb.main_rep_q.ref_value[index]; - *p_data = ble_batchscan_cb.main_rep_q.p_data[index]; - *p_data_len = ble_batchscan_cb.main_rep_q.data_len[index]; + cb.Run(status); +} - ble_batchscan_cb.main_rep_q.p_data[index] = NULL; - ble_batchscan_cb.main_rep_q.data_len[index] = 0; - ble_batchscan_cb.main_rep_q.rep_mode[index] = 0; - ble_batchscan_cb.main_rep_q.ref_value[index] = 0; - ble_batchscan_cb.main_rep_q.num_records[index] = 0; +void disable_cb(base::Callback<void(uint8_t /* status */)> cb, uint8_t* p, + uint16_t len) { + if (len < 2) { + BTM_TRACE_ERROR("%s: wrong length", __func__); + return; + } - BTM_TRACE_DEBUG( - "btm_ble_batchscan_deq_rep_data: index:%d, rep %d, num %d, data_len %d", - index, report_format, *p_num_records, *p_data_len); + uint8_t status, subcode; + STREAM_TO_UINT8(status, p); + STREAM_TO_UINT8(subcode, p); - ble_batchscan_cb.main_rep_q.pending_idx = - (ble_batchscan_cb.main_rep_q.pending_idx + 1) % BTM_BLE_BATCH_SCAN_MAX; -} + uint8_t expected_opcode = BTM_BLE_BATCH_SCAN_SET_PARAMS; + if (subcode != expected_opcode) { + BTM_TRACE_ERROR("%s: bad subcode: 0x%02x 0x%02x", __func__, expected_opcode, + subcode); + return; + } -/******************************************************************************* - * - * Function btm_ble_batchscan_deq_op_q - * - * Description dequeue a batch scan operation from q when command complete - * is received - * - * Returns void - * - ******************************************************************************/ -void btm_ble_batchscan_deq_op_q(uint8_t* p_opcode, - tBTM_BLE_BATCH_SCAN_STATE* cur_state, - uint8_t* p_cb_evt, tBTM_BLE_REF_VALUE* p_ref) { - *p_cb_evt = - (ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.pending_idx] >> 4); - *p_opcode = - (ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.pending_idx] & - BTM_BLE_BATCH_SCAN_SUBCODE_MASK); - *p_ref = ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.pending_idx]; - *cur_state = - (ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.pending_idx]); - ble_batchscan_cb.op_q.pending_idx = - (ble_batchscan_cb.op_q.pending_idx + 1) % BTM_BLE_BATCH_SCAN_MAX; + if (ble_batchscan_cb.cur_state != BTM_BLE_SCAN_DISABLE_CALLED) { + BTM_TRACE_ERROR("%s: state should be DISABLE_CALLED", __func__); + } + + if (BTM_SUCCESS == status) { + ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLED_STATE; + } else { + BTM_TRACE_ERROR("%s: Invalid state after disabled", __func__); + ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE; + } + + cb.Run(status); } -/******************************************************************************* - * - * Function btm_ble_read_batchscan_reports - * - * Description This function reads the reports from controller - * - * Parameters scan_mode - The mode for which the reports are to be read - * out from the controller - * ref_value - Reference value - * - ******************************************************************************/ +/** + * This function reads the reports from controller. |scan_mode| is the mode for + * which the reports are to be read + */ void btm_ble_read_batchscan_reports(tBTM_BLE_BATCH_SCAN_MODE scan_mode, - tBTM_BLE_REF_VALUE ref_value) { - uint8_t param[BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN], *pp; - pp = param; - - memset(param, 0, BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN); + hci_cmd_cb cb) { + uint8_t len = BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN; + uint8_t param[len]; + memset(param, 0, len); + uint8_t* pp = param; UINT8_TO_STREAM(pp, BTM_BLE_BATCH_SCAN_READ_RESULTS); UINT8_TO_STREAM(pp, scan_mode); - BTM_VendorSpecificCommand(HCI_BLE_BATCH_SCAN_OCF, - BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN, param, - btm_ble_batchscan_vsc_cmpl_cback); - - /* The user needs to be provided scan read reports event */ - btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_READ_RESULTS, - ble_batchscan_cb.cur_state, - BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, ref_value); + btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_BATCH_SCAN_OCF, param, len, cb); } -/******************************************************************************* - * - * Function btm_ble_batchscan_vsc_cmpl_cback - * - * Description Batch scan VSC complete callback - * - * Parameters p_params - VSC completed callback parameters - * - * Returns void - * - ******************************************************************************/ -void btm_ble_batchscan_vsc_cmpl_cback(tBTM_VSC_CMPL* p_params) { - uint8_t* p = p_params->p_param_buf; - uint16_t len = p_params->param_len; - tBTM_BLE_REF_VALUE ref_value = 0; - - uint8_t status = 0, subcode = 0, opcode = 0; - uint8_t report_format = 0, num_records = 0, cb_evt = 0; - uint16_t data_len = 0; - tBTM_BLE_BATCH_SCAN_STATE cur_state = BTM_BLE_SCAN_INVALID_STATE; - uint8_t* p_data = NULL; - +/* read reports. data is accumulated in |data_all|, number of records is + * accumulated in |num_records_all| */ +void read_reports_cb(std::vector<uint8_t> data_all, uint8_t num_records_all, + tBTM_BLE_SCAN_REP_CBACK cb, uint8_t* p, uint16_t len) { if (len < 2) { - BTM_TRACE_ERROR("wrong length for btm_ble_batch_scan_vsc_cmpl_cback"); - btm_ble_batchscan_deq_op_q(&opcode, &cur_state, &cb_evt, &ref_value); + BTM_TRACE_ERROR("%s: wrong length", __func__); return; } + uint8_t status, subcode; STREAM_TO_UINT8(status, p); STREAM_TO_UINT8(subcode, p); - btm_ble_batchscan_deq_op_q(&opcode, &cur_state, &cb_evt, &ref_value); - - BTM_TRACE_DEBUG( - "btm_ble_batchscan op_code = %02x state = %02x cb_evt = " - "%02x,ref_value=%d", - opcode, cur_state, cb_evt, ref_value); - - if (opcode != subcode) { - BTM_TRACE_ERROR("Got unexpected VSC cmpl, expected: %d got: %d", subcode, - opcode); + uint8_t expected_opcode = BTM_BLE_BATCH_SCAN_READ_RESULTS; + if (subcode != expected_opcode) { + BTM_TRACE_ERROR("%s: bad subcode, expected: %d got: %d", __func__, + expected_opcode, subcode); return; } - switch (subcode) { - case BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE: { - if (BTM_SUCCESS == status && BTM_BLE_SCAN_ENABLE_CALLED == cur_state) - ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLED_STATE; - else if (BTM_BLE_SCAN_ENABLE_CALLED == cur_state) { - BTM_TRACE_ERROR( - "SCAN_ENB_DISAB_CUST_FEATURE - Invalid state after enb"); - ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE; - } - - BTM_TRACE_DEBUG( - "BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEAT status = %d, state: " - "%d,evt=%d", - status, ble_batchscan_cb.cur_state, cb_evt); - - if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback) - ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status); - break; - } + uint8_t report_format, num_records; + STREAM_TO_UINT8(report_format, p); + STREAM_TO_UINT8(num_records, p); - case BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM: { - BTM_TRACE_DEBUG( - "BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM status = %d, evt=%d", status, - cb_evt); - if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback) - ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status); - break; - } + BTM_TRACE_DEBUG("%s: status=%d,len=%d,rec=%d", __func__, status, len - 4, + num_records); - case BTM_BLE_BATCH_SCAN_SET_PARAMS: { - BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_SET_PARAMS status = %d,evt=%d", - status, cb_evt); - - if (BTM_BLE_SCAN_DISABLE_CALLED == cur_state) { - if (BTM_SUCCESS == status) { - ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLED_STATE; - } else { - BTM_TRACE_ERROR( - "BTM_BLE_BATCH_SCAN_SET_PARAMS - Invalid state after disabled"); - ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE; - } - } + if (num_records == 0) { + cb.Run(status, report_format, num_records_all, data_all); + return; + } - if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback) - ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status); - break; - } + if (len > 4) { + data_all.insert(data_all.end(), p, p + len - 4); + num_records_all += num_records; - case BTM_BLE_BATCH_SCAN_READ_RESULTS: { - if (cb_evt != 0 && NULL != ble_batchscan_cb.p_scan_rep_cback) { - STREAM_TO_UINT8(report_format, p); - STREAM_TO_UINT8(num_records, p); - p = (uint8_t*)(p_params->p_param_buf + 4); - BTM_TRACE_DEBUG( - "BTM_BLE_BATCH_SCAN_READ_RESULTS status=%d,len=%d,rec=%d", status, - len - 4, num_records); - - if (0 == num_records) { - btm_ble_batchscan_deq_rep_data(report_format, &ref_value, - &num_records, &p_data, &data_len); - if (NULL != ble_batchscan_cb.p_scan_rep_cback) - ble_batchscan_cb.p_scan_rep_cback(ref_value, report_format, - num_records, data_len, p_data, - status); - } else { - if ((len - 4) > 0) { - btm_ble_batchscan_enq_rep_data(report_format, num_records, p, - len - 4); - /* More records could be in the buffer and needs to be pulled out */ - btm_ble_read_batchscan_reports(report_format, ref_value); - } - } - } - break; - } - - default: - break; + /* More records could be in the buffer and needs to be pulled out */ + btm_ble_read_batchscan_reports( + report_format, base::Bind(&read_reports_cb, std::move(data_all), + num_records_all, std::move(cb))); } - - return; } -/******************************************************************************* - * - * Function btm_ble_set_storage_config - * - * Description This function writes the storage configuration in controller +/** + * This function writes the storage configuration in controller * * Parameters batch_scan_full_max - Max storage space (in %) allocated to * full scanning @@ -476,104 +296,65 @@ void btm_ble_batchscan_vsc_cmpl_cback(tBTM_VSC_CMPL* p_params) { * batch_scan_notify_threshold - Set up notification level * based on total space * - ******************************************************************************/ + **/ void btm_ble_set_storage_config(uint8_t batch_scan_full_max, uint8_t batch_scan_trunc_max, - uint8_t batch_scan_notify_threshold) { - uint8_t param[BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN], *pp; - - pp = param; - memset(param, 0, BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN); + uint8_t batch_scan_notify_threshold, + hci_cmd_cb cb) { + uint8_t len = BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN; + uint8_t param[len]; + memset(param, 0, len); + uint8_t* pp = param; UINT8_TO_STREAM(pp, BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM); UINT8_TO_STREAM(pp, batch_scan_full_max); UINT8_TO_STREAM(pp, batch_scan_trunc_max); UINT8_TO_STREAM(pp, batch_scan_notify_threshold); - BTM_VendorSpecificCommand(HCI_BLE_BATCH_SCAN_OCF, - BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN, param, - btm_ble_batchscan_vsc_cmpl_cback); + btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_BATCH_SCAN_OCF, param, len, cb); } -/******************************************************************************* - * - * Function btm_ble_set_batchscan_param - * - * Description This function writes the batch scan params in controller - * - * Parameters scan_mode -Batch scan mode - * scan_interval - Scan interval - * scan_window - Scan window - * discard_rule -Discard rules - * addr_type - Address type - * - ******************************************************************************/ +/* This function writes the batch scan params in controller */ void btm_ble_set_batchscan_param(tBTM_BLE_BATCH_SCAN_MODE scan_mode, uint32_t scan_interval, uint32_t scan_window, tBLE_ADDR_TYPE addr_type, - tBTM_BLE_DISCARD_RULE discard_rule) { - uint8_t scan_param[BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN], *pp_scan; - - pp_scan = scan_param; - memset(scan_param, 0, BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN); - + tBTM_BLE_DISCARD_RULE discard_rule, + hci_cmd_cb cb) { // Override param and decide addr_type based on own addr type // TODO: Remove upper layer parameter? addr_type = btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type; - UINT8_TO_STREAM(pp_scan, BTM_BLE_BATCH_SCAN_SET_PARAMS); - UINT8_TO_STREAM(pp_scan, scan_mode); - UINT32_TO_STREAM(pp_scan, scan_window); - UINT32_TO_STREAM(pp_scan, scan_interval); - UINT8_TO_STREAM(pp_scan, addr_type); - UINT8_TO_STREAM(pp_scan, discard_rule); - - BTM_VendorSpecificCommand(HCI_BLE_BATCH_SCAN_OCF, - BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN, scan_param, - btm_ble_batchscan_vsc_cmpl_cback); -} - -/******************************************************************************* - * - * Function btm_ble_enable_disable_batchscan - * - * Description This function enables the customer specific feature in - * controller - * - * Parameters enable_disable: true - enable, false - disable - * - ******************************************************************************/ -void btm_ble_enable_disable_batchscan(bool should_enable) { - uint8_t shld_enable = 0x01; - uint8_t enable_param[BTM_BLE_BATCH_SCAN_ENB_DISB_LEN], *pp_enable; + uint8_t len = BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN; + uint8_t param[len]; + memset(param, 0, len); - if (!should_enable) shld_enable = 0x00; + uint8_t* p = param; + UINT8_TO_STREAM(p, BTM_BLE_BATCH_SCAN_SET_PARAMS); + UINT8_TO_STREAM(p, scan_mode); + UINT32_TO_STREAM(p, scan_window); + UINT32_TO_STREAM(p, scan_interval); + UINT8_TO_STREAM(p, addr_type); + UINT8_TO_STREAM(p, discard_rule); - if (should_enable) { - pp_enable = enable_param; - memset(enable_param, 0, BTM_BLE_BATCH_SCAN_ENB_DISB_LEN); + btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_BATCH_SCAN_OCF, param, len, cb); +} - UINT8_TO_STREAM(pp_enable, BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE); - UINT8_TO_STREAM(pp_enable, shld_enable); +/* This function enables the customer specific feature in controller */ +void btm_ble_enable_batchscan(hci_cmd_cb cb) { + uint8_t len = BTM_BLE_BATCH_SCAN_ENB_DISB_LEN; + uint8_t param[len]; + memset(param, 0, len); - BTM_VendorSpecificCommand(HCI_BLE_BATCH_SCAN_OCF, - BTM_BLE_BATCH_SCAN_ENB_DISB_LEN, enable_param, - btm_ble_batchscan_vsc_cmpl_cback); - } else - btm_ble_set_batchscan_param( - BTM_BLE_BATCH_SCAN_MODE_DISABLE, ble_batchscan_cb.scan_interval, - ble_batchscan_cb.scan_window, ble_batchscan_cb.addr_type, - ble_batchscan_cb.discard_rule); + uint8_t* p = param; + UINT8_TO_STREAM(p, BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE); + UINT8_TO_STREAM(p, 0x01 /* enable */); - if (should_enable) - ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLE_CALLED; - else - ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLE_CALLED; + btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_BATCH_SCAN_OCF, param, len, cb); } +} // namespace + /******************************************************************************* - * - * Function BTM_BleSetStorageConfig * * Description This function is called to write storage config params. * @@ -583,104 +364,66 @@ void btm_ble_enable_disable_batchscan(bool should_enable) { * trunc style * batch_scan_notify_threshold - Setup notification level based * on total space - * p_setup_cback - Setup callback pointer + * cb - Setup callback pointer * p_thres_cback - Threshold callback pointer - * p_rep_cback - Reports callback pointer * ref_value - Reference value * - * Returns tBTM_STATUS - * ******************************************************************************/ -tBTM_STATUS BTM_BleSetStorageConfig( - uint8_t batch_scan_full_max, uint8_t batch_scan_trunc_max, - uint8_t batch_scan_notify_threshold, - tBTM_BLE_SCAN_SETUP_CBACK* p_setup_cback, - tBTM_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback, - tBTM_BLE_SCAN_REP_CBACK* p_rep_cback, tBTM_BLE_REF_VALUE ref_value) { - tBTM_BLE_VSC_CB cmn_ble_vsc_cb; +void BTM_BleSetStorageConfig(uint8_t batch_scan_full_max, + uint8_t batch_scan_trunc_max, + uint8_t batch_scan_notify_threshold, + Callback<void(uint8_t /* status */)> cb, + tBTM_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback, + tBTM_BLE_REF_VALUE ref_value) { + if (!can_do_batch_scan()) { + cb.Run(BTM_ERR_PROCESSING); + return; + } - BTM_TRACE_EVENT(" BTM_BleSetStorageConfig: %d, %d, %d, %d, %d", + BTM_TRACE_EVENT("%s: %d, %d, %d, %d, %d", __func__, ble_batchscan_cb.cur_state, ref_value, batch_scan_full_max, batch_scan_trunc_max, batch_scan_notify_threshold); - if (!controller_get_interface()->supports_ble()) return BTM_ILLEGAL_VALUE; - - BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - - if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) { - BTM_TRACE_ERROR("Controller does not support batch scan"); - return BTM_ERR_PROCESSING; - } - - ble_batchscan_cb.p_setup_cback = p_setup_cback; ble_batchscan_cb.p_thres_cback = p_thres_cback; - ble_batchscan_cb.p_scan_rep_cback = p_rep_cback; ble_batchscan_cb.ref_value = ref_value; if (batch_scan_full_max > BTM_BLE_ADV_SCAN_FULL_MAX || batch_scan_trunc_max > BTM_BLE_ADV_SCAN_TRUNC_MAX || batch_scan_notify_threshold > BTM_BLE_ADV_SCAN_THR_MAX) { BTM_TRACE_ERROR("Illegal set storage config params"); - return BTM_ILLEGAL_VALUE; + cb.Run(BTM_ILLEGAL_VALUE); + return; } if (BTM_BLE_SCAN_INVALID_STATE == ble_batchscan_cb.cur_state || BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state || BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state) { - btm_ble_enable_disable_batchscan(true); + btm_ble_enable_batchscan(Bind(&feat_enable_cb)); ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLE_CALLED; - btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE, - BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value); } btm_ble_set_storage_config(batch_scan_full_max, batch_scan_trunc_max, - batch_scan_notify_threshold); - /* The user needs to be provided scan config storage event */ - btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM, - ble_batchscan_cb.cur_state, - BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, ref_value); - - return BTM_CMD_STARTED; + batch_scan_notify_threshold, + Bind(&storage_config_cb, cb)); + return; } -/******************************************************************************* - * - * Function BTM_BleEnableBatchScan - * - * Description This function is called to configure and enable batch - * scanning - * - * Parameters: scan_mode -Batch scan mode - * scan_interval - Scan interval value - * scan_window - Scan window value - * discard_rule - Data discard rule - * ref_value - Reference value - * - * Returns tBTM_STATUS - * - ******************************************************************************/ -tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode, - uint32_t scan_interval, uint32_t scan_window, - tBLE_ADDR_TYPE addr_type, - tBTM_BLE_DISCARD_RULE discard_rule, - tBTM_BLE_REF_VALUE ref_value) { - tBTM_BLE_VSC_CB cmn_ble_vsc_cb; - BTM_TRACE_EVENT(" BTM_BleEnableBatchScan: %d, %d, %d, %d, %d, %d", scan_mode, - scan_interval, scan_window, addr_type, discard_rule, - ref_value); - - if (!controller_get_interface()->supports_ble()) return BTM_ILLEGAL_VALUE; - - BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - - if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) { - BTM_TRACE_ERROR("Controller does not support batch scan"); - return BTM_ERR_PROCESSING; +/* This function is called to configure and enable batch scanning */ +void BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode, + uint32_t scan_interval, uint32_t scan_window, + tBLE_ADDR_TYPE addr_type, + tBTM_BLE_DISCARD_RULE discard_rule, + Callback<void(uint8_t /* status */)> cb) { + BTM_TRACE_EVENT("%s: %d, %d, %d, %d, %d, %d", __func__, scan_mode, + scan_interval, scan_window, addr_type, discard_rule); + + if (!can_do_batch_scan()) { + cb.Run(BTM_ERR_PROCESSING); + return; } - BTM_TRACE_DEBUG("BTM_BleEnableBatchScan: %d, %x, %x, %d, %d", scan_mode, - scan_interval, scan_window, discard_rule, - ble_batchscan_cb.cur_state); + BTM_TRACE_DEBUG("%s: %d, %x, %x, %d, %d", __func__, scan_mode, scan_interval, + scan_window, discard_rule, ble_batchscan_cb.cur_state); /* Only 16 bits will be used for scan interval and scan window as per * agreement with Google */ @@ -694,91 +437,56 @@ tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode, BTM_BLE_BATCH_SCAN_MODE_PASS_ACTI == scan_mode) && (BTM_BLE_DISCARD_OLD_ITEMS == discard_rule || BTM_BLE_DISCARD_LOWER_RSSI_ITEMS == discard_rule)) { - if (BTM_BLE_SCAN_INVALID_STATE == ble_batchscan_cb.cur_state || - BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state || - BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state) { - btm_ble_enable_disable_batchscan(true); - btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE, - BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value); - } - - ble_batchscan_cb.scan_mode = scan_mode; - ble_batchscan_cb.scan_interval = scan_interval; - ble_batchscan_cb.scan_window = scan_window; - ble_batchscan_cb.addr_type = addr_type; - ble_batchscan_cb.discard_rule = discard_rule; - /* This command starts batch scanning, if enabled */ - btm_ble_set_batchscan_param(scan_mode, scan_interval, scan_window, - addr_type, discard_rule); - - /* The user needs to be provided scan enable event */ - btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_PARAMS, - ble_batchscan_cb.cur_state, - BTM_BLE_BATCH_SCAN_ENABLE_EVT, ref_value); } else { - BTM_TRACE_ERROR("Illegal enable scan params"); - return BTM_ILLEGAL_VALUE; + BTM_TRACE_ERROR("%s: Illegal enable scan params", __func__); + cb.Run(BTM_ILLEGAL_VALUE); + return; } - return BTM_CMD_STARTED; -} -/******************************************************************************* - * - * Function BTM_BleDisableBatchScan - * - * Description This function is called to disable batch scanning - * - * Parameters: ref_value - Reference value - * - ******************************************************************************/ -tBTM_STATUS BTM_BleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value) { - tBTM_BLE_VSC_CB cmn_ble_vsc_cb; - BTM_TRACE_EVENT(" BTM_BleDisableBatchScan"); + if (BTM_BLE_SCAN_INVALID_STATE == ble_batchscan_cb.cur_state || + BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state || + BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state) { + btm_ble_enable_batchscan(Bind(&feat_enable_cb)); + ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLE_CALLED; + } - if (!controller_get_interface()->supports_ble()) return BTM_ILLEGAL_VALUE; + ble_batchscan_cb.scan_mode = scan_mode; + ble_batchscan_cb.scan_interval = scan_interval; + ble_batchscan_cb.scan_window = scan_window; + ble_batchscan_cb.addr_type = addr_type; + ble_batchscan_cb.discard_rule = discard_rule; + /* This command starts batch scanning, if enabled */ + btm_ble_set_batchscan_param(scan_mode, scan_interval, scan_window, addr_type, + discard_rule, Bind(¶m_enable_cb, cb)); +} - BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); +/* This function is called to disable batch scanning */ +void BTM_BleDisableBatchScan(base::Callback<void(uint8_t /* status */)> cb) { + BTM_TRACE_EVENT(" BTM_BleDisableBatchScan"); - if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) { - BTM_TRACE_ERROR("Controller does not support batch scan"); - return BTM_ERR_PROCESSING; + if (!can_do_batch_scan()) { + cb.Run(BTM_ERR_PROCESSING); + return; } - btm_ble_enable_disable_batchscan(false); - /* The user needs to be provided scan disable event */ - btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_PARAMS, - BTM_BLE_SCAN_DISABLE_CALLED, - BTM_BLE_BATCH_SCAN_DISABLE_EVT, ref_value); - return BTM_CMD_STARTED; + btm_ble_set_batchscan_param( + BTM_BLE_BATCH_SCAN_MODE_DISABLE, ble_batchscan_cb.scan_interval, + ble_batchscan_cb.scan_window, ble_batchscan_cb.addr_type, + ble_batchscan_cb.discard_rule, Bind(&disable_cb, cb)); + ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLE_CALLED; } -/******************************************************************************* - * - * Function BTM_BleReadScanReports - * - * Description This function is called to start reading batch scan reports - * - * Parameters: scan_mode - Batch scan mode - * ref_value - Reference value - * - * Returns tBTM_STATUS - * - ******************************************************************************/ -tBTM_STATUS BTM_BleReadScanReports(tBTM_BLE_BATCH_SCAN_MODE scan_mode, - tBTM_BLE_REF_VALUE ref_value) { - tBTM_STATUS status = BTM_NO_RESOURCES; - tBTM_BLE_VSC_CB cmn_ble_vsc_cb; +/* This function is called to start reading batch scan reports */ +void BTM_BleReadScanReports(tBTM_BLE_BATCH_SCAN_MODE scan_mode, + tBTM_BLE_SCAN_REP_CBACK cb) { uint8_t read_scan_mode = 0; - BTM_TRACE_EVENT(" BTM_BleReadScanReports; %d, %d", scan_mode, ref_value); + BTM_TRACE_EVENT("%s; %d", __func__, scan_mode); - if (!controller_get_interface()->supports_ble()) return BTM_ILLEGAL_VALUE; - - BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); - - if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) { + if (!can_do_batch_scan()) { BTM_TRACE_ERROR("Controller does not support batch scan"); - return BTM_ERR_PROCESSING; + cb.Run(BTM_ERR_PROCESSING, 0, 0, {}); + return; } /* Check if the requested scan mode has already been setup by the user */ @@ -788,63 +496,44 @@ tBTM_STATUS BTM_BleReadScanReports(tBTM_BLE_BATCH_SCAN_MODE scan_mode, /* Check only for modes, as scan reports can be called after disabling batch * scan */ - if (read_scan_mode > 0 && (BTM_BLE_BATCH_SCAN_MODE_PASS == scan_mode || - BTM_BLE_BATCH_SCAN_MODE_ACTI == scan_mode)) { - status = btm_ble_batchscan_enq_rep_q(scan_mode, ref_value); - if (BTM_SUCCESS == status) { - btm_ble_read_batchscan_reports(scan_mode, ref_value); - status = BTM_CMD_STARTED; - } - } else { + if (read_scan_mode < 0 || (scan_mode != BTM_BLE_BATCH_SCAN_MODE_PASS && + scan_mode != BTM_BLE_BATCH_SCAN_MODE_ACTI)) { BTM_TRACE_ERROR("Illegal read scan params: %d, %d, %d", read_scan_mode, scan_mode, ble_batchscan_cb.cur_state); - return BTM_ILLEGAL_VALUE; + cb.Run(BTM_ILLEGAL_VALUE, 0, 0, {}); + return; } - return status; + + btm_ble_read_batchscan_reports( + scan_mode, base::Bind(&read_reports_cb, std::vector<uint8_t>(), 0, cb)); + return; } -/******************************************************************************* - * - * Function BTM_BleTrackAdvertiser - * - * Description This function is called to setup the callback for tracking - * advertisers - * - * Parameters: p_track_cback - Tracking callback pointer - * ref_value - Reference value - * - * Returns tBTM_STATUS - * - ******************************************************************************/ -tBTM_STATUS BTM_BleTrackAdvertiser(tBTM_BLE_TRACK_ADV_CBACK* p_track_cback, - tBTM_BLE_REF_VALUE ref_value) { - tBTM_BLE_VSC_CB cmn_ble_vsc_cb; - BTM_TRACE_EVENT(" BTM_BleTrackAdvertiser"); - if (!controller_get_interface()->supports_ble()) return BTM_ILLEGAL_VALUE; +/* This function is called to setup the callback for tracking */ +void BTM_BleTrackAdvertiser(tBTM_BLE_TRACK_ADV_CBACK* p_track_cback, + tBTM_BLE_REF_VALUE ref_value) { + BTM_TRACE_EVENT("%s:", __func__); - BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); + if (!can_do_batch_scan()) { + BTM_TRACE_ERROR("Controller does not support batch scan"); - if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) { - BTM_TRACE_ERROR("Controller does not support scan storage"); - return BTM_ERR_PROCESSING; + tBTM_BLE_TRACK_ADV_DATA track_adv_data; + memset(&track_adv_data, 0, sizeof(tBTM_BLE_TRACK_ADV_DATA)); + track_adv_data.advertiser_info_present = + NO_ADV_INFO_PRESENT; /* Indicates failure */ + track_adv_data.client_if = (uint8_t)ref_value; + p_track_cback(&track_adv_data); + return; } ble_advtrack_cb.p_track_cback = p_track_cback; ble_advtrack_cb.ref_value = ref_value; - return BTM_CMD_STARTED; + return; } -/******************************************************************************* - * - * Function btm_ble_batchscan_init - * - * Description This function initialize the batch scan control block. - * - * Parameters None - * - * Returns status - * - ******************************************************************************/ +/** + * This function initialize the batch scan control block. + **/ void btm_ble_batchscan_init(void) { BTM_TRACE_EVENT(" btm_ble_batchscan_init"); memset(&ble_batchscan_cb, 0, sizeof(tBTM_BLE_BATCH_SCAN_CB)); @@ -852,23 +541,11 @@ void btm_ble_batchscan_init(void) { BTM_RegisterForVSEvents(btm_ble_batchscan_filter_track_adv_vse_cback, true); } -/******************************************************************************* - * - * Function btm_ble_batchscan_cleanup - * - * Description This function cleans the batch scan control block. - * - * Parameters None - * - * Returns void - * - ******************************************************************************/ +/** + * This function cleans the batch scan control block. + **/ void btm_ble_batchscan_cleanup(void) { - int index = 0; - BTM_TRACE_EVENT(" btm_ble_batchscan_cleanup"); - - for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++) - osi_free_and_reset((void**)&ble_batchscan_cb.main_rep_q.p_data[index]); + BTM_TRACE_EVENT("%s", __func__); memset(&ble_batchscan_cb, 0, sizeof(tBTM_BLE_BATCH_SCAN_CB)); memset(&ble_advtrack_cb, 0, sizeof(tBTM_BLE_ADV_TRACK_CB)); diff --git a/system/stack/include/btm_ble_api.h b/system/stack/include/btm_ble_api.h index d7c8b79640cca9391f5ce6e7f13ef370a44a1523..3b16318819d679e300b89b27ff498b25b6f933fe 100644 --- a/system/stack/include/btm_ble_api.h +++ b/system/stack/include/btm_ble_api.h @@ -32,8 +32,6 @@ #include "btm_ble_api_types.h" #include "osi/include/alarm.h" -tBTM_BLE_SCAN_SETUP_CBACK bta_ble_scan_setup_cb; - /***************************************************************************** * EXTERNAL FUNCTION DECLARATIONS ****************************************************************************/ @@ -147,83 +145,36 @@ extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB* p_cmn_vsc_cb); uint8_t batch_scan_trunc_max - Batch scan truncated value maximum uint8_t batch_scan_notify_threshold - Threshold value - tBTM_BLE_SCAN_SETUP_CBACK *p_setup_cback - Setup callback + cb - Setup callback tBTM_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback -Threshold callback void *p_ref - Reference value * - * Returns tBTM_STATUS * ******************************************************************************/ -extern tBTM_STATUS BTM_BleSetStorageConfig( +extern void BTM_BleSetStorageConfig( uint8_t batch_scan_full_max, uint8_t batch_scan_trunc_max, uint8_t batch_scan_notify_threshold, - tBTM_BLE_SCAN_SETUP_CBACK* p_setup_cback, - tBTM_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback, - tBTM_BLE_SCAN_REP_CBACK* p_cback, tBTM_BLE_REF_VALUE ref_value); - -/******************************************************************************* - * - * Function BTM_BleEnableBatchScan - * - * Description This function is called to enable batch scan - * - * Parameters tBTM_BLE_BATCH_SCAN_MODE scan_mode - Batch scan mode - uint32_t scan_interval -Scan interval - uint32_t scan_window - Scan window value - tBLE_ADDR_TYPE addr_type - Address type - tBTM_BLE_DISCARD_RULE discard_rule - Data discard rules - * - * Returns tBTM_STATUS - * - ******************************************************************************/ -extern tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode, - uint32_t scan_interval, - uint32_t scan_window, - tBTM_BLE_DISCARD_RULE discard_rule, - tBLE_ADDR_TYPE addr_type, - tBTM_BLE_REF_VALUE ref_value); - -/******************************************************************************* - * - * Function BTM_BleDisableBatchScan - * - * Description This function is called to disable batch scanning - * - * Parameters void - * - ******************************************************************************/ -extern tBTM_STATUS BTM_BleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value); - -/******************************************************************************* - * - * Function BTM_BleReadScanReports - * - * Description This function is called to read batch scan reports - * - * Parameters tBLE_SCAN_MODE scan_mode - Scan mode report to be read out - tBTM_BLE_SCAN_REP_CBACK* p_cback - Reports callback - * - * Returns tBTM_STATUS - * - ******************************************************************************/ -extern tBTM_STATUS BTM_BleReadScanReports(tBLE_SCAN_MODE scan_mode, - tBTM_BLE_REF_VALUE ref_value); - -/******************************************************************************* - * - * Function BTM_BleTrackAdvertiser - * - * Description This function is called to read batch scan reports - * - * Parameters p_track_cback - Tracking callback - * ref_value - Reference value - * - * Returns tBTM_STATUS - * - ******************************************************************************/ -extern tBTM_STATUS BTM_BleTrackAdvertiser( - tBTM_BLE_TRACK_ADV_CBACK* p_track_cback, tBTM_BLE_REF_VALUE ref_value); + base::Callback<void(uint8_t /* status */)> cb, + tBTM_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback, tBTM_BLE_REF_VALUE ref_value); + +/* This function is called to enable batch scan */ +extern void BTM_BleEnableBatchScan( + tBTM_BLE_BATCH_SCAN_MODE scan_mode, uint32_t scan_interval, + uint32_t scan_window, tBTM_BLE_DISCARD_RULE discard_rule, + tBLE_ADDR_TYPE addr_type, base::Callback<void(uint8_t /* status */)> cb); + +/* This function is called to disable batch scanning */ +extern void BTM_BleDisableBatchScan( + base::Callback<void(uint8_t /* status */)> cb); + +/* This function is called to read batch scan reports */ +extern void BTM_BleReadScanReports(tBLE_SCAN_MODE scan_mode, + tBTM_BLE_SCAN_REP_CBACK cb); + +/* This function is called to setup the callback for tracking */ +extern void BTM_BleTrackAdvertiser(tBTM_BLE_TRACK_ADV_CBACK* p_track_cback, + tBTM_BLE_REF_VALUE ref_value); /******************************************************************************* * diff --git a/system/stack/include/btm_ble_api_types.h b/system/stack/include/btm_ble_api_types.h index f295aae86f08967cb5f5f784a6d1f5ce9ca61385..9b20ad2bc29038884de7af33ce6a401b9bd3a11b 100644 --- a/system/stack/include/btm_ble_api_types.h +++ b/system/stack/include/btm_ble_api_types.h @@ -365,13 +365,9 @@ typedef void(tBTM_BLE_ADV_DATA_CMPL_CBACK)(tBTM_STATUS status); typedef uint8_t tGATT_IF; typedef void(tBTM_BLE_SCAN_THRESHOLD_CBACK)(tBTM_BLE_REF_VALUE ref_value); -typedef void(tBTM_BLE_SCAN_REP_CBACK)(tBTM_BLE_REF_VALUE ref_value, - uint8_t report_format, - uint8_t num_records, uint16_t total_len, - uint8_t* p_rep_data, uint8_t status); -typedef void(tBTM_BLE_SCAN_SETUP_CBACK)(uint8_t evt, - tBTM_BLE_REF_VALUE ref_value, - uint8_t status); +using tBTM_BLE_SCAN_REP_CBACK = + base::Callback<void(uint8_t /* status */, uint8_t /* report_format */, + uint8_t /* num_reports */, std::vector<uint8_t>)>; #ifndef BTM_BLE_BATCH_SCAN_MAX #define BTM_BLE_BATCH_SCAN_MAX 5 @@ -392,24 +388,6 @@ typedef enum { enum { BTM_BLE_DISCARD_OLD_ITEMS, BTM_BLE_DISCARD_LOWER_RSSI_ITEMS }; typedef uint8_t tBTM_BLE_DISCARD_RULE; -typedef struct { - uint8_t sub_code[BTM_BLE_BATCH_SCAN_MAX]; - tBTM_BLE_BATCH_SCAN_STATE cur_state[BTM_BLE_BATCH_SCAN_MAX]; - tBTM_BLE_REF_VALUE ref_value[BTM_BLE_BATCH_SCAN_MAX]; - uint8_t pending_idx; - uint8_t next_idx; -} tBTM_BLE_BATCH_SCAN_OPQ; - -typedef struct { - uint8_t rep_mode[BTM_BLE_BATCH_REP_MAIN_Q_SIZE]; - tBTM_BLE_REF_VALUE ref_value[BTM_BLE_BATCH_REP_MAIN_Q_SIZE]; - uint8_t num_records[BTM_BLE_BATCH_REP_MAIN_Q_SIZE]; - uint16_t data_len[BTM_BLE_BATCH_REP_MAIN_Q_SIZE]; - uint8_t* p_data[BTM_BLE_BATCH_REP_MAIN_Q_SIZE]; - uint8_t pending_idx; - uint8_t next_idx; -} tBTM_BLE_BATCH_SCAN_REP_Q; - typedef struct { tBTM_BLE_BATCH_SCAN_STATE cur_state; tBTM_BLE_BATCH_SCAN_MODE scan_mode; @@ -417,11 +395,7 @@ typedef struct { uint32_t scan_window; tBLE_ADDR_TYPE addr_type; tBTM_BLE_DISCARD_RULE discard_rule; - tBTM_BLE_BATCH_SCAN_OPQ op_q; - tBTM_BLE_BATCH_SCAN_REP_Q main_rep_q; - tBTM_BLE_SCAN_SETUP_CBACK* p_setup_cback; tBTM_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback; - tBTM_BLE_SCAN_REP_CBACK* p_scan_rep_cback; tBTM_BLE_REF_VALUE ref_value; } tBTM_BLE_BATCH_SCAN_CB; @@ -549,13 +523,6 @@ enum { BTM_BLE_TRACK_ADV_ADD, BTM_BLE_TRACK_ADV_REMOVE }; typedef uint8_t tBTM_BLE_TRACK_ADV_ACTION; -#define BTM_BLE_BATCH_SCAN_ENABLE_EVT 1 -#define BTM_BLE_BATCH_SCAN_CFG_STRG_EVT 2 -#define BTM_BLE_BATCH_SCAN_READ_REPTS_EVT 3 -#define BTM_BLE_BATCH_SCAN_THR_EVT 4 -#define BTM_BLE_BATCH_SCAN_PARAM_EVT 5 -#define BTM_BLE_BATCH_SCAN_DISABLE_EVT 6 - typedef uint8_t tBTM_BLE_BATCH_SCAN_EVT; typedef uint32_t tBTM_BLE_TX_TIME_MS;