Browse Source

Component/bt: add api to clean gattc cache

zhiweijian 7 years ago
parent
commit
d5e78e79d3

+ 15 - 0
components/bt/bluedroid/api/esp_gattc_api.c

@@ -591,6 +591,21 @@ esp_err_t esp_ble_gattc_cache_refresh(esp_bd_addr_t remote_bda)
     return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
 }
 
+esp_err_t esp_ble_gattc_cache_clean(esp_bd_addr_t remote_bda)
+{
+    btc_msg_t msg;
+    btc_ble_gattc_args_t arg;
+
+    ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
+
+    msg.sig = BTC_SIG_API_CALL;
+    msg.pid = BTC_PID_GATTC;
+    msg.act = BTC_GATTC_ACT_CACHE_CLEAN;
+    memcpy(arg.cache_clean.remote_bda, remote_bda, sizeof(esp_bd_addr_t));
+
+    return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gattc_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
+}
+
 esp_err_t esp_ble_gattc_cache_assoc(esp_gatt_if_t gattc_if, esp_bd_addr_t src_addr, esp_bd_addr_t assoc_addr, bool is_assoc)
 {
     btc_msg_t msg;

+ 24 - 6
components/bt/bluedroid/api/include/api/esp_gattc_api.h

@@ -67,6 +67,7 @@ typedef enum {
     ESP_GATTC_QUEUE_FULL_EVT          = 43,       /*!< When the gattc command queue full, the event comes */
     ESP_GATTC_SET_ASSOC_EVT           = 44,       /*!< When the ble gattc set the associated address complete, the event comes */
     ESP_GATTC_GET_ADDR_LIST_EVT       = 45,       /*!< When the ble get gattc address list in cache finish, the event comes */
+    ESP_GATTC_DIS_SRVC_CMPL_EVT       = 46,       /*!< When the ble discover service complete, the event comes */
 } esp_gattc_cb_event_t;
 
 
@@ -243,6 +244,14 @@ typedef union {
         bool     is_full;              /*!< The gattc command queue is full or not */
     } queue_full;                      /*!< Gatt client callback param of ESP_GATTC_QUEUE_FULL_EVT */
 
+    /**
+     * @brief ESP_GATTC_DIS_SRVC_CMPL_EVT
+     */
+    struct gattc_dis_srvc_cmpl_evt_param {
+        esp_gatt_status_t status;      /*!< Operation status */
+        uint16_t conn_id;              /*!< Connection id */
+    } dis_srvc_cmpl;                   /*!< Gatt client callback param of ESP_GATTC_DIS_SRVC_CMPL_EVT */
+
 } esp_ble_gattc_cb_param_t;             /*!< GATT client callback parameter union type */
 
 /**
@@ -348,10 +357,8 @@ esp_err_t esp_ble_gattc_send_mtu_req (esp_gatt_if_t gattc_if, uint16_t conn_id);
 
 /**
  * @brief           This function is called to get service from local cache. 
- *                  If it does not exist, request a GATT service discovery
- *                  on a GATT server. This function report service search result
- *                  by a callback event, and followed by a service search complete
- *                  event.
+ *                  This function report service search result by a callback 
+ *                  event, and followed by a service search complete event.
  *
  * @param[in]       gattc_if: Gatt client access interface.
  * @param[in]       conn_id: connection ID.
@@ -792,7 +799,8 @@ esp_err_t esp_ble_gattc_unregister_for_notify (esp_gatt_if_t gattc_if,
 
 
 /**
-* @brief           Refresh the server cache store in the gattc stack of the remote device
+* @brief           Refresh the server cache store in the gattc stack of the remote device. If
+*                  the device is connected, this API will restart the discovery of service information of the remote device
 *
 * @param[in]       remote_bda: remote device BD address.
 *
@@ -836,7 +844,17 @@ esp_err_t esp_ble_gattc_cache_assoc(esp_gatt_if_t gattc_if, esp_bd_addr_t src_ad
 */
 esp_err_t esp_ble_gattc_cache_get_addr_list(esp_gatt_if_t gattc_if);
 
-
+/**
+* @brief           Clean the service cache of this device in the gattc stack, 
+*
+* @param[in]       remote_bda: remote device BD address.
+*
+* @return
+*                  - ESP_OK: success
+*                  - other: failed
+*
+*/
+esp_err_t esp_ble_gattc_cache_clean(esp_bd_addr_t remote_bda);
 
 #ifdef __cplusplus
 }

+ 31 - 1
components/bt/bluedroid/bta/gatt/bta_gattc_act.c

@@ -980,6 +980,11 @@ void bta_gattc_start_discover(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
             if (p_clcb->status != BTA_GATT_OK) {
                 APPL_TRACE_ERROR("discovery on server failed");
                 bta_gattc_reset_discover_st(p_clcb->p_srcb, p_clcb->status);
+                //discover service complete, trigger callback
+                tBTA_GATTC cb_data;
+                cb_data.dis_cmpl.status  = p_clcb->status;
+                cb_data.dis_cmpl.conn_id = p_clcb->bta_conn_id;
+                ( *p_clcb->p_rcb->p_cback)(BTA_GATTC_DIS_SRVC_CMPL_EVT,  &cb_data);
             } else {
                 p_clcb->disc_active = TRUE;
             }
@@ -1725,7 +1730,10 @@ void bta_gattc_process_api_refresh(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg)
                 }
             }
             if (found) {
-                bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
+                // If the device is discovering services, return
+                if(p_clcb->state == BTA_GATTC_CONN_ST) {
+                    bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
+                }
                 return;
             }
         }
@@ -1815,6 +1823,28 @@ void bta_gattc_process_api_cache_get_addr_list(tBTA_GATTC_CB *p_cb, tBTA_GATTC_D
     }
 
 }
+
+/*******************************************************************************
+**
+** Function         bta_gattc_process_api_cache_clean
+**
+** Description      process cache clean API to delete cache
+**
+** Returns          None.
+**
+*******************************************************************************/
+void bta_gattc_process_api_cache_clean(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg)
+{
+    tBTA_GATTC_SERV *p_srvc_cb = bta_gattc_find_srvr_cache(p_msg->api_conn.remote_bda);
+    UNUSED(p_cb);
+
+    if (p_srvc_cb != NULL && p_srvc_cb->p_srvc_cache != NULL) {
+        //mark it and delete the cache */
+        list_free(p_srvc_cb->p_srvc_cache);
+        p_srvc_cb->p_srvc_cache = NULL;
+    }
+}
+
 /*******************************************************************************
 **
 ** Function         bta_gattc_process_srvc_chg_ind

+ 28 - 0
components/bt/bluedroid/bta/gatt/bta_gattc_api.c

@@ -974,6 +974,34 @@ void BTA_GATTC_CacheGetAddrList(tBTA_GATTC_IF client_if)
     return;
 }
 
+/*******************************************************************************
+**
+** Function         BTA_GATTC_Clean
+**
+** Description      Clean the server cache of the remote device
+**
+** Parameters       remote_bda: remote device BD address.
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTA_GATTC_Clean(BD_ADDR remote_bda)
+{
+#if(GATTC_CACHE_NVS == TRUE)
+    /* used to reset cache in application */
+    bta_gattc_cache_reset(remote_bda);
+#endif
+
+    tBTA_GATTC_API_OPEN  *p_buf;
+
+    if ((p_buf = (tBTA_GATTC_API_OPEN *) osi_malloc(sizeof(tBTA_GATTC_API_OPEN))) != NULL) {
+        p_buf->hdr.event = BTA_GATTC_API_CACHE_CLEAN_EVT;
+        memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
+
+        bta_sys_sendmsg(p_buf);
+    }
+    return;
+}
 /*******************************************************************************
 **
 ** Function         BTA_GATTC_Listen

+ 5 - 0
components/bt/bluedroid/bta/gatt/bta_gattc_cache.c

@@ -617,6 +617,11 @@ static void bta_gattc_explore_srvc(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb)
     if (p_clcb->transport == BTA_TRANSPORT_LE) {
         L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, TRUE);
     }
+    //discover service complete, trigger callback
+    tBTA_GATTC cb_data;
+    cb_data.dis_cmpl.status  = p_clcb->status;
+    cb_data.dis_cmpl.conn_id = conn_id;
+    ( *p_clcb->p_rcb->p_cback)(BTA_GATTC_DIS_SRVC_CMPL_EVT,  &cb_data);
 #endif
 #if(GATTC_CACHE_NVS == TRUE)
     /* save cache to NV */

+ 9 - 0
components/bt/bluedroid/bta/gatt/bta_gattc_main.c

@@ -126,6 +126,7 @@ static const UINT8 bta_gattc_st_idle[][BTA_GATTC_NUM_COLS] = {
     /* BTA_GATTC_API_CONFIRM_EVT        */   {BTA_GATTC_FAIL,              BTA_GATTC_IDLE_ST},
     /* BTA_GATTC_API_READ_MULTI_EVT     */   {BTA_GATTC_FAIL,              BTA_GATTC_IDLE_ST},
     /* BTA_GATTC_API_REFRESH_EVT        */   {BTA_GATTC_IGNORE,            BTA_GATTC_IDLE_ST},
+    /* BTA_GATTC_API_CACHE_CLEAN_EVT    */   {BTA_GATTC_IGNORE,            BTA_GATTC_IDLE_ST},
 
     /* BTA_GATTC_INT_CONN_EVT           */   {BTA_GATTC_CONN,              BTA_GATTC_CONN_ST},
     /* BTA_GATTC_INT_DISCOVER_EVT       */   {BTA_GATTC_IGNORE,            BTA_GATTC_IDLE_ST},
@@ -154,6 +155,7 @@ static const UINT8 bta_gattc_st_w4_conn[][BTA_GATTC_NUM_COLS] = {
     /* BTA_GATTC_API_CONFIRM_EVT        */   {BTA_GATTC_FAIL,               BTA_GATTC_W4_CONN_ST},
     /* BTA_GATTC_API_READ_MULTI_EVT     */   {BTA_GATTC_FAIL,               BTA_GATTC_W4_CONN_ST},
     /* BTA_GATTC_API_REFRESH_EVT        */   {BTA_GATTC_IGNORE,             BTA_GATTC_W4_CONN_ST},
+    /* BTA_GATTC_API_CACHE_CLEAN_EVT    */   {BTA_GATTC_IGNORE,             BTA_GATTC_W4_CONN_ST},
 
     /* BTA_GATTC_INT_CONN_EVT           */   {BTA_GATTC_CONN,               BTA_GATTC_CONN_ST},
     /* BTA_GATTC_INT_DISCOVER_EVT       */   {BTA_GATTC_IGNORE,             BTA_GATTC_W4_CONN_ST},
@@ -182,6 +184,7 @@ static const UINT8 bta_gattc_st_connected[][BTA_GATTC_NUM_COLS] = {
     /* BTA_GATTC_API_CONFIRM_EVT        */   {BTA_GATTC_CONFIRM,            BTA_GATTC_CONN_ST},
     /* BTA_GATTC_API_READ_MULTI_EVT     */   {BTA_GATTC_READ_MULTI,         BTA_GATTC_CONN_ST},
     /* BTA_GATTC_API_REFRESH_EVT        */   {BTA_GATTC_IGNORE,             BTA_GATTC_CONN_ST},
+    /* BTA_GATTC_API_CACHE_CLEAN_EVT    */   {BTA_GATTC_IGNORE,             BTA_GATTC_CONN_ST},
 
     /* BTA_GATTC_INT_CONN_EVT           */   {BTA_GATTC_CONN,               BTA_GATTC_CONN_ST},
     /* BTA_GATTC_INT_DISCOVER_EVT       */   {BTA_GATTC_START_DISCOVER,     BTA_GATTC_DISCOVER_ST},
@@ -211,6 +214,7 @@ static const UINT8 bta_gattc_st_discover[][BTA_GATTC_NUM_COLS] = {
     /* BTA_GATTC_API_CONFIRM_EVT        */   {BTA_GATTC_CONFIRM,            BTA_GATTC_DISCOVER_ST},
     /* BTA_GATTC_API_READ_MULTI_EVT     */   {BTA_GATTC_Q_CMD,              BTA_GATTC_DISCOVER_ST},
     /* BTA_GATTC_API_REFRESH_EVT        */   {BTA_GATTC_IGNORE,             BTA_GATTC_DISCOVER_ST},
+    /* BTA_GATTC_API_CACHE_CLEAN_EVT    */   {BTA_GATTC_IGNORE,             BTA_GATTC_DISCOVER_ST},
 
     /* BTA_GATTC_INT_CONN_EVT           */   {BTA_GATTC_CONN,               BTA_GATTC_DISCOVER_ST},
     /* BTA_GATTC_INT_DISCOVER_EVT       */   {BTA_GATTC_RESTART_DISCOVER,   BTA_GATTC_DISCOVER_ST},
@@ -362,6 +366,9 @@ BOOLEAN bta_gattc_hdl_event(BT_HDR *p_msg)
     case BTA_GATTC_API_CACHE_GET_ADDR_LIST_EVT:
         bta_gattc_process_api_cache_get_addr_list(p_cb, (tBTA_GATTC_DATA *)p_msg);
         break;
+    case BTA_GATTC_API_CACHE_CLEAN_EVT:
+        bta_gattc_process_api_cache_clean(p_cb, (tBTA_GATTC_DATA *) p_msg);
+        break;
 #if BLE_INCLUDED == TRUE
     case BTA_GATTC_API_LISTEN_EVT:
         bta_gattc_listen(p_cb, (tBTA_GATTC_DATA *) p_msg);
@@ -464,6 +471,8 @@ static char *gattc_evt_code(tBTA_GATTC_INT_EVT evt_code)
         return "BTA_GATTC_API_DEREG_EVT";
     case BTA_GATTC_API_REFRESH_EVT:
         return "BTA_GATTC_API_REFRESH_EVT";
+    case BTA_GATTC_API_CACHE_CLEAN_EVT:
+        return "BTA_GATTC_API_CACHE_CLEAN_EVT";
     case BTA_GATTC_API_LISTEN_EVT:
         return "BTA_GATTC_API_LISTEN_EVT";
     case BTA_GATTC_API_DISABLE_EVT:

+ 2 - 0
components/bt/bluedroid/bta/gatt/include/bta_gattc_int.h

@@ -52,6 +52,7 @@ enum {
     BTA_GATTC_API_CONFIRM_EVT,
     BTA_GATTC_API_READ_MULTI_EVT,
     BTA_GATTC_API_REFRESH_EVT,
+    BTA_GATTC_API_CACHE_CLEAN_EVT,
 
     BTA_GATTC_INT_CONN_EVT,
     BTA_GATTC_INT_DISCOVER_EVT,
@@ -470,6 +471,7 @@ extern void bta_gattc_send_connect_cback( tBTA_GATTC_RCB *p_clreg, BD_ADDR remot
 extern void bta_gattc_send_disconnect_cback( tBTA_GATTC_RCB *p_clreg, tGATT_DISCONN_REASON reason,
                                 BD_ADDR remote_bda, UINT16 conn_id);
 extern void bta_gattc_process_api_refresh(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg);
+extern void bta_gattc_process_api_cache_clean(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg);
 extern void bta_gattc_process_api_cache_assoc(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg);
 extern void bta_gattc_process_api_cache_get_addr_list(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA *p_msg);
 extern void bta_gattc_cfg_mtu(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data);

+ 20 - 2
components/bt/bluedroid/bta/include/bta/bta_gatt_api.h

@@ -185,6 +185,7 @@ typedef UINT8 tBTA_GATT_STATUS;
 #define BTA_GATTC_QUEUE_FULL_EVT        38 /* GATTC queue full event */
 #define BTA_GATTC_ASSOC_EVT             39 /* GATTC association address event */
 #define BTA_GATTC_GET_ADDR_LIST_EVT     40 /* GATTC get address list in the cache event */
+#define BTA_GATTC_DIS_SRVC_CMPL_EVT     41 /* GATTC discover service complete */
 
 typedef UINT8 tBTA_GATTC_EVT;
 
@@ -318,6 +319,11 @@ typedef struct {
     UINT8               searched_service_source;
 } tBTA_GATTC_SEARCH_CMPL;
 
+typedef struct {
+    UINT16              conn_id;
+    tBTA_GATT_STATUS    status;
+}tBTA_GATTC_DIS_CMPL;
+
 typedef struct {
     UINT16              conn_id;
     UINT16              start_handle;
@@ -413,8 +419,8 @@ typedef struct {
 
 typedef union {
     tBTA_GATT_STATUS        status;
-
-    tBTA_GATTC_SEARCH_CMPL  search_cmpl;    /* discovery complete */
+    tBTA_GATTC_DIS_CMPL     dis_cmpl;    /* discovery complete */
+    tBTA_GATTC_SEARCH_CMPL  search_cmpl;    /* search complete */
     tBTA_GATTC_SRVC_RES     srvc_res;       /* discovery result */
     tBTA_GATTC_REG          reg_oper;       /* registration data */
     tBTA_GATTC_OPEN         open;
@@ -1118,6 +1124,18 @@ extern void BTA_GATTC_CacheAssoc(tBTA_GATTC_IF client_if, BD_ADDR src_addr, BD_A
 
 extern void BTA_GATTC_CacheGetAddrList(tBTA_GATTC_IF client_if);
 
+/*******************************************************************************
+**
+** Function         BTA_GATTC_Clean
+**
+** Description      Clean the server cache of the remote device
+**
+** Parameters       remote_bda: remote device BD address.
+**
+** Returns          void
+**
+*******************************************************************************/
+extern void BTA_GATTC_Clean(BD_ADDR remote_bda);
 
 /*******************************************************************************
 **

+ 9 - 0
components/bt/bluedroid/btc/profile/std/gatt/btc_gattc.c

@@ -757,6 +757,9 @@ void btc_gattc_call_handler(btc_msg_t *msg)
     case BTC_GATTC_ATC_CACHE_GET_ADDR_LIST:
         BTA_GATTC_CacheGetAddrList(arg->get_addr_list.gattc_if);
         break;
+    case BTC_GATTC_ACT_CACHE_CLEAN:
+        BTA_GATTC_Clean(arg->cache_clean.remote_bda);
+        break;
     default:
         BTC_TRACE_ERROR("%s: Unhandled event (%d)!\n", __FUNCTION__, msg->act);
         break;
@@ -980,6 +983,12 @@ void btc_gattc_cb_handler(btc_msg_t *msg)
         btc_gattc_cb_to_app(ESP_GATTC_GET_ADDR_LIST_EVT, gattc_if, &param);
         break;
     }
+    case BTA_GATTC_DIS_SRVC_CMPL_EVT:
+        gattc_if = BTC_GATT_GET_GATT_IF(arg->dis_cmpl.conn_id);
+        param.dis_srvc_cmpl.status = arg->dis_cmpl.status;
+        param.dis_srvc_cmpl.conn_id = BTC_GATT_GET_CONN_ID(arg->dis_cmpl.conn_id);
+        btc_gattc_cb_to_app(ESP_GATTC_DIS_SRVC_CMPL_EVT, gattc_if, &param);
+        break;
     default:
         BTC_TRACE_DEBUG("%s: Unhandled event (%d)!", __FUNCTION__, msg->act);
         break;

+ 5 - 0
components/bt/bluedroid/btc/profile/std/include/btc_gattc.h

@@ -40,6 +40,7 @@ typedef enum {
     BTC_GATTC_ACT_CACHE_REFRESH,
     BTC_GATTC_ACT_CACHE_ASSOC,
     BTC_GATTC_ATC_CACHE_GET_ADDR_LIST,
+    BTC_GATTC_ACT_CACHE_CLEAN,
 } btc_gattc_act_t;
 
 /* btc_ble_gattc_args_t */
@@ -180,6 +181,10 @@ typedef union {
     struct cache_get_addr_list_arg {
         esp_gatt_if_t gattc_if;
     }get_addr_list;
+    //BTC_GATTC_ACT_CACHE_CLEAN,
+    struct cache_clean_arg {
+        esp_bd_addr_t remote_bda;
+    } cache_clean;
 } btc_ble_gattc_args_t;
 
 void btc_gattc_call_handler(btc_msg_t *msg);

+ 8 - 1
examples/bluetooth/gatt_client/main/gattc_demo.c

@@ -126,12 +126,19 @@ static void gattc_profile_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
         }
         ESP_LOGI(GATTC_TAG, "open success");
         break;
+    case ESP_GATTC_DIS_SRVC_CMPL_EVT:
+        if (param->dis_srvc_cmpl.status != ESP_GATT_OK){
+            ESP_LOGE(GATTC_TAG, "discover service failed, status %d", param->dis_srvc_cmpl.status);
+            break;
+        }
+        ESP_LOGI(GATTC_TAG, "discover service complete conn_id %d", param->dis_srvc_cmpl.conn_id);
+        esp_ble_gattc_search_service(gattc_if, param->cfg_mtu.conn_id, &remote_filter_service_uuid);
+        break;
     case ESP_GATTC_CFG_MTU_EVT:
         if (param->cfg_mtu.status != ESP_GATT_OK){
             ESP_LOGE(GATTC_TAG,"config mtu failed, error status = %x", param->cfg_mtu.status);
         }
         ESP_LOGI(GATTC_TAG, "ESP_GATTC_CFG_MTU_EVT, Status %d, MTU %d, conn_id %d", param->cfg_mtu.status, param->cfg_mtu.mtu, param->cfg_mtu.conn_id);
-        esp_ble_gattc_search_service(gattc_if, param->cfg_mtu.conn_id, &remote_filter_service_uuid);
         break;
     case ESP_GATTC_SEARCH_RES_EVT: {
         ESP_LOGI(GATTC_TAG, "SEARCH RES: conn_id = %x is primary service %d", p_data->search_res.conn_id, p_data->search_res.is_primary);