190 esp_ble_gatts_cb_param_t *param) {
192 case ESP_GATTS_ADD_CHAR_EVT: {
194 this->
handle_ = param->add_char.attr_handle;
197 descriptor->do_create(
this);
204 case ESP_GATTS_READ_EVT: {
205 if (param->read.handle != this->handle_)
208 if (!param->read.need_rsp)
212 param->read.conn_id);
214 uint16_t max_offset = 22;
216 esp_gatt_rsp_t response;
217 if (param->read.is_long) {
218 if (this->
value_.size() - this->value_read_offset_ < max_offset) {
222 memcpy(response.attr_value.value, this->value_.data() + response.attr_value.offset, response.attr_value.len);
225 response.attr_value.len = max_offset;
227 memcpy(response.attr_value.value, this->value_.data() + response.attr_value.offset, response.attr_value.len);
231 response.attr_value.offset = 0;
232 if (this->
value_.size() + 1 > max_offset) {
233 response.attr_value.len = max_offset;
236 response.attr_value.len = this->
value_.size();
238 memcpy(response.attr_value.value, this->value_.data(), response.attr_value.len);
241 response.attr_value.handle = this->
handle_;
242 response.attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
245 esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id, ESP_GATT_OK, &response);
247 ESP_LOGE(TAG,
"esp_ble_gatts_send_response failed: %d", err);
251 case ESP_GATTS_WRITE_EVT: {
252 if (this->
handle_ != param->write.handle)
255 if (param->write.is_prep) {
256 this->
value_.insert(this->
value_.end(), param->write.value, param->write.value + param->write.len);
262 if (param->write.need_rsp) {
263 esp_gatt_rsp_t response;
265 response.attr_value.len = param->write.len;
266 response.attr_value.handle = this->
handle_;
267 response.attr_value.offset = param->write.offset;
268 response.attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
269 memcpy(response.attr_value.value, param->write.value, param->write.len);
272 esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, &response);
275 ESP_LOGE(TAG,
"esp_ble_gatts_send_response failed: %d", err);
279 if (!param->write.is_prep) {
287 case ESP_GATTS_EXEC_WRITE_EVT: {
291 if (param->exec_write.exec_write_flag == ESP_GATT_PREP_WRITE_EXEC) {
296 esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK,
nullptr);
298 ESP_LOGE(TAG,
"esp_ble_gatts_send_response failed: %d", err);
307 descriptor->gatts_event_handler(event, gatts_if, param);