52 for (uint8_t i = 0; i < client_count; i++) {
53 uint16_t client = clients[i];
59 bool require_ack = entry->indicate;
62 ESP_LOGW(TAG,
"INDICATE acknowledgment is not yet supported (i.e. it works as a NOTIFY)");
66 length, this->value_.data(), require_ack);
68 ESP_LOGE(TAG,
"esp_ble_gatts_send_indicate failed %d", err);
175 esp_ble_gatts_cb_param_t *param) {
177 case ESP_GATTS_ADD_CHAR_EVT: {
179 this->
handle_ = param->add_char.attr_handle;
182 descriptor->do_create(
this);
189 case ESP_GATTS_READ_EVT: {
190 if (param->read.handle != this->handle_)
193 if (!param->read.need_rsp)
200 uint16_t max_offset = 22;
202 esp_gatt_rsp_t response;
203 if (param->read.is_long) {
205 response.attr_value.len = 0;
208 }
else if (this->
value_.size() - this->value_read_offset_ < max_offset) {
212 memcpy(response.attr_value.value, this->value_.data() + response.attr_value.offset, response.attr_value.len);
215 response.attr_value.len = max_offset;
217 memcpy(response.attr_value.value, this->value_.data() + response.attr_value.offset, response.attr_value.len);
221 response.attr_value.offset = 0;
222 if (this->
value_.size() + 1 > max_offset) {
223 response.attr_value.len = max_offset;
226 response.attr_value.len = this->
value_.size();
228 memcpy(response.attr_value.value, this->value_.data(), response.attr_value.len);
231 response.attr_value.handle = this->
handle_;
232 response.attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
235 esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id, ESP_GATT_OK, &response);
237 ESP_LOGE(TAG,
"esp_ble_gatts_send_response failed: %d", err);
241 case ESP_GATTS_WRITE_EVT: {
242 if (this->
handle_ != param->write.handle)
245 esp_gatt_status_t
status = ESP_GATT_OK;
247 if (param->write.is_prep) {
248 const size_t offset = param->write.offset;
249 const size_t write_len = param->write.len;
250 const size_t new_size = offset + write_len;
256 if (offset != this->
value_.size()) {
257 status = ESP_GATT_INVALID_OFFSET;
258 }
else if (new_size > ESP_GATT_MAX_ATTR_LEN) {
259 status = ESP_GATT_INVALID_ATTR_LEN;
261 if (this->
value_.size() < new_size) {
262 this->
value_.resize(new_size);
264 memcpy(this->
value_.data() + offset, param->write.value, write_len);
270 if (param->write.need_rsp) {
271 esp_gatt_rsp_t response;
273 response.attr_value.len = param->write.len;
274 response.attr_value.handle = this->
handle_;
275 response.attr_value.offset = param->write.offset;
276 response.attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
277 memcpy(response.attr_value.value, param->write.value, param->write.len);
280 esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id,
status, &response);
283 ESP_LOGE(TAG,
"esp_ble_gatts_send_response failed: %d", err);
287 if (!param->write.is_prep) {
296 case ESP_GATTS_EXEC_WRITE_EVT: {
300 if (param->exec_write.exec_write_flag == ESP_GATT_PREP_WRITE_EXEC) {
305 esp_err_t err = esp_ble_gatts_send_response(gatts_if, param->exec_write.conn_id, param->exec_write.trans_id,
306 ESP_GATT_OK,
nullptr);
308 ESP_LOGE(TAG,
"esp_ble_gatts_send_response failed: %d", err);
317 descriptor->gatts_event_handler(event, gatts_if, param);