2525#include <lvgl/lvgl.h>
2626#endif
2727#include "ft6x36.h"
28-
2928#include "lvgl_i2c/i2c_manager.h"
3029
3130#define TAG "FT6X36"
31+ #define FT6X36_TOUCH_QUEUE_ELEMENTS 1
3232
3333
34- ft6x36_status_t ft6x36_status ;
35- uint8_t current_dev_addr ; // set during init
34+ static ft6x36_status_t ft6x36_status ;
35+ static uint8_t current_dev_addr ; // set during init
36+ static ft6x36_touch_t touch_inputs = { -1 , -1 , LV_INDEV_STATE_REL }; // -1 coordinates to designate it was never touched
37+ #if CONFIG_LV_FT6X36_COORDINATES_QUEUE
38+ QueueHandle_t ft6x36_touch_queue_handle ;
39+ #endif
3640
37- esp_err_t ft6x06_i2c_read8 (uint8_t slave_addr , uint8_t register_addr , uint8_t * data_buf ) {
41+ static esp_err_t ft6x06_i2c_read8 (uint8_t slave_addr , uint8_t register_addr , uint8_t * data_buf ) {
3842 return lvgl_i2c_read (CONFIG_LV_I2C_TOUCH_PORT , slave_addr , register_addr , data_buf , 1 );
3943}
4044
41-
4245/**
4346 * @brief Read the FT6x36 gesture ID. Initialize first!
4447 * @param dev_addr: I2C FT6x36 Slave address.
@@ -84,7 +87,16 @@ void ft6x06_init(uint16_t dev_addr) {
8487
8588 ft6x06_i2c_read8 (dev_addr , FT6X36_RELEASECODE_REG , & data_buf );
8689 ESP_LOGI (TAG , "\tRelease code: 0x%02x" , data_buf );
87-
90+
91+ #if CONFIG_LV_FT6X36_COORDINATES_QUEUE
92+ ft6x36_touch_queue_handle = xQueueCreate ( FT6X36_TOUCH_QUEUE_ELEMENTS , sizeof ( ft6x36_touch_t ) );
93+ if ( ft6x36_touch_queue_handle == NULL )
94+ {
95+ ESP_LOGE ( TAG , "\tError creating touch input FreeRTOS queue" );
96+ return ;
97+ }
98+ xQueueSend ( ft6x36_touch_queue_handle , & touch_inputs , 0 );
99+ #endif
88100}
89101
90102/**
@@ -99,8 +111,6 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
99111 return 0x00 ;
100112 }
101113 uint8_t data_buf [5 ]; // 1 byte status, 2 bytes X, 2 bytes Y
102- static int16_t last_x = 0 ; // 12bit pixel value
103- static int16_t last_y = 0 ; // 12bit pixel value
104114
105115 esp_err_t ret = lvgl_i2c_read (CONFIG_LV_I2C_TOUCH_PORT , current_dev_addr , FT6X36_TD_STAT_REG , & data_buf [0 ], 5 );
106116 if (ret != ESP_OK ) {
@@ -109,29 +119,42 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
109119 uint8_t touch_pnt_cnt = data_buf [0 ]; // Number of detected touch points
110120
111121 if (ret != ESP_OK || touch_pnt_cnt != 1 ) { // ignore no touch & multi touch
112- data -> point .x = last_x ;
113- data -> point .y = last_y ;
114- data -> state = LV_INDEV_STATE_REL ;
122+ if ( touch_inputs .current_state != LV_INDEV_STATE_REL )
123+ {
124+ touch_inputs .current_state = LV_INDEV_STATE_REL ;
125+ #if CONFIG_LV_FT6X36_COORDINATES_QUEUE
126+ xQueueOverwrite ( ft6x36_touch_queue_handle , & touch_inputs );
127+ #endif
128+ }
129+ data -> point .x = touch_inputs .last_x ;
130+ data -> point .y = touch_inputs .last_y ;
131+ data -> state = touch_inputs .current_state ;
115132 return false;
116133 }
117134
118- last_x = ((data_buf [1 ] & FT6X36_MSB_MASK ) << 8 ) | (data_buf [2 ] & FT6X36_LSB_MASK );
119- last_y = ((data_buf [3 ] & FT6X36_MSB_MASK ) << 8 ) | (data_buf [4 ] & FT6X36_LSB_MASK );
135+ touch_inputs .current_state = LV_INDEV_STATE_PR ;
136+ touch_inputs .last_x = ((data_buf [1 ] & FT6X36_MSB_MASK ) << 8 ) | (data_buf [2 ] & FT6X36_LSB_MASK );
137+ touch_inputs .last_y = ((data_buf [3 ] & FT6X36_MSB_MASK ) << 8 ) | (data_buf [4 ] & FT6X36_LSB_MASK );
120138
121139#if CONFIG_LV_FT6X36_SWAPXY
122- int16_t swap_buf = last_x ;
123- last_x = last_y ;
124- last_y = swap_buf ;
140+ int16_t swap_buf = touch_inputs . last_x ;
141+ touch_inputs . last_x = touch_inputs . last_y ;
142+ touch_inputs . last_y = swap_buf ;
125143#endif
126144#if CONFIG_LV_FT6X36_INVERT_X
127- last_x = LV_HOR_RES - last_x ;
145+ touch_inputs . last_x = LV_HOR_RES - touch_inputs . last_x ;
128146#endif
129147#if CONFIG_LV_FT6X36_INVERT_Y
130- last_y = LV_VER_RES - last_y ;
148+ touch_inputs . last_y = LV_VER_RES - touch_inputs . last_y ;
131149#endif
132- data -> point .x = last_x ;
133- data -> point .y = last_y ;
134- data -> state = LV_INDEV_STATE_PR ;
150+ data -> point .x = touch_inputs . last_x ;
151+ data -> point .y = touch_inputs . last_y ;
152+ data -> state = touch_inputs . current_state ;
135153 ESP_LOGD (TAG , "X=%u Y=%u" , data -> point .x , data -> point .y );
154+
155+ #if CONFIG_LV_FT6X36_COORDINATES_QUEUE
156+ xQueueOverwrite ( ft6x36_touch_queue_handle , & touch_inputs );
157+ #endif
158+
136159 return false;
137160}
0 commit comments