mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
fix(bt/bluedroid): Fix prepare write for BLE example
This commit is contained in:
parent
f18d887a6d
commit
fb0c9550d8
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
*/
|
*/
|
||||||
@ -393,20 +393,21 @@ void example_prepare_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t
|
|||||||
{
|
{
|
||||||
EXAMPLE_DEBUG(EXAMPLE_TAG, "prepare write, handle = %d, value len = %d", param->write.handle, param->write.len);
|
EXAMPLE_DEBUG(EXAMPLE_TAG, "prepare write, handle = %d, value len = %d", param->write.handle, param->write.len);
|
||||||
esp_gatt_status_t status = ESP_GATT_OK;
|
esp_gatt_status_t status = ESP_GATT_OK;
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
if (param->write.offset > PREPARE_BUF_MAX_SIZE) {
|
||||||
|
status = ESP_GATT_INVALID_OFFSET;
|
||||||
|
} else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
||||||
|
status = ESP_GATT_INVALID_ATTR_LEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == ESP_GATT_OK && prepare_write_env->prepare_buf == NULL) {
|
||||||
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE * sizeof(uint8_t));
|
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE * sizeof(uint8_t));
|
||||||
prepare_write_env->prepare_len = 0;
|
prepare_write_env->prepare_len = 0;
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
if (prepare_write_env->prepare_buf == NULL) {
|
||||||
ESP_LOGE(EXAMPLE_TAG, "%s, Gatt_server prep no mem", __func__);
|
ESP_LOGE(EXAMPLE_TAG, "%s, Gatt_server prep no mem", __func__);
|
||||||
status = ESP_GATT_NO_RESOURCES;
|
status = ESP_GATT_NO_RESOURCES;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if(param->write.offset > PREPARE_BUF_MAX_SIZE) {
|
|
||||||
status = ESP_GATT_INVALID_OFFSET;
|
|
||||||
} else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
|
||||||
status = ESP_GATT_INVALID_ATTR_LEN;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*send response when param->write.need_rsp is true */
|
/*send response when param->write.need_rsp is true */
|
||||||
if (param->write.need_rsp){
|
if (param->write.need_rsp){
|
||||||
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
*/
|
*/
|
||||||
@ -280,20 +280,19 @@ void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare
|
|||||||
esp_gatt_status_t status = ESP_GATT_OK;
|
esp_gatt_status_t status = ESP_GATT_OK;
|
||||||
if (param->write.need_rsp) {
|
if (param->write.need_rsp) {
|
||||||
if (param->write.is_prep) {
|
if (param->write.is_prep) {
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
if (param->write.offset > PREPARE_BUF_MAX_SIZE) {
|
||||||
|
status = ESP_GATT_INVALID_OFFSET;
|
||||||
|
} else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
||||||
|
status = ESP_GATT_INVALID_ATTR_LEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == ESP_GATT_OK && prepare_write_env->prepare_buf == NULL) {
|
||||||
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE * sizeof(uint8_t));
|
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE * sizeof(uint8_t));
|
||||||
prepare_write_env->prepare_len = 0;
|
prepare_write_env->prepare_len = 0;
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
if (prepare_write_env->prepare_buf == NULL) {
|
||||||
ESP_LOGE(GATTS_TAG, "Gatt_server prep no mem");
|
ESP_LOGE(GATTS_TAG, "Gatt_server prep no mem");
|
||||||
status = ESP_GATT_NO_RESOURCES;
|
status = ESP_GATT_NO_RESOURCES;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if(param->write.offset > PREPARE_BUF_MAX_SIZE ||
|
|
||||||
prepare_write_env->prepare_len > param->write.offset) {
|
|
||||||
status = ESP_GATT_INVALID_OFFSET;
|
|
||||||
} else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
|
||||||
status = ESP_GATT_INVALID_ATTR_LEN;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
||||||
|
@ -242,20 +242,19 @@ static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param
|
|||||||
void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param){
|
void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param){
|
||||||
esp_gatt_status_t status = ESP_GATT_OK;
|
esp_gatt_status_t status = ESP_GATT_OK;
|
||||||
if (param->write.need_rsp){
|
if (param->write.need_rsp){
|
||||||
if (param->write.is_prep){
|
if (param->write.is_prep) {
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
if (param->write.offset > PREPARE_BUF_MAX_SIZE) {
|
||||||
|
status = ESP_GATT_INVALID_OFFSET;
|
||||||
|
} else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
||||||
|
status = ESP_GATT_INVALID_ATTR_LEN;
|
||||||
|
}
|
||||||
|
if (status == ESP_GATT_OK && prepare_write_env->prepare_buf == NULL) {
|
||||||
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE*sizeof(uint8_t));
|
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE*sizeof(uint8_t));
|
||||||
prepare_write_env->prepare_len = 0;
|
prepare_write_env->prepare_len = 0;
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
if (prepare_write_env->prepare_buf == NULL) {
|
||||||
ESP_LOGE(GATTS_TAG, "Gatt_server prep no mem");
|
ESP_LOGE(GATTS_TAG, "Gatt_server prep no mem");
|
||||||
status = ESP_GATT_NO_RESOURCES;
|
status = ESP_GATT_NO_RESOURCES;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if(param->write.offset > PREPARE_BUF_MAX_SIZE) {
|
|
||||||
status = ESP_GATT_INVALID_OFFSET;
|
|
||||||
} else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
|
||||||
status = ESP_GATT_INVALID_ATTR_LEN;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
||||||
|
@ -772,35 +772,37 @@ The `example_write_event_env()` function contains the logic for the write long c
|
|||||||
void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param){
|
void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param){
|
||||||
esp_gatt_status_t status = ESP_GATT_OK;
|
esp_gatt_status_t status = ESP_GATT_OK;
|
||||||
if (param->write.need_rsp){
|
if (param->write.need_rsp){
|
||||||
if (param->write.is_prep){
|
if (param->write.is_prep) {
|
||||||
if (prepare_write_env->prepare_buf == NULL){
|
if(param->write.offset > PREPARE_BUF_MAX_SIZE) {
|
||||||
|
status = ESP_GATT_INVALID_OFFSET;
|
||||||
|
} else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
||||||
|
status = ESP_GATT_INVALID_ATTR_LEN;
|
||||||
|
}
|
||||||
|
if (status == ESP_GATT_OK && prepare_write_env->prepare_buf == NULL) {
|
||||||
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE*sizeof(uint8_t));
|
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE*sizeof(uint8_t));
|
||||||
prepare_write_env->prepare_len = 0;
|
prepare_write_env->prepare_len = 0;
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
if (prepare_write_env->prepare_buf == NULL) {
|
||||||
ESP_LOGE(GATTS_TAG, "Gatt_server prep no mem");
|
ESP_LOGE(GATTS_TAG, "Gatt_server prep no mem");
|
||||||
status = ESP_GATT_NO_RESOURCES;
|
status = ESP_GATT_NO_RESOURCES;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if(param->write.offset > PREPARE_BUF_MAX_SIZE) {
|
|
||||||
status = ESP_GATT_INVALID_OFFSET;
|
|
||||||
}
|
|
||||||
else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
|
||||||
status = ESP_GATT_INVALID_ATTR_LEN;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
||||||
|
if (gatt_rsp) {
|
||||||
gatt_rsp->attr_value.len = param->write.len;
|
gatt_rsp->attr_value.len = param->write.len;
|
||||||
gatt_rsp->attr_value.handle = param->write.handle;
|
gatt_rsp->attr_value.handle = param->write.handle;
|
||||||
gatt_rsp->attr_value.offset = param->write.offset;
|
gatt_rsp->attr_value.offset = param->write.offset;
|
||||||
gatt_rsp->attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
|
gatt_rsp->attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
|
||||||
memcpy(gatt_rsp->attr_value.value, param->write.value, param->write.len);
|
memcpy(gatt_rsp->attr_value.value, param->write.value, param->write.len);
|
||||||
esp_err_t response_err = esp_ble_gatts_send_response(gatts_if, param->write.conn_id,
|
esp_err_t response_err = esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, gatt_rsp);
|
||||||
param->write.trans_id, status, gatt_rsp);
|
if (response_err != ESP_OK) {
|
||||||
if (response_err != ESP_OK){
|
ESP_LOGE(GATTS_TAG, "Send response error\n");
|
||||||
ESP_LOGE(GATTS_TAG, "Send response error");
|
|
||||||
}
|
}
|
||||||
free(gatt_rsp);
|
free(gatt_rsp);
|
||||||
|
} else {
|
||||||
|
ESP_LOGE(GATTS_TAG, "malloc failed, no resource to send response error\n");
|
||||||
|
status = ESP_GATT_NO_RESOURCES;
|
||||||
|
}
|
||||||
if (status != ESP_GATT_OK){
|
if (status != ESP_GATT_OK){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -809,7 +811,7 @@ void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare
|
|||||||
param->write.len);
|
param->write.len);
|
||||||
prepare_write_env->prepare_len += param->write.len;
|
prepare_write_env->prepare_len += param->write.len;
|
||||||
|
|
||||||
}else{
|
} else {
|
||||||
esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, NULL);
|
esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -830,9 +832,9 @@ The function then checks if the Prepare Write Request parameter represented by t
|
|||||||
|
|
||||||
```c
|
```c
|
||||||
…
|
…
|
||||||
if (param->write.is_prep){
|
if (param->write.is_prep) {
|
||||||
…
|
…
|
||||||
}else{
|
} else {
|
||||||
esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, NULL);
|
esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, NULL);
|
||||||
}
|
}
|
||||||
…
|
…
|
||||||
@ -852,7 +854,7 @@ static prepare_type_env_t b_prepare_write_env;
|
|||||||
In order to use the prepare buffer, some memory space is allocated for it. In case the allocation fails due to a lack of memory, an error is printed:
|
In order to use the prepare buffer, some memory space is allocated for it. In case the allocation fails due to a lack of memory, an error is printed:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
if (status == ESP_GATT_OK && prepare_write_env->prepare_buf == NULL) {
|
||||||
prepare_write_env->prepare_buf =
|
prepare_write_env->prepare_buf =
|
||||||
(uint8_t*)malloc(PREPARE_BUF_MAX_SIZE*sizeof(uint8_t));
|
(uint8_t*)malloc(PREPARE_BUF_MAX_SIZE*sizeof(uint8_t));
|
||||||
prepare_write_env->prepare_len = 0;
|
prepare_write_env->prepare_len = 0;
|
||||||
|
@ -281,20 +281,20 @@ void example_prepare_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t
|
|||||||
{
|
{
|
||||||
ESP_LOGI(GATTS_TABLE_TAG, "prepare write, handle = %d, value len = %d", param->write.handle, param->write.len);
|
ESP_LOGI(GATTS_TABLE_TAG, "prepare write, handle = %d, value len = %d", param->write.handle, param->write.len);
|
||||||
esp_gatt_status_t status = ESP_GATT_OK;
|
esp_gatt_status_t status = ESP_GATT_OK;
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
if (param->write.offset > PREPARE_BUF_MAX_SIZE) {
|
||||||
|
status = ESP_GATT_INVALID_OFFSET;
|
||||||
|
} else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
||||||
|
status = ESP_GATT_INVALID_ATTR_LEN;
|
||||||
|
}
|
||||||
|
if (status == ESP_GATT_OK && prepare_write_env->prepare_buf == NULL) {
|
||||||
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE * sizeof(uint8_t));
|
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE * sizeof(uint8_t));
|
||||||
prepare_write_env->prepare_len = 0;
|
prepare_write_env->prepare_len = 0;
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
if (prepare_write_env->prepare_buf == NULL) {
|
||||||
ESP_LOGE(GATTS_TABLE_TAG, "%s, Gatt_server prep no mem", __func__);
|
ESP_LOGE(GATTS_TABLE_TAG, "%s, Gatt_server prep no mem", __func__);
|
||||||
status = ESP_GATT_NO_RESOURCES;
|
status = ESP_GATT_NO_RESOURCES;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if(param->write.offset > PREPARE_BUF_MAX_SIZE) {
|
|
||||||
status = ESP_GATT_INVALID_OFFSET;
|
|
||||||
} else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
|
||||||
status = ESP_GATT_INVALID_ATTR_LEN;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*send response when param->write.need_rsp is true */
|
/*send response when param->write.need_rsp is true */
|
||||||
if (param->write.need_rsp){
|
if (param->write.need_rsp){
|
||||||
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
||||||
@ -305,7 +305,7 @@ void example_prepare_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t
|
|||||||
gatt_rsp->attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
|
gatt_rsp->attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
|
||||||
memcpy(gatt_rsp->attr_value.value, param->write.value, param->write.len);
|
memcpy(gatt_rsp->attr_value.value, param->write.value, param->write.len);
|
||||||
esp_err_t response_err = esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, gatt_rsp);
|
esp_err_t response_err = esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, gatt_rsp);
|
||||||
if (response_err != ESP_OK){
|
if (response_err != ESP_OK) {
|
||||||
ESP_LOGE(GATTS_TABLE_TAG, "Send response error");
|
ESP_LOGE(GATTS_TABLE_TAG, "Send response error");
|
||||||
}
|
}
|
||||||
free(gatt_rsp);
|
free(gatt_rsp);
|
||||||
|
@ -197,20 +197,20 @@ static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param
|
|||||||
void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param){
|
void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param){
|
||||||
esp_gatt_status_t status = ESP_GATT_OK;
|
esp_gatt_status_t status = ESP_GATT_OK;
|
||||||
if (param->write.need_rsp){
|
if (param->write.need_rsp){
|
||||||
if (param->write.is_prep){
|
if (param->write.is_prep) {
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
if (param->write.offset > PREPARE_BUF_MAX_SIZE) {
|
||||||
|
status = ESP_GATT_INVALID_OFFSET;
|
||||||
|
} else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
||||||
|
status = ESP_GATT_INVALID_ATTR_LEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == ESP_GATT_OK && prepare_write_env->prepare_buf == NULL) {
|
||||||
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE*sizeof(uint8_t));
|
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE*sizeof(uint8_t));
|
||||||
prepare_write_env->prepare_len = 0;
|
prepare_write_env->prepare_len = 0;
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
if (prepare_write_env->prepare_buf == NULL) {
|
||||||
ESP_LOGE(BT_BLE_COEX_TAG, "Gatt_server prep no mem");
|
ESP_LOGE(BT_BLE_COEX_TAG, "Gatt_server prep no mem");
|
||||||
status = ESP_GATT_NO_RESOURCES;
|
status = ESP_GATT_NO_RESOURCES;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if(param->write.offset > PREPARE_BUF_MAX_SIZE) {
|
|
||||||
status = ESP_GATT_INVALID_OFFSET;
|
|
||||||
} else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
|
||||||
status = ESP_GATT_INVALID_ATTR_LEN;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
*/
|
*/
|
||||||
@ -535,19 +535,18 @@ static void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *
|
|||||||
esp_gatt_status_t status = ESP_GATT_OK;
|
esp_gatt_status_t status = ESP_GATT_OK;
|
||||||
if (param->write.need_rsp) {
|
if (param->write.need_rsp) {
|
||||||
if (param->write.is_prep) {
|
if (param->write.is_prep) {
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
if (param->write.offset > PREPARE_BUF_MAX_SIZE) {
|
||||||
|
status = ESP_GATT_INVALID_OFFSET;
|
||||||
|
} else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
||||||
|
status = ESP_GATT_INVALID_ATTR_LEN;
|
||||||
|
}
|
||||||
|
if (status == ESP_GATT_OK && prepare_write_env->prepare_buf == NULL) {
|
||||||
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE*sizeof(uint8_t));
|
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE*sizeof(uint8_t));
|
||||||
prepare_write_env->prepare_len = 0;
|
prepare_write_env->prepare_len = 0;
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
if (prepare_write_env->prepare_buf == NULL) {
|
||||||
ESP_LOGE(COEX_TAG, "Gatt_server prep no mem");
|
ESP_LOGE(COEX_TAG, "Gatt_server prep no mem");
|
||||||
status = ESP_GATT_NO_RESOURCES;
|
status = ESP_GATT_NO_RESOURCES;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if(param->write.offset > PREPARE_BUF_MAX_SIZE) {
|
|
||||||
status = ESP_GATT_INVALID_OFFSET;
|
|
||||||
} else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
|
||||||
status = ESP_GATT_INVALID_ATTR_LEN;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@ -99,24 +99,32 @@ void example_exec_write_event_env(prepare_type_env_t *prepare_write_env, esp_ble
|
|||||||
void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param)
|
void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param)
|
||||||
{
|
{
|
||||||
esp_gatt_status_t status = ESP_GATT_OK;
|
esp_gatt_status_t status = ESP_GATT_OK;
|
||||||
|
|
||||||
|
// Check if a response is needed
|
||||||
if (param->write.need_rsp) {
|
if (param->write.need_rsp) {
|
||||||
|
// Check if the write operation is a prepared write
|
||||||
if (param->write.is_prep) {
|
if (param->write.is_prep) {
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
// Check for invalid offset or attribute length
|
||||||
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE * sizeof(uint8_t));
|
|
||||||
prepare_write_env->prepare_len = 0;
|
|
||||||
if (prepare_write_env->prepare_buf == NULL) {
|
|
||||||
ESP_LOGE(TAG, "Gatt_server prep no mem");
|
|
||||||
status = ESP_GATT_NO_RESOURCES;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (param->write.offset > PREPARE_BUF_MAX_SIZE) {
|
if (param->write.offset > PREPARE_BUF_MAX_SIZE) {
|
||||||
status = ESP_GATT_INVALID_OFFSET;
|
status = ESP_GATT_INVALID_OFFSET;
|
||||||
} else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
} else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
|
||||||
status = ESP_GATT_INVALID_ATTR_LEN;
|
status = ESP_GATT_INVALID_ATTR_LEN;
|
||||||
}
|
}
|
||||||
|
// Allocate memory for the prepare buffer if not already allocated
|
||||||
|
if (status == ESP_GATT_OK && prepare_write_env->prepare_buf == NULL) {
|
||||||
|
prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE * sizeof(uint8_t));
|
||||||
|
prepare_write_env->prepare_len = 0;
|
||||||
|
|
||||||
|
// Check for allocation failure
|
||||||
|
if (prepare_write_env->prepare_buf == NULL) {
|
||||||
|
ESP_LOGE(TAG, "Gatt_server prep no mem");
|
||||||
|
status = ESP_GATT_NO_RESOURCES;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Allocate and configure the GATT response
|
||||||
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
|
||||||
|
if (gatt_rsp != NULL) {
|
||||||
gatt_rsp->attr_value.len = param->write.len;
|
gatt_rsp->attr_value.len = param->write.len;
|
||||||
gatt_rsp->attr_value.handle = param->write.handle;
|
gatt_rsp->attr_value.handle = param->write.handle;
|
||||||
gatt_rsp->attr_value.offset = param->write.offset;
|
gatt_rsp->attr_value.offset = param->write.offset;
|
||||||
@ -127,15 +135,23 @@ void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare
|
|||||||
ESP_LOGE(TAG, "Send response error");
|
ESP_LOGE(TAG, "Send response error");
|
||||||
}
|
}
|
||||||
free(gatt_rsp);
|
free(gatt_rsp);
|
||||||
|
} else {
|
||||||
|
ESP_LOGE(TAG, "%s, malloc failed, and no resource to send response", __func__);
|
||||||
|
status = ESP_GATT_NO_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
if (status != ESP_GATT_OK) {
|
if (status != ESP_GATT_OK) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update the prepare buffer with the received data
|
||||||
memcpy(prepare_write_env->prepare_buf + param->write.offset,
|
memcpy(prepare_write_env->prepare_buf + param->write.offset,
|
||||||
param->write.value,
|
param->write.value,
|
||||||
param->write.len);
|
param->write.len);
|
||||||
prepare_write_env->prepare_len += param->write.len;
|
prepare_write_env->prepare_len += param->write.len;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
// Send a response for non-prepared write
|
||||||
esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, NULL);
|
esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user