25
25
#include <lvgl/lvgl.h>
26
26
#endif
27
27
#include "ft6x36.h"
28
-
29
28
#include "lvgl_i2c/i2c_manager.h"
30
29
31
30
#define TAG "FT6X36"
31
+ #define FT6X36_TOUCH_QUEUE_ELEMENTS 1
32
32
33
33
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
36
40
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 ) {
38
42
return lvgl_i2c_read (CONFIG_LV_I2C_TOUCH_PORT , slave_addr , register_addr , data_buf , 1 );
39
43
}
40
44
41
-
42
45
/**
43
46
* @brief Read the FT6x36 gesture ID. Initialize first!
44
47
* @param dev_addr: I2C FT6x36 Slave address.
@@ -84,7 +87,16 @@ void ft6x06_init(uint16_t dev_addr) {
84
87
85
88
ft6x06_i2c_read8 (dev_addr , FT6X36_RELEASECODE_REG , & data_buf );
86
89
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
88
100
}
89
101
90
102
/**
@@ -99,8 +111,6 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
99
111
return 0x00 ;
100
112
}
101
113
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
104
114
105
115
esp_err_t ret = lvgl_i2c_read (CONFIG_LV_I2C_TOUCH_PORT , current_dev_addr , FT6X36_TD_STAT_REG , & data_buf [0 ], 5 );
106
116
if (ret != ESP_OK ) {
@@ -109,29 +119,42 @@ bool ft6x36_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
109
119
uint8_t touch_pnt_cnt = data_buf [0 ]; // Number of detected touch points
110
120
111
121
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 ;
115
132
return false;
116
133
}
117
134
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 );
120
138
121
139
#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 ;
125
143
#endif
126
144
#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 ;
128
146
#endif
129
147
#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 ;
131
149
#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 ;
135
153
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
+
136
159
return false;
137
160
}
0 commit comments