From e815660824a0bf50ef0570de39307f58b23f39df Mon Sep 17 00:00:00 2001 From: Yulong Date: Tue, 19 Sep 2017 04:50:26 -0400 Subject: [PATCH 1/2] component/bt: Fixed the bug of mutiple read can not callback. --- components/bt/bluedroid/api/include/esp_gattc_api.h | 1 + components/bt/bluedroid/bta/gatt/bta_gattc_act.c | 6 ++++-- components/bt/bluedroid/bta/gatt/bta_gattc_api.c | 2 +- components/bt/bluedroid/bta/include/bta_gatt_api.h | 1 + components/bt/bluedroid/bta/include/bta_gattc_int.h | 1 + components/bt/bluedroid/btc/profile/std/gatt/btc_gattc.c | 5 +++++ 6 files changed, 13 insertions(+), 3 deletions(-) diff --git a/components/bt/bluedroid/api/include/esp_gattc_api.h b/components/bt/bluedroid/api/include/esp_gattc_api.h index ba5cfffac0..b72466b82c 100644 --- a/components/bt/bluedroid/api/include/esp_gattc_api.h +++ b/components/bt/bluedroid/api/include/esp_gattc_api.h @@ -63,6 +63,7 @@ typedef enum { ESP_GATTC_UNREG_FOR_NOTIFY_EVT = 39, /*!< When unregister for notification of a service completes, the event comes */ ESP_GATTC_CONNECT_EVT = 40, /*!< When the ble physical connection is set up, the event comes */ ESP_GATTC_DISCONNECT_EVT = 41, /*!< When the ble physical connection disconnected, the event comes */ + ESP_GATTC_READ_MUTIPLE_EVT = 42, /*!< When the ble characteristic or descriptor mutiple complete, the event comes */ } esp_gattc_cb_event_t; diff --git a/components/bt/bluedroid/bta/gatt/bta_gattc_act.c b/components/bt/bluedroid/bta/gatt/bta_gattc_act.c index 159baa0632..dcd6d0fd63 100644 --- a/components/bt/bluedroid/bta/gatt/bta_gattc_act.c +++ b/components/bt/bluedroid/bta/gatt/bta_gattc_act.c @@ -83,7 +83,8 @@ static UINT16 bta_gattc_opcode_to_int_evt[] = { BTA_GATTC_API_READ_EVT, BTA_GATTC_API_WRITE_EVT, BTA_GATTC_API_EXEC_EVT, - BTA_GATTC_API_CFG_MTU_EVT + BTA_GATTC_API_CFG_MTU_EVT, + BTA_GATTC_API_READ_MULTI_EVT }; #if (BT_TRACE_VERBOSE == TRUE) @@ -1347,7 +1348,8 @@ void bta_gattc_op_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) APPL_TRACE_ERROR("No pending command"); return; } - if (p_clcb->p_q_cmd->hdr.event != bta_gattc_opcode_to_int_evt[op - GATTC_OPTYPE_READ]) { + if (p_clcb->p_q_cmd->hdr.event != bta_gattc_opcode_to_int_evt[op - GATTC_OPTYPE_READ] || + p_clcb->p_q_cmd->hdr.event != BTA_GATTC_API_READ_MULTI_EVT) { mapped_op = p_clcb->p_q_cmd->hdr.event - BTA_GATTC_API_READ_EVT + GATTC_OPTYPE_READ; if ( mapped_op > GATTC_OPTYPE_INDICATION) { mapped_op = 0; diff --git a/components/bt/bluedroid/bta/gatt/bta_gattc_api.c b/components/bt/bluedroid/bta/gatt/bta_gattc_api.c index 802310b901..1a674ca0d6 100644 --- a/components/bt/bluedroid/bta/gatt/bta_gattc_api.c +++ b/components/bt/bluedroid/bta/gatt/bta_gattc_api.c @@ -545,7 +545,7 @@ void BTA_GATTC_ReadMultiple(UINT16 conn_id, tBTA_GATTC_MULTI *p_read_multi, p_buf->hdr.layer_specific = conn_id; p_buf->auth_req = auth_req; p_buf->num_attr = p_read_multi->num_attr; - + p_buf->cmpl_evt = BTA_GATTC_READ_MUTIPLE_EVT; if (p_buf->num_attr > 0) { memcpy(p_buf->handles, p_read_multi->handles, sizeof(UINT16) * p_read_multi->num_attr); } diff --git a/components/bt/bluedroid/bta/include/bta_gatt_api.h b/components/bt/bluedroid/bta/include/bta_gatt_api.h index d81fa547e0..35fb42d71a 100644 --- a/components/bt/bluedroid/bta/include/bta_gatt_api.h +++ b/components/bt/bluedroid/bta/include/bta_gatt_api.h @@ -181,6 +181,7 @@ typedef UINT8 tBTA_GATT_STATUS; #define BTA_GATTC_ADV_VSC_EVT 34 /* ADV VSC event */ #define BTA_GATTC_CONNECT_EVT 35 /* GATTC CONNECT event */ #define BTA_GATTC_DISCONNECT_EVT 36 /* GATTC DISCONNECT event */ +#define BTA_GATTC_READ_MUTIPLE_EVT 37 /* GATTC Read mutiple event */ typedef UINT8 tBTA_GATTC_EVT; diff --git a/components/bt/bluedroid/bta/include/bta_gattc_int.h b/components/bt/bluedroid/bta/include/bta_gattc_int.h index 2515cb5225..701b3b58c1 100644 --- a/components/bt/bluedroid/bta/include/bta_gattc_int.h +++ b/components/bt/bluedroid/bta/include/bta_gattc_int.h @@ -165,6 +165,7 @@ typedef struct { tBTA_GATT_AUTH_REQ auth_req; UINT8 num_attr; UINT16 handles[GATT_MAX_READ_MULTI_HANDLES]; + tBTA_GATTC_EVT cmpl_evt; }tBTA_GATTC_API_READ_MULTI; typedef struct { diff --git a/components/bt/bluedroid/btc/profile/std/gatt/btc_gattc.c b/components/bt/bluedroid/btc/profile/std/gatt/btc_gattc.c index 37f17fcca2..26f9ecc748 100644 --- a/components/bt/bluedroid/btc/profile/std/gatt/btc_gattc.c +++ b/components/bt/bluedroid/btc/profile/std/gatt/btc_gattc.c @@ -806,6 +806,11 @@ void btc_gattc_cb_handler(btc_msg_t *msg) btc_gattc_cb_to_app(ESP_GATTC_READ_DESCR_EVT, gattc_if, ¶m); break; } + case BTA_GATTC_READ_MUTIPLE_EVT: { + set_read_value(&gattc_if, ¶m, &arg->read); + btc_gattc_cb_to_app(ESP_GATTC_READ_MUTIPLE_EVT, gattc_if, ¶m); + break; + } case BTA_GATTC_WRITE_DESCR_EVT: { tBTA_GATTC_WRITE *write = &arg->write; From f325ba39423abc3a808f220c07fb7a273abe4736 Mon Sep 17 00:00:00 2001 From: Yulong Date: Wed, 20 Sep 2017 04:28:52 -0400 Subject: [PATCH 2/2] component/bt: Change the cmpl_evt command in the bta_gattc_read_cmpl function. --- .../bt/bluedroid/bta/gatt/bta_gattc_act.c | 33 +++++++++++-------- .../btc/profile/std/gatt/btc_gattc.c | 6 ++-- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/components/bt/bluedroid/bta/gatt/bta_gattc_act.c b/components/bt/bluedroid/bta/gatt/bta_gattc_act.c index dcd6d0fd63..25814059bc 100644 --- a/components/bt/bluedroid/bta/gatt/bta_gattc_act.c +++ b/components/bt/bluedroid/bta/gatt/bta_gattc_act.c @@ -1226,8 +1226,12 @@ void bta_gattc_read_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_OP_CMPL *p_data) } else { cb_data.read.handle = p_clcb->p_q_cmd->api_read.handle; } - - event = p_clcb->p_q_cmd->api_read.cmpl_evt; + + if (p_clcb->p_q_cmd->hdr.event != BTA_GATTC_API_READ_MULTI_EVT) { + event = p_clcb->p_q_cmd->api_read.cmpl_evt; + } else { + event = p_clcb->p_q_cmd->api_read_multi.cmpl_evt; + } cb_data.read.conn_id = p_clcb->bta_conn_id; osi_free(p_clcb->p_q_cmd); p_clcb->p_q_cmd = NULL; @@ -1348,22 +1352,23 @@ void bta_gattc_op_cmpl(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data) APPL_TRACE_ERROR("No pending command"); return; } - if (p_clcb->p_q_cmd->hdr.event != bta_gattc_opcode_to_int_evt[op - GATTC_OPTYPE_READ] || - p_clcb->p_q_cmd->hdr.event != BTA_GATTC_API_READ_MULTI_EVT) { - mapped_op = p_clcb->p_q_cmd->hdr.event - BTA_GATTC_API_READ_EVT + GATTC_OPTYPE_READ; - if ( mapped_op > GATTC_OPTYPE_INDICATION) { - mapped_op = 0; - } + if (p_clcb->p_q_cmd->hdr.event != bta_gattc_opcode_to_int_evt[op - GATTC_OPTYPE_READ]) { + if (p_clcb->p_q_cmd->hdr.event != BTA_GATTC_API_READ_MULTI_EVT) { + mapped_op = p_clcb->p_q_cmd->hdr.event - BTA_GATTC_API_READ_EVT + GATTC_OPTYPE_READ; + if ( mapped_op > GATTC_OPTYPE_INDICATION) { + mapped_op = 0; + } #if (BT_TRACE_VERBOSE == TRUE) - APPL_TRACE_ERROR("expect op:(%s :0x%04x), receive unexpected operation (%s).", - bta_gattc_op_code_name[mapped_op] , p_clcb->p_q_cmd->hdr.event, - bta_gattc_op_code_name[op]); + APPL_TRACE_ERROR("expect op:(%s :0x%04x), receive unexpected operation (%s).", + bta_gattc_op_code_name[mapped_op] , p_clcb->p_q_cmd->hdr.event, + bta_gattc_op_code_name[op]); #else - APPL_TRACE_ERROR("expect op:(%u :0x%04x), receive unexpected operation (%u).", - mapped_op , p_clcb->p_q_cmd->hdr.event, op); + APPL_TRACE_ERROR("expect op:(%u :0x%04x), receive unexpected operation (%u).", + mapped_op , p_clcb->p_q_cmd->hdr.event, op); #endif - return; + return; + } } /* discard responses if service change indication is received before operation completed */ diff --git a/components/bt/bluedroid/btc/profile/std/gatt/btc_gattc.c b/components/bt/bluedroid/btc/profile/std/gatt/btc_gattc.c index 26f9ecc748..a19526f88a 100644 --- a/components/bt/bluedroid/btc/profile/std/gatt/btc_gattc.c +++ b/components/bt/bluedroid/btc/profile/std/gatt/btc_gattc.c @@ -128,7 +128,8 @@ static void btc_gattc_copy_req_data(btc_msg_t *msg, void *p_dest, void *p_src) // Allocate buffer for request data if necessary switch (msg->act) { case BTA_GATTC_READ_DESCR_EVT: - case BTA_GATTC_READ_CHAR_EVT: { + case BTA_GATTC_READ_CHAR_EVT: + case BTA_GATTC_READ_MUTIPLE_EVT: { if (p_src_data->read.p_value && p_src_data->read.p_value->p_value) { p_dest_data->read.p_value = (tBTA_GATT_UNFMT *)osi_malloc(sizeof(tBTA_GATT_UNFMT) + p_src_data->read.p_value->len); p_dest_data->read.p_value->p_value = (uint8_t *)(p_dest_data->read.p_value + 1); @@ -151,7 +152,8 @@ static void btc_gattc_free_req_data(btc_msg_t *msg) tBTA_GATTC *arg = (tBTA_GATTC *)(msg->arg); switch (msg->act) { case BTA_GATTC_READ_DESCR_EVT: - case BTA_GATTC_READ_CHAR_EVT: { + case BTA_GATTC_READ_CHAR_EVT: + case BTA_GATTC_READ_MUTIPLE_EVT: { if (arg->read.p_value) { osi_free(arg->read.p_value); }