forked from espressif/esp-idf
feat(touch): support touch v1 test cases
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -10,12 +10,13 @@
|
|||||||
#include "unity.h"
|
#include "unity.h"
|
||||||
#include "driver/touch_sens.h"
|
#include "driver/touch_sens.h"
|
||||||
#include "hal/touch_sensor_ll.h"
|
#include "hal/touch_sensor_ll.h"
|
||||||
#include "esp_private/touch_sens_helper.h"
|
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
|
|
||||||
static touch_sensor_sample_config_t s_sample_cfg[TOUCH_SAMPLE_CFG_NUM] = {
|
static touch_sensor_sample_config_t s_sample_cfg[TOUCH_SAMPLE_CFG_NUM] = {
|
||||||
#if SOC_TOUCH_SENSOR_VERSION == 2
|
#if SOC_TOUCH_SENSOR_VERSION == 1
|
||||||
|
TOUCH_SENSOR_V1_DEFAULT_SAMPLE_CONFIG(5.0, TOUCH_VOLT_LIM_L_0V5, TOUCH_VOLT_LIM_H_1V7),
|
||||||
|
#elif SOC_TOUCH_SENSOR_VERSION == 2
|
||||||
TOUCH_SENSOR_V2_DEFAULT_SAMPLE_CONFIG(500, TOUCH_VOLT_LIM_L_0V5, TOUCH_VOLT_LIM_H_2V2),
|
TOUCH_SENSOR_V2_DEFAULT_SAMPLE_CONFIG(500, TOUCH_VOLT_LIM_L_0V5, TOUCH_VOLT_LIM_H_2V2),
|
||||||
#elif SOC_TOUCH_SENSOR_VERSION == 3
|
#elif SOC_TOUCH_SENSOR_VERSION == 3
|
||||||
TOUCH_SENSOR_V3_DEFAULT_SAMPLE_CONFIG(1, 1, 1),
|
TOUCH_SENSOR_V3_DEFAULT_SAMPLE_CONFIG(1, 1, 1),
|
||||||
@@ -27,7 +28,12 @@ static touch_sensor_sample_config_t s_sample_cfg[TOUCH_SAMPLE_CFG_NUM] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static touch_channel_config_t s_chan_cfg = {
|
static touch_channel_config_t s_chan_cfg = {
|
||||||
#if SOC_TOUCH_SENSOR_VERSION == 2
|
#if SOC_TOUCH_SENSOR_VERSION == 1
|
||||||
|
.abs_active_thresh = {1000},
|
||||||
|
.charge_speed = TOUCH_CHARGE_SPEED_7,
|
||||||
|
.init_charge_volt = TOUCH_INIT_CHARGE_VOLT_LOW,
|
||||||
|
.group = TOUCH_CHAN_TRIG_GROUP_BOTH,
|
||||||
|
#elif SOC_TOUCH_SENSOR_VERSION == 2
|
||||||
.active_thresh = {
|
.active_thresh = {
|
||||||
2000,
|
2000,
|
||||||
},
|
},
|
||||||
@@ -77,15 +83,24 @@ TEST_CASE("touch_sens_install_uninstall_test", "[touch]")
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
int active_count;
|
int active_count;
|
||||||
int inactive_count;
|
int inactive_count;
|
||||||
|
#if SOC_TOUCH_SENSOR_VERSION == 1
|
||||||
|
int hw_active_count;
|
||||||
|
#endif
|
||||||
} test_touch_cb_data_t;
|
} test_touch_cb_data_t;
|
||||||
|
|
||||||
static touch_channel_config_t s_test_get_chan_cfg_by_benchmark(uint32_t benchmark[], uint32_t num, float coeff)
|
static touch_channel_config_t s_test_get_chan_cfg_by_benchmark(uint32_t benchmark[], uint32_t num, float coeff)
|
||||||
{
|
{
|
||||||
touch_channel_config_t chan_cfg = {};
|
touch_channel_config_t chan_cfg = s_chan_cfg;
|
||||||
for (int i = 0; i < num; i++) {
|
for (int i = 0; i < num; i++) {
|
||||||
|
#if SOC_TOUCH_SENSOR_VERSION == 1
|
||||||
|
chan_cfg.abs_active_thresh[i] = benchmark[i] * (1 - coeff);
|
||||||
|
printf("[Sampler %d] benchmark %5"PRIu32" abs thresh %4"PRIu32"\n",
|
||||||
|
i, benchmark[i], chan_cfg.abs_active_thresh[i]);
|
||||||
|
#else
|
||||||
chan_cfg.active_thresh[i] = benchmark[i] * coeff;
|
chan_cfg.active_thresh[i] = benchmark[i] * coeff;
|
||||||
printf("[Sampler %d] benchmark %5"PRIu32" thresh %4"PRIu32"\n",
|
printf("[Sampler %d] benchmark %5"PRIu32" thresh %4"PRIu32"\n",
|
||||||
i, benchmark[i], chan_cfg.active_thresh[i]);
|
i, benchmark[i], chan_cfg.active_thresh[i]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return chan_cfg;
|
return chan_cfg;
|
||||||
}
|
}
|
||||||
@@ -108,6 +123,15 @@ static void s_test_touch_do_initial_scanning(touch_sensor_handle_t touch, int sc
|
|||||||
#define TEST_TCH_IRAM_ATTR
|
#define TEST_TCH_IRAM_ATTR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if SOC_TOUCH_SENSOR_VERSION == 1
|
||||||
|
static bool TEST_TCH_IRAM_ATTR s_test_touch_on_hw_active_callback(touch_sensor_handle_t sens_handle, const touch_hw_active_event_data_t *event, void *user_ctx)
|
||||||
|
{
|
||||||
|
test_touch_cb_data_t *cb_data = (test_touch_cb_data_t *)user_ctx;
|
||||||
|
cb_data->hw_active_count++;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool TEST_TCH_IRAM_ATTR s_test_touch_on_active_callback(touch_sensor_handle_t sens_handle, const touch_active_event_data_t *event, void *user_ctx)
|
static bool TEST_TCH_IRAM_ATTR s_test_touch_on_active_callback(touch_sensor_handle_t sens_handle, const touch_active_event_data_t *event, void *user_ctx)
|
||||||
{
|
{
|
||||||
ESP_EARLY_LOGI("touch_callback", "[CH %d] active", (int)event->chan_id);
|
ESP_EARLY_LOGI("touch_callback", "[CH %d] active", (int)event->chan_id);
|
||||||
@@ -126,7 +150,7 @@ static bool TEST_TCH_IRAM_ATTR s_test_touch_on_inactive_callback(touch_sensor_ha
|
|||||||
|
|
||||||
static void s_test_touch_simulate_touch(touch_sensor_handle_t touch, touch_channel_handle_t touch_chan, bool active)
|
static void s_test_touch_simulate_touch(touch_sensor_handle_t touch, touch_channel_handle_t touch_chan, bool active)
|
||||||
{
|
{
|
||||||
#if SOC_TOUCH_SENSOR_VERSION == 2
|
#if SOC_TOUCH_SENSOR_VERSION <= 2
|
||||||
touch_chan_info_t chan_info = {};
|
touch_chan_info_t chan_info = {};
|
||||||
touch_sensor_get_channel_info(touch_chan, &chan_info);
|
touch_sensor_get_channel_info(touch_chan, &chan_info);
|
||||||
touch_ll_set_charge_speed(chan_info.chan_id, active ? TOUCH_CHARGE_SPEED_4 : TOUCH_CHARGE_SPEED_7);
|
touch_ll_set_charge_speed(chan_info.chan_id, active ? TOUCH_CHARGE_SPEED_4 : TOUCH_CHARGE_SPEED_7);
|
||||||
@@ -169,7 +193,12 @@ TEST_CASE("touch_sens_active_inactive_test", "[touch]")
|
|||||||
|
|
||||||
/* Read benchmark */
|
/* Read benchmark */
|
||||||
uint32_t benchmark[TOUCH_SAMPLE_CFG_NUM] = {0};
|
uint32_t benchmark[TOUCH_SAMPLE_CFG_NUM] = {0};
|
||||||
TEST_ESP_OK(touch_channel_read_data(touch_chan, TOUCH_CHAN_DATA_TYPE_BENCHMARK, benchmark));
|
#if SOC_TOUCH_SUPPORT_BENCHMARK
|
||||||
|
touch_chan_data_type_t data_type = TOUCH_CHAN_DATA_TYPE_BENCHMARK;
|
||||||
|
#else
|
||||||
|
touch_chan_data_type_t data_type = TOUCH_CHAN_DATA_TYPE_SMOOTH;
|
||||||
|
#endif // SOC_TOUCH_SUPPORT_BENCHMARK
|
||||||
|
TEST_ESP_OK(touch_channel_read_data(touch_chan, data_type, benchmark));
|
||||||
/* Test whether success to finish the initial scanning */
|
/* Test whether success to finish the initial scanning */
|
||||||
for (int i = 0; i < TOUCH_SAMPLE_CFG_NUM; i++) {
|
for (int i = 0; i < TOUCH_SAMPLE_CFG_NUM; i++) {
|
||||||
TEST_ASSERT_GREATER_THAN(0, benchmark[i]);
|
TEST_ASSERT_GREATER_THAN(0, benchmark[i]);
|
||||||
@@ -177,10 +206,12 @@ TEST_CASE("touch_sens_active_inactive_test", "[touch]")
|
|||||||
/* Re-configure the threshold according to the benchmark */
|
/* Re-configure the threshold according to the benchmark */
|
||||||
touch_channel_config_t chan_cfg = s_test_get_chan_cfg_by_benchmark(benchmark, TOUCH_SAMPLE_CFG_NUM, TEST_ACTIVE_THRESH_RATIO);
|
touch_channel_config_t chan_cfg = s_test_get_chan_cfg_by_benchmark(benchmark, TOUCH_SAMPLE_CFG_NUM, TEST_ACTIVE_THRESH_RATIO);
|
||||||
TEST_ESP_OK(touch_sensor_reconfig_channel(touch_chan, &chan_cfg));
|
TEST_ESP_OK(touch_sensor_reconfig_channel(touch_chan, &chan_cfg));
|
||||||
|
|
||||||
touch_event_callbacks_t callbacks = {
|
touch_event_callbacks_t callbacks = {
|
||||||
.on_active = s_test_touch_on_active_callback,
|
.on_active = s_test_touch_on_active_callback,
|
||||||
.on_inactive = s_test_touch_on_inactive_callback,
|
.on_inactive = s_test_touch_on_inactive_callback,
|
||||||
|
#if SOC_TOUCH_SENSOR_VERSION == 1
|
||||||
|
.on_hw_active = s_test_touch_on_hw_active_callback,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
test_touch_cb_data_t cb_data = {};
|
test_touch_cb_data_t cb_data = {};
|
||||||
TEST_ESP_OK(touch_sensor_register_callbacks(touch, &callbacks, &cb_data));
|
TEST_ESP_OK(touch_sensor_register_callbacks(touch, &callbacks, &cb_data));
|
||||||
@@ -196,13 +227,13 @@ TEST_CASE("touch_sens_active_inactive_test", "[touch]")
|
|||||||
s_test_touch_log_data(touch_chan, TOUCH_SAMPLE_CFG_NUM, "Data Before");
|
s_test_touch_log_data(touch_chan, TOUCH_SAMPLE_CFG_NUM, "Data Before");
|
||||||
// Simulate touch
|
// Simulate touch
|
||||||
s_test_touch_simulate_touch(touch, touch_chan, true);
|
s_test_touch_simulate_touch(touch, touch_chan, true);
|
||||||
vTaskDelay(pdMS_TO_TICKS(50));
|
vTaskDelay(pdMS_TO_TICKS(100));
|
||||||
|
|
||||||
// Read data after touched
|
// Read data after touched
|
||||||
s_test_touch_log_data(touch_chan, TOUCH_SAMPLE_CFG_NUM, "Data After ");
|
s_test_touch_log_data(touch_chan, TOUCH_SAMPLE_CFG_NUM, "Data After ");
|
||||||
// Simulate release
|
// Simulate release
|
||||||
s_test_touch_simulate_touch(touch, touch_chan, false);
|
s_test_touch_simulate_touch(touch, touch_chan, false);
|
||||||
vTaskDelay(pdMS_TO_TICKS(50));
|
vTaskDelay(pdMS_TO_TICKS(100));
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
@@ -212,6 +243,12 @@ TEST_CASE("touch_sens_active_inactive_test", "[touch]")
|
|||||||
TEST_ESP_OK(touch_sensor_del_controller(touch));
|
TEST_ESP_OK(touch_sensor_del_controller(touch));
|
||||||
|
|
||||||
/* Check the callback count */
|
/* Check the callback count */
|
||||||
|
#if SOC_TOUCH_SENSOR_VERSION == 1
|
||||||
|
// The Touch V1 interrupt will keep triggering as long as the channel data is below the threshold
|
||||||
|
// So it might be greater than the touch count
|
||||||
|
printf("hardware active interrupt count: %d\n", cb_data.hw_active_count);
|
||||||
|
TEST_ASSERT_GREATER_OR_EQUAL_UINT32(touch_cnt, cb_data.hw_active_count);
|
||||||
|
#endif // SOC_TOUCH_SENSOR_VERSION == 1
|
||||||
TEST_ASSERT_EQUAL_INT32(touch_cnt, cb_data.active_count);
|
TEST_ASSERT_EQUAL_INT32(touch_cnt, cb_data.active_count);
|
||||||
TEST_ASSERT_EQUAL_INT32(touch_cnt, cb_data.inactive_count);
|
TEST_ASSERT_EQUAL_INT32(touch_cnt, cb_data.inactive_count);
|
||||||
}
|
}
|
||||||
|
@@ -1,2 +1,2 @@
|
|||||||
CONFIG_FREERTOS_HZ=1000
|
CONFIG_FREERTOS_HZ=1000
|
||||||
CONFIG_ESP_TASK_WDT=n
|
CONFIG_ESP_TASK_WDT_INIT=n
|
||||||
|
Reference in New Issue
Block a user