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));
323 while (xQueueReceive(this->
touch_queue_, &event, 0) == pdTRUE) {
325 if (child->get_channel_id() != event.
chan_id) {
331 touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_SMOOTH, &value);
332 child->value_ = value;
334#ifndef USE_ESP32_VARIANT_ESP32
337 touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_BENCHMARK, &benchmark);
338 child->benchmark_ = benchmark;
341 bool new_state =
event.is_active;
343 if (new_state != child->last_state_) {
344 child->initial_state_published_ =
true;
345 child->last_state_ = new_state;
346 child->publish_state(new_state);
347#ifdef USE_ESP32_VARIANT_ESP32
348 ESP_LOGV(TAG,
"Touch Pad '%s' state: %s (value: %" PRIu32
", threshold: %" PRIu32
")",
349 child->get_name().c_str(), ONOFF(new_state), value, child->get_threshold());
352 ESP_LOGV(TAG,
"Touch Pad '%s' state: ON (value: %" PRIu32
", benchmark: %" PRIu32
", threshold: %" PRIu32
")",
353 child->get_name().c_str(), value, benchmark, child->get_threshold());
355 ESP_LOGV(TAG,
"Touch Pad '%s' state: OFF", child->get_name().c_str());
364 bool all_initial_published =
true;
367 if (!child->initial_state_published_) {
368 all_initial_published =
false;
421#if SOC_TOUCH_SUPPORT_SLEEP_WAKEUP
422 bool has_wakeup =
false;
424 if (child->get_wakeup_threshold() != 0) {
433#ifdef USE_ESP32_VARIANT_ESP32
435 touch_sleep_config_t sleep_cfg = TOUCH_SENSOR_DEFAULT_DSLP_CONFIG();
436 sleep_cfg.deep_slp_sens_cfg =
nullptr;
437 esp_err_t err = touch_sensor_config_sleep_wakeup(this->
sens_handle_, &sleep_cfg);
439 ESP_LOGW(TAG,
"Failed to configure touch sleep wakeup: %s", esp_err_to_name(err));
443 touch_channel_handle_t wakeup_chan =
nullptr;
445 for (
auto *child : this->children_) {
446 if (child->get_wakeup_threshold() != 0) {
447 wakeup_chan = child->chan_handle_;
448 wakeup_thresh = child->get_wakeup_threshold();
453 if (wakeup_chan !=
nullptr) {
454 touch_sleep_config_t sleep_cfg = TOUCH_SENSOR_DEFAULT_DSLP_CONFIG();
455 sleep_cfg.deep_slp_chan = wakeup_chan;
456 sleep_cfg.deep_slp_thresh[0] = wakeup_thresh;
457 sleep_cfg.deep_slp_sens_cfg =
nullptr;
458 esp_err_t err = touch_sensor_config_sleep_wakeup(this->
sens_handle_, &sleep_cfg);
460 ESP_LOGW(TAG,
"Failed to configure touch sleep wakeup: %s", esp_err_to_name(err));
470 if (child->chan_handle_ ==
nullptr)
474 touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_SMOOTH, &smooth_value);
475 child->value_ = smooth_value;
477#ifdef USE_ESP32_VARIANT_ESP32
478 ESP_LOGD(TAG,
"Touch Pad '%s' (Ch%d): %" PRIu32, child->get_name().c_str(), child->channel_id_, smooth_value);
481 touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_BENCHMARK, &benchmark);
482 child->benchmark_ = benchmark;
483 int32_t difference =
static_cast<int32_t
>(smooth_value) -
static_cast<int32_t
>(benchmark);
485 "Touch Pad '%s' (Ch%d): value=%" PRIu32
", benchmark=%" PRIu32
", difference=%" PRId32
486 " (set threshold < %" PRId32
" to detect touch)",
487 child->get_name().c_str(), child->channel_id_, smooth_value, benchmark, difference, difference);