53#ifdef USE_ESP32_VARIANT_ESP32
54 touch_sensor_sample_config_t sample_cfg = TOUCH_SENSOR_V1_DEFAULT_SAMPLE_CONFIG(
56#elif defined(USE_ESP32_VARIANT_ESP32P4)
58 touch_sensor_sample_config_t sample_cfg = TOUCH_SENSOR_V3_DEFAULT_SAMPLE_CONFIG(8, 2, 2);
62 touch_sensor_sample_config_t sample_cfg = TOUCH_SENSOR_V2_DEFAULT_SAMPLE_CONFIG(
67 touch_sensor_config_t sens_cfg = TOUCH_SENSOR_DEFAULT_BASIC_CONFIG(1, &sample_cfg);
69#ifndef USE_ESP32_VARIANT_ESP32
70 sens_cfg.max_meas_time_us = 0;
73 esp_err_t err = touch_sensor_new_controller(&sens_cfg, &this->
sens_handle_);
75 ESP_LOGE(TAG,
"Failed to create touch controller: %s", esp_err_to_name(err));
83 touch_channel_config_t chan_cfg = {};
84#ifdef USE_ESP32_VARIANT_ESP32
85 chan_cfg.abs_active_thresh[0] = child->get_threshold();
86 chan_cfg.charge_speed = TOUCH_CHARGE_SPEED_7;
87 chan_cfg.init_charge_volt = TOUCH_INIT_CHARGE_VOLT_DEFAULT;
88 chan_cfg.group = TOUCH_CHAN_TRIG_GROUP_BOTH;
89#elif defined(USE_ESP32_VARIANT_ESP32P4)
90 chan_cfg.active_thresh[0] = child->get_threshold();
93 chan_cfg.active_thresh[0] = child->get_threshold();
94 chan_cfg.charge_speed = TOUCH_CHARGE_SPEED_7;
95 chan_cfg.init_charge_volt = TOUCH_INIT_CHARGE_VOLT_DEFAULT;
98 err = touch_sensor_new_channel(this->
sens_handle_, child->get_channel_id(), &chan_cfg, &child->chan_handle_);
100 ESP_LOGE(TAG,
"Failed to create touch channel %d: %s", child->get_channel_id(), esp_err_to_name(err));
108#ifdef USE_ESP32_VARIANT_ESP32
111 touch_sensor_filter_config_t filter_cfg = TOUCH_SENSOR_DEFAULT_FILTER_CONFIG();
115 err = touch_sensor_config_filter(this->
sens_handle_, &filter_cfg);
117 ESP_LOGE(TAG,
"Failed to configure filter: %s", esp_err_to_name(err));
126 touch_sensor_filter_config_t filter_cfg = TOUCH_SENSOR_DEFAULT_FILTER_CONFIG();
134 err = touch_sensor_config_filter(this->
sens_handle_, &filter_cfg);
136 ESP_LOGW(TAG,
"Failed to configure filter: %s", esp_err_to_name(err));
141#if SOC_TOUCH_SUPPORT_DENOISE_CHAN
143 touch_denoise_chan_config_t denoise_cfg = {};
144 denoise_cfg.charge_speed = TOUCH_CHARGE_SPEED_7;
145 denoise_cfg.init_charge_volt = TOUCH_INIT_CHARGE_VOLT_DEFAULT;
148 err = touch_sensor_config_denoise_channel(this->
sens_handle_, &denoise_cfg);
150 ESP_LOGW(TAG,
"Failed to configure denoise: %s", esp_err_to_name(err));
155#if SOC_TOUCH_SUPPORT_WATERPROOF
157 touch_channel_handle_t guard_chan =
nullptr;
158 for (
auto *child : this->children_) {
159 if (child->get_channel_id() == this->waterproof_guard_ring_pad_) {
160 guard_chan = child->chan_handle_;
165 touch_channel_handle_t shield_chan =
nullptr;
166 touch_channel_config_t shield_cfg = {};
167#ifdef USE_ESP32_VARIANT_ESP32P4
168 shield_cfg.active_thresh[0] = 0;
169 err = touch_sensor_new_channel(this->
sens_handle_, SOC_TOUCH_MAX_CHAN_ID, &shield_cfg, &shield_chan);
171 shield_cfg.active_thresh[0] = 0;
172 shield_cfg.charge_speed = TOUCH_CHARGE_SPEED_7;
173 shield_cfg.init_charge_volt = TOUCH_INIT_CHARGE_VOLT_DEFAULT;
174 err = touch_sensor_new_channel(this->
sens_handle_, TOUCH_SHIELD_CHAN_ID, &shield_cfg, &shield_chan);
177 touch_waterproof_config_t wp_cfg = {};
178 wp_cfg.guard_chan = guard_chan;
179 wp_cfg.shield_chan = shield_chan;
181 wp_cfg.flags.immersion_proof = 1;
182 err = touch_sensor_config_waterproof(this->
sens_handle_, &wp_cfg);
184 ESP_LOGW(TAG,
"Failed to configure waterproof: %s", esp_err_to_name(err));
187 ESP_LOGW(TAG,
"Failed to create shield channel: %s", esp_err_to_name(err));
196 touch_event_callbacks_t cbs = {};
199 err = touch_sensor_register_callbacks(this->
sens_handle_, &cbs,
this);
201 ESP_LOGE(TAG,
"Failed to register callbacks: %s", esp_err_to_name(err));
210 ESP_LOGE(TAG,
"Failed to enable touch sensor: %s", esp_err_to_name(err));
217 for (uint32_t i = 0; i < ONESHOT_SCAN_COUNT; i++) {
218 err = touch_sensor_trigger_oneshot_scanning(this->
sens_handle_, ONESHOT_SCAN_TIMEOUT_MS);
220 ESP_LOGW(TAG,
"Oneshot scan %d failed: %s", i, esp_err_to_name(err));
224 err = touch_sensor_start_continuous_scanning(this->
sens_handle_);
226 ESP_LOGE(TAG,
"Failed to start continuous scanning: %s", esp_err_to_name(err));
322 while (xQueueReceive(this->
touch_queue_, &event, 0) == pdTRUE) {
324 if (child->get_channel_id() != event.
chan_id) {
330 touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_SMOOTH, &value);
331 child->value_ = value;
333#ifndef USE_ESP32_VARIANT_ESP32
335 uint32_t benchmark = 0;
336 touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_BENCHMARK, &benchmark);
337 child->benchmark_ = benchmark;
340 bool new_state =
event.is_active;
342 if (new_state != child->last_state_) {
343 child->initial_state_published_ =
true;
344 child->last_state_ = new_state;
345 child->publish_state(new_state);
346#ifdef USE_ESP32_VARIANT_ESP32
347 ESP_LOGV(TAG,
"Touch Pad '%s' state: %s (value: %" PRIu32
", threshold: %" PRIu32
")",
348 child->get_name().c_str(), ONOFF(new_state), value, child->get_threshold());
351 ESP_LOGV(TAG,
"Touch Pad '%s' state: ON (value: %" PRIu32
", benchmark: %" PRIu32
", threshold: %" PRIu32
")",
352 child->get_name().c_str(), value, benchmark, child->get_threshold());
354 ESP_LOGV(TAG,
"Touch Pad '%s' state: OFF", child->get_name().c_str());
415#if SOC_TOUCH_SUPPORT_SLEEP_WAKEUP
416 bool has_wakeup =
false;
418 if (child->get_wakeup_threshold() != 0) {
427#ifdef USE_ESP32_VARIANT_ESP32
429 touch_sleep_config_t sleep_cfg = TOUCH_SENSOR_DEFAULT_DSLP_CONFIG();
430 sleep_cfg.deep_slp_sens_cfg =
nullptr;
431 esp_err_t err = touch_sensor_config_sleep_wakeup(this->
sens_handle_, &sleep_cfg);
433 ESP_LOGW(TAG,
"Failed to configure touch sleep wakeup: %s", esp_err_to_name(err));
437 touch_channel_handle_t wakeup_chan =
nullptr;
438 uint32_t wakeup_thresh = 0;
439 for (
auto *child : this->children_) {
440 if (child->get_wakeup_threshold() != 0) {
441 wakeup_chan = child->chan_handle_;
442 wakeup_thresh = child->get_wakeup_threshold();
447 if (wakeup_chan !=
nullptr) {
448 touch_sleep_config_t sleep_cfg = TOUCH_SENSOR_DEFAULT_DSLP_CONFIG();
449 sleep_cfg.deep_slp_chan = wakeup_chan;
450 sleep_cfg.deep_slp_thresh[0] = wakeup_thresh;
451 sleep_cfg.deep_slp_sens_cfg =
nullptr;
452 esp_err_t err = touch_sensor_config_sleep_wakeup(this->
sens_handle_, &sleep_cfg);
454 ESP_LOGW(TAG,
"Failed to configure touch sleep wakeup: %s", esp_err_to_name(err));
464 if (child->chan_handle_ ==
nullptr)
467 uint32_t smooth_value = 0;
468 touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_SMOOTH, &smooth_value);
469 child->value_ = smooth_value;
471#ifdef USE_ESP32_VARIANT_ESP32
472 ESP_LOGD(TAG,
"Touch Pad '%s' (Ch%d): %" PRIu32, child->get_name().c_str(), child->channel_id_, smooth_value);
474 uint32_t benchmark = 0;
475 touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_BENCHMARK, &benchmark);
476 child->benchmark_ = benchmark;
477 int32_t difference =
static_cast<int32_t
>(smooth_value) -
static_cast<int32_t
>(benchmark);
479 "Touch Pad '%s' (Ch%d): value=%" PRIu32
", benchmark=%" PRIu32
", difference=%" PRId32
480 " (set threshold < %" PRId32
" to detect touch)",
481 child->get_name().c_str(), child->channel_id_, smooth_value, benchmark, difference, difference);