189 esp_ble_gatts_cb_param_t *param) {
191 case ESP_GATTS_ADD_CHAR_EVT: {
193 this->
handle_ = param->add_char.attr_handle;
196 descriptor->do_create(
this);
203 case ESP_GATTS_READ_EVT: {
204 if (param->read.handle != this->handle_)
207 if (!param->read.need_rsp)
211 param->read.conn_id);
213 uint16_t max_offset = 22;
215 esp_gatt_rsp_t response;
216 if (param->read.is_long) {
217 if (this->
value_.size() - this->value_read_offset_ < max_offset) {
221 memcpy(response.attr_value.value, this->value_.data() + response.attr_value.offset, response.attr_value.len);
224 response.attr_value.len = max_offset;
226 memcpy(response.attr_value.value, this->value_.data() + response.attr_value.offset, response.attr_value.len);
230 response.attr_value.offset = 0;
231 if (this->
value_.size() + 1 > max_offset) {
232 response.attr_value.len = max_offset;
235 response.attr_value.len = this->
value_.size();
237 memcpy(response.attr_value.value, this->value_.data(), response.attr_value.len);
240 response.attr_value.handle = this->
handle_;
241 response.attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
244 esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id, ESP_GATT_OK, &response);
246 ESP_LOGE(TAG,
"esp_ble_gatts_send_response failed: %d", err);
250 case ESP_GATTS_WRITE_EVT: {
251 if (this->
handle_ != param->write.handle)
254 if (param->write.is_prep) {
255 this->
value_.insert(this->
value_.end(), param->write.value, param->write.value + param->write.len);
261 if (param->write.need_rsp) {
262 esp_gatt_rsp_t response;
264 response.attr_value.len = param->write.len;
265 response.attr_value.handle = this->
handle_;
266 response.attr_value.offset = param->write.offset;
267 response.attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
268 memcpy(response.attr_value.value, param->write.value, param->write.len);
271 esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, &response);
274 ESP_LOGE(TAG,
"esp_ble_gatts_send_response failed: %d", err);
278 if (!param->write.is_prep) {
286 case ESP_GATTS_EXEC_WRITE_EVT: {
290 if (param->exec_write.exec_write_flag == ESP_GATT_PREP_WRITE_EXEC) {
295 esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK,
nullptr);
297 ESP_LOGE(TAG,
"esp_ble_gatts_send_response failed: %d", err);
306 descriptor->gatts_event_handler(event, gatts_if, param);