ESP-IDF CST816S touch panel gesture's
Posted: Sat Jan 06, 2024 7:54 pm
Hello, i have a problem with adding gesture recognition in my code so could someone help me to add it? Also as i know CST816S should already transfer gesture types(it is so with arduino library) but in esp-idf component there are no functions that gives me them. So wether help me to add it in my code or modify component please. Thank you!
Code: Select all
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "sdkconfig.h"
#include "audio_element.h"
#include "audio_pipeline.h"
#include "audio_event_iface.h"
#include "audio_common.h"
#include "fatfs_stream.h"
#include "i2s_stream.h"
#include "mp3_decoder.h"
#include "esp_peripherals.h"
#include "periph_sdcard.h"
#include "board.h"
#include "esp_lcd_touch.h"
#include "esp_lcd_touch_cst816s.h"
static const char *TAG = "PLAY_SDCARD_MUSIC";
static SemaphoreHandle_t touch_mux;
esp_lcd_panel_io_handle_t tp_io_handle = NULL;
esp_lcd_panel_io_i2c_config_t tp_io_config = ESP_LCD_TOUCH_IO_I2C_CST816S_CONFIG();
uint16_t touch_x[1];
uint16_t touch_y[1];
uint16_t touch_strength[1];
uint8_t touch_cnt = 0;
static void touch_callback(esp_lcd_touch_handle_t tp)
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xSemaphoreGiveFromISR(touch_mux, &xHigherPriorityTaskWoken);
if (xHigherPriorityTaskWoken) {
portYIELD_FROM_ISR();
}
}
void app_main(void)
{
touch_mux = xSemaphoreCreateBinary();
esp_lcd_touch_handle_t tp = NULL;
esp_lcd_panel_io_handle_t tp_io_handle = NULL;
const i2c_config_t i2c_conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = GPIO_NUM_6,
.scl_io_num = GPIO_NUM_7,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = 400000,
};
ESP_LOGI(TAG,"Initializing I2C for display touch");
/* Initialize I2C */
ESP_ERROR_CHECK(i2c_param_config(I2C_NUM_0, &i2c_conf));
ESP_ERROR_CHECK(i2c_driver_install(I2C_NUM_0, i2c_conf.mode, 0, 0, 0));
esp_lcd_panel_io_i2c_config_t tp_io_config = ESP_LCD_TOUCH_IO_I2C_CST816S_CONFIG();
ESP_LOGI(TAG,"esp_lcd_new_panel_io_i2c");
ESP_ERROR_CHECK(esp_lcd_new_panel_io_i2c((esp_lcd_i2c_bus_handle_t)I2C_NUM_0, &tp_io_config, &tp_io_handle));
esp_lcd_touch_config_t tp_cfg = {
.x_max = 240,
.y_max = 240,
.rst_gpio_num = 13,
.int_gpio_num = 5,
.levels = {
.reset = 0,
.interrupt = 0,
},
.flags = {
.swap_xy = 0,
.mirror_x = 1,
.mirror_y = 0,
},
.interrupt_callback = touch_callback,
};
esp_lcd_touch_new_i2c_cst816s(tp_io_handle, &tp_cfg, &tp);
while(1) {
if (xSemaphoreTake(touch_mux, 10) == pdTRUE) {
esp_lcd_touch_read_data(tp); // read only when ISR was triggled
bool touchpad_pressed = esp_lcd_touch_get_coordinates(tp, touch_x, touch_y, touch_strength, &touch_cnt, 1);
//gesture recognition
}
}
}