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);
221 ESP_LOGW(TAG,
"Oneshot scan %" PRIu32
" failed: %s", i, esp_err_to_name(err));
225 err = touch_sensor_start_continuous_scanning(this->
sens_handle_);
227 ESP_LOGE(TAG,
"Failed to start continuous scanning: %s", esp_err_to_name(err));
318 while (xQueueReceive(this->
touch_queue_, &event, 0) == pdTRUE) {
320 if (child->get_channel_id() != event.
chan_id) {
326 touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_SMOOTH, &value);
327 child->value_ = value;
329#ifndef USE_ESP32_VARIANT_ESP32
332 touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_BENCHMARK, &benchmark);
333 child->benchmark_ = benchmark;
336 bool new_state =
event.is_active;
338 if (new_state != child->last_state_) {
339 child->initial_state_published_ =
true;
340 child->last_state_ = new_state;
341 child->publish_state(new_state);
342#ifdef USE_ESP32_VARIANT_ESP32
343 ESP_LOGV(TAG,
"Touch Pad '%s' state: %s (value: %" PRIu32
", threshold: %" PRIu32
")",
344 LOG_STR_ARG(child->get_log_name()), ONOFF(new_state), value, child->get_threshold());
347 ESP_LOGV(TAG,
"Touch Pad '%s' state: ON (value: %" PRIu32
", benchmark: %" PRIu32
", threshold: %" PRIu32
")",
348 LOG_STR_ARG(child->get_log_name()), value, benchmark, child->get_threshold());
350 ESP_LOGV(TAG,
"Touch Pad '%s' state: OFF", LOG_STR_ARG(child->get_log_name()));
359 bool all_initial_published =
true;
362 if (!child->initial_state_published_) {
363 all_initial_published =
false;
416#if SOC_TOUCH_SUPPORT_SLEEP_WAKEUP
417 bool has_wakeup =
false;
419 if (child->get_wakeup_threshold() != 0) {
428#ifdef USE_ESP32_VARIANT_ESP32
430 touch_sleep_config_t sleep_cfg = TOUCH_SENSOR_DEFAULT_DSLP_CONFIG();
431 sleep_cfg.deep_slp_sens_cfg =
nullptr;
432 esp_err_t err = touch_sensor_config_sleep_wakeup(this->
sens_handle_, &sleep_cfg);
434 ESP_LOGW(TAG,
"Failed to configure touch sleep wakeup: %s", esp_err_to_name(err));
438 touch_channel_handle_t wakeup_chan =
nullptr;
440 for (
auto *child : this->children_) {
441 if (child->get_wakeup_threshold() != 0) {
442 wakeup_chan = child->chan_handle_;
443 wakeup_thresh = child->get_wakeup_threshold();
448 if (wakeup_chan !=
nullptr) {
449 touch_sleep_config_t sleep_cfg = TOUCH_SENSOR_DEFAULT_DSLP_CONFIG();
450 sleep_cfg.deep_slp_chan = wakeup_chan;
451 sleep_cfg.deep_slp_thresh[0] = wakeup_thresh;
452 sleep_cfg.deep_slp_sens_cfg =
nullptr;
453 esp_err_t err = touch_sensor_config_sleep_wakeup(this->
sens_handle_, &sleep_cfg);
455 ESP_LOGW(TAG,
"Failed to configure touch sleep wakeup: %s", esp_err_to_name(err));
465 if (child->chan_handle_ ==
nullptr)
469 touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_SMOOTH, &smooth_value);
470 child->value_ = smooth_value;
472#ifdef USE_ESP32_VARIANT_ESP32
473 ESP_LOGD(TAG,
"Touch Pad '%s' (Ch%d): %" PRIu32, LOG_STR_ARG(child->get_log_name()), child->channel_id_,
477 touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_BENCHMARK, &benchmark);
478 child->benchmark_ = benchmark;
479 int32_t difference =
static_cast<int32_t
>(smooth_value) -
static_cast<int32_t
>(benchmark);
481 "Touch Pad '%s' (Ch%d): value=%" PRIu32
", benchmark=%" PRIu32
", difference=%" PRId32
482 " (set threshold < %" PRId32
" to detect touch)",
483 LOG_STR_ARG(child->get_log_name()), child->channel_id_, smooth_value, benchmark, difference, difference);