LE Onfound and Onlost feature
BTIF and stack layer changes for onfound/onlost feature
DO NOT MERGE
Change-Id: Id52cdd5855ca8c0ff276b42613b51c4cd3882bfc
diff --git a/bta/dm/bta_dm_act.c b/bta/dm/bta_dm_act.c
index 762dfde..9012dc6 100644
--- a/bta/dm/bta_dm_act.c
+++ b/bta/dm/bta_dm_act.c
@@ -5427,6 +5427,21 @@
/*******************************************************************************
**
+** 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)
+{
+ BTM_BleTrackAdvertiser(p_data->ble_track_advert.p_track_adv_cback,
+ p_data->ble_track_advert.ref_value);
+}
+
+/*******************************************************************************
+**
** Function bta_ble_scan_setup_cb
**
** Description Handle the setup callback from BTM layer and forward it to app layer
diff --git a/bta/dm/bta_dm_api.c b/bta/dm/bta_dm_api.c
index 3c3602c..f80fda8 100644
--- a/bta/dm/bta_dm_api.c
+++ b/bta/dm/bta_dm_api.c
@@ -1707,6 +1707,33 @@
/*******************************************************************************
**
+** 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
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleTrackAdvertiser(tBTA_DM_BLE_REF_VALUE ref_value,
+ tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback)
+{
+ tBTA_DM_API_TRACK_ADVERTISER *p_msg;
+
+ if ((p_msg = (tBTA_DM_API_TRACK_ADVERTISER *)
+ GKI_getbuf(sizeof(tBTA_DM_API_TRACK_ADVERTISER))) != NULL)
+ {
+ 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);
+ }
+}
+
+/*******************************************************************************
+**
** Function BTA_DmBleBroadcast
**
** Description This function starts or stops LE broadcasting.
@@ -2308,7 +2335,7 @@
**
** Description This function is called to enable the adv data payload filter
**
-** Parameters action - enable or disable the APCF feature
+** Parameters action - enable or disable the APCF feature
** p_cmpl_cback - Command completed callback
** ref_value - Reference value
**
diff --git a/bta/dm/bta_dm_int.h b/bta/dm/bta_dm_int.h
index 0b8cde6..a1b935b 100644
--- a/bta/dm/bta_dm_int.h
+++ b/bta/dm/bta_dm_int.h
@@ -637,10 +637,8 @@
typedef struct
{
BT_HDR hdr;
- UINT8 track_adv_action;
- tBLE_ADDR_TYPE addr_type;
- tBLE_BD_ADDR *p_bda;
- UINT8 onlost_timeout;
+ tBTA_DM_BLE_REF_VALUE ref_value;
+ tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback;
} tBTA_DM_API_TRACK_ADVERTISER;
#endif /* BLE_INCLUDED */
@@ -914,7 +912,9 @@
BOOLEAN is_bta_dm_active;
tBTA_DM_ACTIVE_LINK device_list;
tBTA_DM_SEC_CBACK *p_sec_cback;
+#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
tBTA_BLE_SCAN_SETUP_CBACK *p_setup_cback;
+#endif
tBTA_DM_BLE_PF_CFG_CBACK *p_scan_filt_cfg_cback;
tBTA_DM_BLE_PF_STATUS_CBACK *p_scan_filt_status_cback;
tBTA_DM_BLE_PF_PARAM_CBACK *p_scan_filt_param_cback;
@@ -1197,6 +1197,8 @@
extern void bta_dm_ble_enable_batch_scan(tBTA_DM_MSG * p_data);
extern void bta_dm_ble_disable_batch_scan(tBTA_DM_MSG * p_data);
extern void bta_dm_ble_read_scan_reports(tBTA_DM_MSG * p_data);
+extern void bta_dm_ble_track_advertiser(tBTA_DM_MSG * p_data);
+
#endif
extern void bta_dm_set_encryption(tBTA_DM_MSG *p_data);
extern void bta_dm_confirm(tBTA_DM_MSG *p_data);
diff --git a/bta/dm/bta_dm_main.c b/bta/dm/bta_dm_main.c
index df5001d..d378744 100644
--- a/bta/dm/bta_dm_main.c
+++ b/bta/dm/bta_dm_main.c
@@ -117,6 +117,7 @@
bta_dm_ble_enable_batch_scan, /* BTA_DM_API_BLE_ENABLE_BATCH_SCAN_EVT */
bta_dm_ble_disable_batch_scan, /* BTA_DM_API_BLE_DISABLE_BATCH_SCAN_EVT */
bta_dm_ble_read_scan_reports, /* BTA_DM_API_BLE_READ_SCAN_REPORTS_EVT */
+ bta_dm_ble_track_advertiser, /* BTA_DM_API_BLE_TRACK_ADVERTISER_EVT */
#endif
#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
diff --git a/bta/include/bta_api.h b/bta/include/bta_api.h
index 6773838..0653d01 100644
--- a/bta/include/bta_api.h
+++ b/bta/include/bta_api.h
@@ -1132,9 +1132,16 @@
typedef void (tBTA_BLE_SCAN_REP_CBACK) (tBTA_DM_BLE_REF_VALUE ref_value, UINT8 report_format,
UINT8 num_records, UINT16 data_len,
UINT8* p_rep_data, tBTA_STATUS status);
+
typedef void (tBTA_BLE_SCAN_SETUP_CBACK) (tBTA_BLE_BATCH_SCAN_EVT evt, tBTA_DM_BLE_REF_VALUE ref_value,
tBTA_STATUS status);
+typedef void (tBTA_BLE_TRACK_ADV_CMPL_CBACK)(int action, tBTA_STATUS status,
+ tBTA_DM_BLE_PF_AVBL_SPACE avbl_space, tBTA_DM_BLE_REF_VALUE ref_value);
+
+typedef void (tBTA_BLE_TRACK_ADV_CBACK)(int filt_index, tBLE_ADDR_TYPE addr_type, BD_ADDR bda,
+ int adv_state, tBTA_DM_BLE_REF_VALUE ref_value);
+
#else
typedef UINT8 tBTA_DM_BLE_SEC_ACT;
#endif
@@ -2323,7 +2330,7 @@
** p_setup_cback - Setup callback
** p_thres_cback - Threshold callback
** p_rep_cback - Reports callback
-** p_ref - Ref pointer
+** ref_value - Reference value
**
** Returns None
**
@@ -2347,6 +2354,7 @@
** scan_window - Scan window
** discard_rule -Discard rules
** addr_type - Address type
+** ref_value - Reference value
**
** Returns None
**
@@ -2364,6 +2372,7 @@
** Description This function is called to read the batch scan reports
**
** Parameters scan_mode -Batch scan mode
+** ref_value - Reference value
**
** Returns None
**
@@ -2377,7 +2386,7 @@
**
** Description This function is called to disable the batch scanning
**
-** Parameters None
+** Parameters ref_value - Reference value
**
** Returns None
**
@@ -2390,7 +2399,9 @@
**
** Description This function is called to enable the adv data payload filter
**
-** Parameters action -1: enable the filter condition, 0 - disables the filter condition
+** Parameters action - enable or disable the APCF feature
+** p_cmpl_cback - Command completed callback
+** ref_value - Reference value
**
** Returns void
**
@@ -2405,8 +2416,12 @@
**
** Description This function is called to setup the filter params
**
-** Parameters action: to read/write/clear
-** filt_index - filter index
+** Parameters p_target: enable the filter condition on a target device; if NULL
+** filt_index - Filter index
+** p_filt_params -Filter parameters
+** ref_value - Reference value
+** action - Add, delete or clear
+** p_cmpl_back - Command completed callback
**
** Returns void
**
@@ -2426,10 +2441,11 @@
** condition.
**
** Parameters action: to read/write/clear
-** cond_type: filter condition type.
-** filt_index - filter index
+** cond_type: filter condition type
+** filt_index - Filter index
** p_cond: filter condition parameter
-** ref_value: Reference
+** p_cmpl_back - Command completed callback
+** ref_value - Reference value
**
** Returns void
**
@@ -2441,6 +2457,22 @@
tBTA_DM_BLE_PF_CFG_CBACK *p_cmpl_cback,
tBTA_DM_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
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleTrackAdvertiser(tBTA_DM_BLE_REF_VALUE ref_value,
+ tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback);
+
#endif
#ifdef __cplusplus
diff --git a/bta/include/bta_gatt_api.h b/bta/include/bta_gatt_api.h
index 8e70dae..9e75eef 100644
--- a/bta/include/bta_gatt_api.h
+++ b/bta/include/bta_gatt_api.h
@@ -135,15 +135,16 @@
#define BTA_GATTC_MULT_ADV_DATA_EVT 22 /* Multi ADV data event */
#define BTA_GATTC_MULT_ADV_DIS_EVT 23 /* Disable Multi ADV event */
#define BTA_GATTC_CONGEST_EVT 24 /* Congestion event */
-#define BTA_GATTC_BTH_SCAN_ENB_EVT 24 /* Enable batch scan event */
-#define BTA_GATTC_BTH_SCAN_CFG_EVT 25 /* Config storage event */
-#define BTA_GATTC_BTH_SCAN_RD_EVT 26 /* Batch scan reports read event */
-#define BTA_GATTC_BTH_SCAN_THR_EVT 27 /* Batch scan threshold event */
-#define BTA_GATTC_BTH_SCAN_PARAM_EVT 28 /* Batch scan param event */
-#define BTA_GATTC_BTH_SCAN_DIS_EVT 29 /* Disable batch scan event */
-#define BTA_GATTC_SCAN_FLT_CFG_EVT 30 /* Scan filter config event */
-#define BTA_GATTC_SCAN_FLT_PARAM_EVT 31 /* Param filter event */
-#define BTA_GATTC_SCAN_FLT_STATUS_EVT 32 /* Filter status event */
+#define BTA_GATTC_BTH_SCAN_ENB_EVT 25 /* Enable batch scan event */
+#define BTA_GATTC_BTH_SCAN_CFG_EVT 26 /* Config storage event */
+#define BTA_GATTC_BTH_SCAN_RD_EVT 27 /* Batch scan reports read event */
+#define BTA_GATTC_BTH_SCAN_THR_EVT 28 /* Batch scan threshold event */
+#define BTA_GATTC_BTH_SCAN_PARAM_EVT 29 /* Batch scan param event */
+#define BTA_GATTC_BTH_SCAN_DIS_EVT 30 /* Disable batch scan event */
+#define BTA_GATTC_SCAN_FLT_CFG_EVT 31 /* Scan filter config event */
+#define BTA_GATTC_SCAN_FLT_PARAM_EVT 32 /* Param filter event */
+#define BTA_GATTC_SCAN_FLT_STATUS_EVT 33 /* Filter status event */
+#define BTA_GATTC_ADV_VSC_EVT 34 /* ADV VSC event */
typedef UINT8 tBTA_GATTC_EVT;
diff --git a/btif/src/btif_gatt_client.c b/btif/src/btif_gatt_client.c
index 21e64e1..f4ad664 100644
--- a/btif/src/btif_gatt_client.c
+++ b/btif/src/btif_gatt_client.c
@@ -131,6 +131,12 @@
{
uint8_t status;
uint8_t client_if;
+ uint8_t filt_index;
+ uint8_t adv_state;
+ uint8_t action;
+ uint8_t avbl_space;
+ uint8_t lost_timeout;
+ bt_bdaddr_t bd_addr;
uint8_t batch_scan_full_max;
uint8_t batch_scan_trunc_max;
uint8_t batch_scan_notify_threshold;
@@ -732,7 +738,7 @@
btgatt_adv_filter_cb_t *p_data = (btgatt_adv_filter_cb_t*) p_param;
BTIF_TRACE_DEBUG("BTA_GATTC_SCAN_FLT_PARAM_EVT: %d, %d, %d, %d",p_data->client_if,
p_data->action, p_data->avbl_space, p_data->status);
- HAL_CBACK(bt_gatt_callbacks, client->scan_filter_param_cb
+ HAL_CBACK(bt_gatt_callbacks, client->scan_filter_param_cb
, p_data->action, p_data->client_if, p_data->status
, p_data->avbl_space);
break;
@@ -743,11 +749,20 @@
btgatt_adv_filter_cb_t *p_data = (btgatt_adv_filter_cb_t*) p_param;
BTIF_TRACE_DEBUG("BTA_GATTC_SCAN_FLT_STATUS_EVT: %d, %d, %d",p_data->client_if,
p_data->action, p_data->status);
- HAL_CBACK(bt_gatt_callbacks, client->scan_filter_status_cb
+ HAL_CBACK(bt_gatt_callbacks, client->scan_filter_status_cb
, p_data->action, p_data->client_if, p_data->status);
break;
}
+ case BTA_GATTC_ADV_VSC_EVT:
+ {
+ btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*)p_param;
+ HAL_CBACK(bt_gatt_callbacks, client->track_adv_event_cb
+ ,p_data->client_if, p_data->filt_index, p_data->addr_type, &p_data->bd_addr
+ ,p_data->adv_state);
+ break;
+ }
+
default:
ALOGE("%s: Unhandled event (%d)!", __FUNCTION__, event);
break;
@@ -955,6 +970,21 @@
(char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
}
+static void bta_track_adv_event_cb(int filt_index, tBLE_ADDR_TYPE addr_type, BD_ADDR bda,
+ int adv_state, tBTA_DM_BLE_REF_VALUE ref_value)
+{
+ btgatt_batch_track_cb_t btif_scan_track_cb;
+ BTIF_TRACE_DEBUG("%s :%d, %d, %d, %d",
+ __FUNCTION__,filt_index, addr_type, adv_state, ref_value);
+ btif_scan_track_cb.filt_index = filt_index;
+ btif_scan_track_cb.addr_type = addr_type;
+ memcpy(btif_scan_track_cb.bd_addr.address, bda, sizeof(BD_ADDR));
+ btif_scan_track_cb.client_if = ref_value;
+ btif_scan_track_cb.adv_state = adv_state;
+ btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_ADV_VSC_EVT,
+ (char*) &btif_scan_track_cb, sizeof(btgatt_batch_track_cb_t), NULL);
+}
+
static void btm_read_rssi_cb (tBTM_RSSI_RESULTS *p_result)
{
btif_gattc_cb_t btif_cb;
@@ -1322,6 +1352,8 @@
{
if(NULL == p_adv_filt_cb)
return;
+ if(1 == p_adv_filt_cb->adv_filt_param.dely_mode)
+ BTA_DmBleTrackAdvertiser(p_adv_filt_cb->client_if, bta_track_adv_event_cb);
BTA_DmBleScanFilterSetup(p_adv_filt_cb->action, p_adv_filt_cb->filt_index,
&p_adv_filt_cb->adv_filt_param, NULL, bta_scan_filt_param_setup_cb,
p_adv_filt_cb->client_if);
diff --git a/stack/btm/btm_ble_batchscan.c b/stack/btm/btm_ble_batchscan.c
index 015284f..41150be 100644
--- a/stack/btm/btm_ble_batchscan.c
+++ b/stack/btm/btm_ble_batchscan.c
@@ -30,6 +30,7 @@
#if (BLE_INCLUDED == TRUE && BLE_BATCH_SCAN_INCLUDED == TRUE)
tBTM_BLE_BATCH_SCAN_CB ble_batchscan_cb;
+tBTM_BLE_ADV_TRACK_CB ble_advtrack_cb;
/* length of each batch scan command */
@@ -41,6 +42,8 @@
#define BTM_BLE_BATCH_SCAN_CB_EVT_MASK 0xF0
#define BTM_BLE_BATCH_SCAN_SUBCODE_MASK 0x0F
+#define BTM_BLE_TRACK_ADV_CMD_LEN 9
+
/*******************************************************************************
** Local functions
*******************************************************************************/
@@ -56,9 +59,8 @@
*******************************************************************************/
void btm_ble_batchscan_filter_track_adv_vse_cback(UINT8 len, UINT8 *p)
{
- UINT8 sub_event;
- UINT8 reason;
-
+ UINT8 sub_event = 0, filt_index = 0, addr_type = 0, adv_state = 0;
+ BD_ADDR bd_addr;
STREAM_TO_UINT8(sub_event, p);
BTM_TRACE_EVENT("btm_ble_batchscan_filter_track_adv_vse_cback called with event:%x", sub_event);
@@ -66,6 +68,21 @@
NULL != ble_batchscan_cb.p_thres_cback)
{
ble_batchscan_cb.p_thres_cback(ble_batchscan_cb.ref_value);
+ return;
+ }
+
+ if (HCI_VSE_SUBCODE_BLE_TRACKING_SUB_EVT == sub_event && NULL != ble_advtrack_cb.p_track_cback)
+ {
+ if(len < 10)
+ return;
+ STREAM_TO_UINT8(filt_index, p);
+ STREAM_TO_UINT8(addr_type, p);
+ STREAM_TO_BDADDR(bd_addr, p);
+ STREAM_TO_UINT8(adv_state, p);
+ BTM_TRACE_EVENT("track_adv_vse_cback called: %d, %d, %d", filt_index, addr_type, adv_state);
+ ble_advtrack_cb.p_track_cback(filt_index, addr_type, bd_addr, adv_state,
+ ble_advtrack_cb.ref_value);
+ return;
}
}
@@ -636,6 +653,39 @@
/*******************************************************************************
**
+** 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 (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+ 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 scan storage");
+ return BTM_ERR_PROCESSING;
+ }
+
+ ble_advtrack_cb.p_track_cback = p_track_cback;
+ ble_advtrack_cb.ref_value = ref_value;
+ return BTM_SUCCESS;
+}
+
+/*******************************************************************************
+**
** Function btm_ble_batchscan_init
**
** Description This function initialize the batch scan control block.
@@ -649,6 +699,7 @@
{
BTM_TRACE_EVENT (" btm_ble_batchscan_init");
memset(&ble_batchscan_cb, 0, sizeof(tBTM_BLE_BATCH_SCAN_CB));
+ memset(&ble_advtrack_cb, 0, sizeof(tBTM_BLE_ADV_TRACK_CB));
BTM_RegisterForVSEvents(btm_ble_batchscan_filter_track_adv_vse_cback, TRUE);
}
diff --git a/stack/include/btm_ble_api.h b/stack/include/btm_ble_api.h
index ed23344..731fce9 100644
--- a/stack/include/btm_ble_api.h
+++ b/stack/include/btm_ble_api.h
@@ -675,6 +675,17 @@
};
typedef UINT8 tBTM_BLE_DISCARD_RULE;
+typedef void (tBTM_BLE_TRACK_ADV_CBACK)(int filt_index, tBLE_ADDR_TYPE addr_type, BD_ADDR bda,
+ int adv_state, tBTM_BLE_REF_VALUE ref_value);
+
+typedef UINT8 tBTM_BLE_TRACK_ADV_EVT;
+
+typedef struct
+{
+ tBTM_BLE_REF_VALUE ref_value;
+ tBTM_BLE_TRACK_ADV_CBACK *p_track_cback;
+}tBTM_BLE_ADV_TRACK_CB;
+
enum
{
BTM_BLE_TRACK_ADV_ADD,
@@ -694,7 +705,6 @@
typedef UINT8 tBTM_BLE_BATCH_SCAN_EVT;
-
typedef BOOLEAN (tBTM_BLE_SEL_CBACK)(BD_ADDR random_bda, UINT8 *p_remote_name);
typedef void (tBTM_BLE_CTRL_FEATURES_CBACK)(tBTM_STATUS status);
@@ -915,16 +925,14 @@
**
** Description This function is called to read batch scan reports
**
-** Parameters track_adv_action - Track advertiser action
- addr_type - address type
- p_bda - BD address
- onlost_timeout - Timeout for onlost event
+** Parameters p_track_cback - Tracking callback
+** ref_value - Reference value
**
** Returns tBTM_STATUS
**
*******************************************************************************/
-BTM_API extern tBTM_STATUS BTM_BleTrackAdvertiser(tBTM_BLE_TRACK_ADV_ACTION track_adv_action,
- tBLE_BD_ADDR *p_bda, UINT8 onlost_timeout);
+BTM_API extern tBTM_STATUS BTM_BleTrackAdvertiser(tBTM_BLE_TRACK_ADV_CBACK *p_track_cback,
+ tBTM_BLE_REF_VALUE ref_value);
/*******************************************************************************
**