uint16_t set_read_value(uint8_t *gattc_if, esp_ble_gattc_cb_param_t *p_dest, tBTA_GATTC_READ *p_src) { uint16_t descr_type = 0; uint16_t len = 0; p_dest->read.status = p_src->status; p_dest->read.conn_id = BTC_GATT_GET_CONN_ID(p_src->conn_id); *gattc_if = BTC_GATT_GET_GATT_IF(p_src->conn_id); bta_to_btc_srvc_id(&p_dest->read.srvc_id, &p_src->srvc_id); bta_to_btc_gatt_id(&p_dest->read.char_id, &p_src->char_id); bta_to_btc_gatt_id(&p_dest->read.descr_id, &p_src->descr_type); descr_type = get_uuid16(&p_src->descr_type.uuid); switch (descr_type) { case GATT_UUID_CHAR_AGG_FORMAT: /* not supported */ p_dest->read.value_type = GATTC_READ_VALUE_TYPE_AGG_FORMAT; p_dest->read.value_len = 0; break; default: if (( p_src->status == BTA_GATT_OK ) && (p_src->p_value != NULL)) { LOG_INFO("%s unformat.len = %d ", __FUNCTION__, p_src->p_value->unformat.len); p_dest->read.value_len = p_src->p_value->unformat.len; if ( p_src->p_value->unformat.len > 0 && p_src->p_value->unformat.p_value != NULL ) { p_dest->read.value = p_src->p_value->unformat.p_value; } len += p_src->p_value->unformat.len; } else { p_dest->read.value_len = 0; } p_dest->read.value_type = GATTC_READ_VALUE_TYPE_VALUE; break; } return len; }
void bta_to_btc_srvc_id(esp_gatt_srvc_id_t *p_dest, tBTA_GATT_SRVC_ID *p_src) { p_dest->is_primary = p_src->is_primary; bta_to_btc_gatt_id(&p_dest->id, &p_src->id); }
void btc_gattc_cb_handler(btc_msg_t *msg) { tBTA_GATTC *arg = (tBTA_GATTC *)(msg->arg); esp_gatt_if_t gattc_if = 0; esp_ble_gattc_cb_param_t param = {0}; memset(¶m, 0, sizeof(esp_ble_gattc_cb_param_t)); switch (msg->act) { case BTA_GATTC_REG_EVT: { tBTA_GATTC_REG *reg_oper = &arg->reg_oper; gattc_if = reg_oper->client_if; param.reg.status = reg_oper->status; param.reg.app_id = reg_oper->app_uuid.uu.uuid16; btc_gattc_cb_to_app(ESP_GATTC_REG_EVT, gattc_if, ¶m); break; } case BTA_GATTC_DEREG_EVT: { tBTA_GATTC_REG *reg_oper = &arg->reg_oper; gattc_if = reg_oper->client_if; btc_gattc_cb_to_app(ESP_GATTC_UNREG_EVT, gattc_if, NULL); break; } case BTA_GATTC_READ_CHAR_EVT: { set_read_value(&gattc_if, ¶m, &arg->read); btc_gattc_cb_to_app(ESP_GATTC_READ_CHAR_EVT, gattc_if, ¶m); break; } case BTA_GATTC_WRITE_CHAR_EVT: case BTA_GATTC_PREP_WRITE_EVT: { tBTA_GATTC_WRITE *write = &arg->write; uint32_t ret_evt = (msg->act == BTA_GATTC_WRITE_CHAR_EVT) ? ESP_GATTC_WRITE_CHAR_EVT : ESP_GATTC_PREP_WRITE_EVT; gattc_if = BTC_GATT_GET_GATT_IF(write->conn_id); param.write.conn_id = BTC_GATT_GET_CONN_ID(write->conn_id); param.write.status = write->status; param.write.handle = write->handle; param.write.offset = write->offset; btc_gattc_cb_to_app(ret_evt, gattc_if, ¶m); break; } case BTA_GATTC_EXEC_EVT: { tBTA_GATTC_EXEC_CMPL *exec_cmpl = &arg->exec_cmpl; gattc_if = BTC_GATT_GET_GATT_IF(exec_cmpl->conn_id); param.exec_cmpl.conn_id = BTC_GATT_GET_CONN_ID(exec_cmpl->conn_id); param.exec_cmpl.status = exec_cmpl->status; btc_gattc_cb_to_app(ESP_GATTC_EXEC_EVT, gattc_if, ¶m); break; } case BTA_GATTC_SEARCH_CMPL_EVT: { tBTA_GATTC_SEARCH_CMPL *search_cmpl = &arg->search_cmpl; gattc_if = BTC_GATT_GET_GATT_IF(search_cmpl->conn_id); param.search_cmpl.conn_id = BTC_GATT_GET_CONN_ID(search_cmpl->conn_id); param.search_cmpl.status = search_cmpl->status; param.search_cmpl.searched_service_source = search_cmpl->searched_service_source; btc_gattc_cb_to_app(ESP_GATTC_SEARCH_CMPL_EVT, gattc_if, ¶m); break; } case BTA_GATTC_SEARCH_RES_EVT: { tBTA_GATTC_SRVC_RES *srvc_res = &arg->srvc_res; gattc_if = BTC_GATT_GET_GATT_IF(srvc_res->conn_id); param.search_res.conn_id = BTC_GATT_GET_CONN_ID(srvc_res->conn_id); param.search_res.start_handle = srvc_res->start_handle; param.search_res.end_handle = srvc_res->end_handle; param.search_res.is_primary = srvc_res->is_primary; bta_to_btc_gatt_id(¶m.search_res.srvc_id, &srvc_res->service_uuid); btc_gattc_cb_to_app(ESP_GATTC_SEARCH_RES_EVT, gattc_if, ¶m); break; } case BTA_GATTC_READ_DESCR_EVT: { set_read_value(&gattc_if, ¶m, &arg->read); btc_gattc_cb_to_app(ESP_GATTC_READ_DESCR_EVT, gattc_if, ¶m); break; } case BTA_GATTC_READ_MULTIPLE_EVT: { set_read_value(&gattc_if, ¶m, &arg->read); btc_gattc_cb_to_app(ESP_GATTC_READ_MULTIPLE_EVT, gattc_if, ¶m); break; } case BTA_GATTC_WRITE_DESCR_EVT: { tBTA_GATTC_WRITE *write = &arg->write; gattc_if = BTC_GATT_GET_GATT_IF(write->conn_id); param.write.conn_id = BTC_GATT_GET_CONN_ID(write->conn_id); param.write.status = write->status; param.write.handle = write->handle; btc_gattc_cb_to_app(ESP_GATTC_WRITE_DESCR_EVT, gattc_if, ¶m); break; } case BTA_GATTC_NOTIF_EVT: { tBTA_GATTC_NOTIFY *notify = &arg->notify; gattc_if = BTC_GATT_GET_GATT_IF(notify->conn_id); param.notify.conn_id = BTC_GATT_GET_CONN_ID(notify->conn_id); memcpy(param.notify.remote_bda, notify->bda, sizeof(esp_bd_addr_t)); param.notify.handle = notify->handle; param.notify.is_notify = (notify->is_notify == TRUE) ? true : false; param.notify.value_len = (notify->len > ESP_GATT_MAX_ATTR_LEN) ? \ ESP_GATT_MAX_ATTR_LEN : notify->len; param.notify.value = notify->value; if (notify->is_notify == FALSE) { BTA_GATTC_SendIndConfirm(notify->conn_id, notify->handle); } btc_gattc_cb_to_app(ESP_GATTC_NOTIFY_EVT, gattc_if, ¶m); break; } case BTA_GATTC_OPEN_EVT: { tBTA_GATTC_OPEN *open = &arg->open; gattc_if = open->client_if; param.open.status = open->status; param.open.conn_id = BTC_GATT_GET_CONN_ID(open->conn_id); memcpy(param.open.remote_bda, open->remote_bda, sizeof(esp_bd_addr_t)); param.open.mtu = open->mtu; btc_gattc_cb_to_app(ESP_GATTC_OPEN_EVT, gattc_if, ¶m); break; } case BTA_GATTC_CONNECT_EVT: { tBTA_GATTC_CONNECT *connect = &arg->connect; gattc_if = connect->client_if; param.connect.conn_id = BTC_GATT_GET_CONN_ID(connect->conn_id); memcpy(param.connect.remote_bda, connect->remote_bda, sizeof(esp_bd_addr_t)); btc_gattc_cb_to_app(ESP_GATTC_CONNECT_EVT, gattc_if, ¶m); break; } case BTA_GATTC_CLOSE_EVT: { tBTA_GATTC_CLOSE *close = &arg->close; gattc_if = close->client_if; param.close.status = close->status; param.close.conn_id = BTC_GATT_GET_CONN_ID(close->conn_id); memcpy(param.close.remote_bda, close->remote_bda, sizeof(esp_bd_addr_t)); param.close.reason = close->reason; btc_gattc_cb_to_app(ESP_GATTC_CLOSE_EVT, gattc_if, ¶m); break; } case BTA_GATTC_DISCONNECT_EVT: { tBTA_GATTC_DISCONNECT *disconnect = &arg->disconnect; gattc_if = disconnect->client_if; param.disconnect.reason = disconnect->reason; param.disconnect.conn_id = BTC_GATT_GET_CONN_ID(disconnect->conn_id); memcpy(param.disconnect.remote_bda, disconnect->remote_bda, sizeof(esp_bd_addr_t)); btc_gattc_cb_to_app(ESP_GATTC_DISCONNECT_EVT, gattc_if, ¶m); break; } case BTA_GATTC_CFG_MTU_EVT: { tBTA_GATTC_CFG_MTU *cfg_mtu = &arg->cfg_mtu; gattc_if = BTC_GATT_GET_GATT_IF(cfg_mtu->conn_id); param.cfg_mtu.conn_id = BTC_GATT_GET_CONN_ID(cfg_mtu->conn_id); param.cfg_mtu.status = cfg_mtu->status; param.cfg_mtu.mtu = cfg_mtu->mtu; btc_gattc_cb_to_app(ESP_GATTC_CFG_MTU_EVT, gattc_if, ¶m); break; } case BTA_GATTC_ACL_EVT: { /* Currently, this event will never happen */ break; } case BTA_GATTC_CANCEL_OPEN_EVT: { /* Currently, this event will never happen */ break; } case BTA_GATTC_CONGEST_EVT: { tBTA_GATTC_CONGEST *congest = &arg->congest; gattc_if = BTC_GATT_GET_GATT_IF(congest->conn_id); param.congest.conn_id = BTC_GATT_GET_CONN_ID(congest->conn_id); param.congest.congested = (congest->congested == TRUE) ? true : false; btc_gattc_cb_to_app(ESP_GATTC_CONGEST_EVT, gattc_if, ¶m); break; } case BTA_GATTC_SRVC_CHG_EVT: { tBTA_GATTC_SERVICE_CHANGE *srvc_change = &arg->srvc_chg; gattc_if = BTC_GATT_GET_GATT_IF(srvc_change->conn_id); memcpy(param.srvc_chg.remote_bda, srvc_change->remote_bda, sizeof(esp_bd_addr_t)); btc_gattc_cb_to_app(ESP_GATTC_SRVC_CHG_EVT, gattc_if, ¶m); break; } case BTA_GATTC_QUEUE_FULL_EVT: { tBTA_GATTC_QUEUE_FULL *queue_full = &arg->queue_full; gattc_if = BTC_GATT_GET_GATT_IF(queue_full->conn_id); param.queue_full.conn_id = BTC_GATT_GET_CONN_ID(queue_full->conn_id); param.queue_full.status = arg->status; param.queue_full.is_full = queue_full->is_full; btc_gattc_cb_to_app(ESP_GATTC_QUEUE_FULL_EVT, gattc_if, ¶m); break; } case BTA_GATTC_ASSOC_EVT: { gattc_if = arg->set_assoc.client_if; param.set_assoc_cmp.status = arg->set_assoc.status; btc_gattc_cb_to_app(ESP_GATTC_SET_ASSOC_EVT, gattc_if, ¶m); break; } case BTA_GATTC_GET_ADDR_LIST_EVT: { gattc_if = arg->get_addr_list.client_if; param.get_addr_list.status = arg->get_addr_list.status; param.get_addr_list.num_addr = arg->get_addr_list.num_addr; param.get_addr_list.addr_list = arg->get_addr_list.bda_list; btc_gattc_cb_to_app(ESP_GATTC_GET_ADDR_LIST_EVT, gattc_if, ¶m); 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, ¶m); break; default: BTC_TRACE_DEBUG("%s: Unhandled event (%d)!", __FUNCTION__, msg->act); break; } // free the deep-copied data btc_gattc_free_req_data(msg); }