60 for (uint8_t i = 0; i < client_count; i++) {
61 uint16_t client = clients[i];
67 bool require_ack = entry->indicate;
70 ESP_LOGW(TAG,
"INDICATE acknowledgment is not yet supported (i.e. it works as a NOTIFY)");
74 length, this->value_.data(), require_ack);
76 ESP_LOGE(TAG,
"esp_ble_gatts_send_indicate failed %d", err);
183 esp_ble_gatts_cb_param_t *param) {
185 case ESP_GATTS_ADD_CHAR_EVT: {
187 this->
handle_ = param->add_char.attr_handle;
190 descriptor->do_create(
this);
197 case ESP_GATTS_READ_EVT: {
198 if (param->read.handle != this->handle_)
201 if (!param->read.need_rsp)
208 uint16_t max_offset = 22;
210 esp_gatt_rsp_t response;
211 if (param->read.is_long) {
212 if (this->
value_.size() - this->value_read_offset_ < max_offset) {
216 memcpy(response.attr_value.value, this->value_.data() + response.attr_value.offset, response.attr_value.len);
219 response.attr_value.len = max_offset;
221 memcpy(response.attr_value.value, this->value_.data() + response.attr_value.offset, response.attr_value.len);
225 response.attr_value.offset = 0;
226 if (this->
value_.size() + 1 > max_offset) {
227 response.attr_value.len = max_offset;
230 response.attr_value.len = this->
value_.size();
232 memcpy(response.attr_value.value, this->value_.data(), response.attr_value.len);
235 response.attr_value.handle = this->
handle_;
236 response.attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
239 esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id, ESP_GATT_OK, &response);
241 ESP_LOGE(TAG,
"esp_ble_gatts_send_response failed: %d", err);
245 case ESP_GATTS_WRITE_EVT: {
246 if (this->
handle_ != param->write.handle)
249 if (param->write.is_prep) {
250 this->
value_.insert(this->
value_.end(), param->write.value, param->write.value + param->write.len);
256 if (param->write.need_rsp) {
257 esp_gatt_rsp_t response;
259 response.attr_value.len = param->write.len;
260 response.attr_value.handle = this->
handle_;
261 response.attr_value.offset = param->write.offset;
262 response.attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
263 memcpy(response.attr_value.value, param->write.value, param->write.len);
266 esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, &response);
269 ESP_LOGE(TAG,
"esp_ble_gatts_send_response failed: %d", err);
273 if (!param->write.is_prep) {
282 case ESP_GATTS_EXEC_WRITE_EVT: {
286 if (param->exec_write.exec_write_flag == ESP_GATT_PREP_WRITE_EXEC) {
292 esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK,
nullptr);
294 ESP_LOGE(TAG,
"esp_ble_gatts_send_response failed: %d", err);
303 descriptor->gatts_event_handler(event, gatts_if, param);