]> granicus.if.org Git - esp-idf/commitdiff
component/bt: Added the prepare write check.
authorYulong <huangyulong@espressif.com>
Mon, 13 Nov 2017 07:12:33 +0000 (02:12 -0500)
committerYulong <huangyulong@espressif.com>
Mon, 13 Nov 2017 07:12:33 +0000 (02:12 -0500)
components/bt/bluedroid/bta/gatt/bta_gattc_utils.c

index fd6d8d78bff20a8e0c1c99073b355978866e296c..e589729c0a64bbd4aaed25e7cfff8087ca8f5b8a 100644 (file)
@@ -426,6 +426,25 @@ tBTA_GATTC_SERV *bta_gattc_srcb_alloc(BD_ADDR bda)
     }
     return p_tcb;
 }
+
+static void bta_gattc_remove_prepare_write_in_queue(tBTA_GATTC_CLCB *p_clcb)
+{
+    assert(p_clcb != NULL);
+
+    for(list_node_t *sn = list_begin(p_clcb->p_cmd_list);
+        sn != list_end(p_clcb->p_cmd_list); sn = list_next(sn)) {
+
+        tBTA_GATTC_DATA *cmd_data = (tBTA_GATTC_DATA *)list_node(sn);
+        if (cmd_data != NULL && ((cmd_data->hdr.event == BTA_GATTC_API_WRITE_EVT &&
+            cmd_data->api_write.write_type == BTA_GATTC_WRITE_PREPARE) ||
+            cmd_data->hdr.event == BTA_GATTC_API_EXEC_EVT)) {
+            // remove the prepare write command in the command queue
+            list_remove(p_clcb->p_cmd_list, (void *)cmd_data);
+        }
+    }
+
+    return;
+}
 /*******************************************************************************
 **
 ** Function         bta_gattc_enqueue
@@ -444,7 +463,7 @@ BOOLEAN bta_gattc_enqueue(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
     } else if (p_data->hdr.event == BTA_GATTC_API_WRITE_EVT &&
                p_data->api_write.write_type == BTA_GATTC_WRITE_PREPARE &&
                p_data->api_write.handle == p_clcb->p_q_cmd->api_write.handle) {
-        APPL_TRACE_ERROR("There is a prepare write command still pending.");
+        bta_gattc_remove_prepare_write_in_queue (p_clcb);
         tBTA_GATTC cb_data = {0};
         cb_data.write.status = BTA_GATT_CONGESTED;
         cb_data.write.handle = p_data->api_write.handle;
@@ -454,12 +473,12 @@ BOOLEAN bta_gattc_enqueue(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
         return FALSE;
     }
     else if (p_clcb->p_cmd_list) {
-               UINT16 len = 0;
-               tBTA_GATTC_DATA *cmd_data = NULL;
-               if (list_length(p_clcb->p_cmd_list) >= GATTC_COMMAND_QUEUE_SIZE_MAX) {
-            //APPL_TRACE_ERROR("%s(), the gattc command queue is full." __func__);
-                       return FALSE;
-               }
+        UINT16 len = 0;
+        tBTA_GATTC_DATA *cmd_data = NULL;
+        if (list_length(p_clcb->p_cmd_list) >= GATTC_COMMAND_QUEUE_SIZE_MAX) {
+            APPL_TRACE_ERROR("%s(), the gattc command queue is full.", __func__);
+            return FALSE;
+        }
 
         if (p_data->hdr.event == BTA_GATTC_API_WRITE_EVT) {
             len = p_data->api_write.len;
@@ -469,14 +488,16 @@ BOOLEAN bta_gattc_enqueue(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
                 cmd_data->api_write.p_value = (UINT8 *)(cmd_data + 1);
                            memcpy(cmd_data->api_write.p_value, p_data->api_write.p_value, len);
             } else {
-                APPL_TRACE_ERROR("%s(), alloc fail, no memery.", __func__);
+                APPL_TRACE_ERROR("%s(), line = %d, alloc fail, no memery.", __func__, __LINE__);
+                return FALSE;
             }
         } else {
             if ((cmd_data = (tBTA_GATTC_DATA *)osi_malloc(sizeof(tBTA_GATTC_DATA))) != NULL) {
                 memset(cmd_data, 0, sizeof(tBTA_GATTC_DATA));
                 memcpy(cmd_data, p_data, sizeof(tBTA_GATTC_DATA));
             } else {
-                APPL_TRACE_ERROR("%s(), alloc fail, no memery.", __func__);
+                APPL_TRACE_ERROR("%s(), line = %d, alloc fail, no memery.", __func__, __LINE__);
+                return FALSE;
             }
         }