mirror of
https://github.com/arendst/Tasmota.git
synced 2025-04-26 15:57:16 +00:00
LVGL prepare for Touch Screen calibration
This commit is contained in:
parent
9d5fd97b2f
commit
9b0a5b89fe
@ -1,5 +1,6 @@
|
|||||||
#include "Adafruit_LvGL_Glue.h"
|
#include "Adafruit_LvGL_Glue.h"
|
||||||
#include <lvgl.h>
|
#include <lvgl.h>
|
||||||
|
#include "lv_berry.h"
|
||||||
|
|
||||||
// ARCHITECTURE-SPECIFIC TIMER STUFF ---------------------------------------
|
// ARCHITECTURE-SPECIFIC TIMER STUFF ---------------------------------------
|
||||||
|
|
||||||
@ -12,29 +13,22 @@ static void lv_tick_handler(void) { lv_tick_inc(lv_tick_interval_ms); }
|
|||||||
|
|
||||||
// TOUCHSCREEN STUFF -------------------------------------------------------
|
// TOUCHSCREEN STUFF -------------------------------------------------------
|
||||||
|
|
||||||
// STMPE610 calibration for raw touch data
|
|
||||||
#define TS_MINX 100
|
|
||||||
#define TS_MAXX 3800
|
|
||||||
#define TS_MINY 100
|
|
||||||
#define TS_MAXY 3750
|
|
||||||
|
|
||||||
// Same, for ADC touchscreen
|
uint32_t Touch_Status(int32_t sel);
|
||||||
#define ADC_XMIN 325
|
|
||||||
#define ADC_XMAX 750
|
|
||||||
#define ADC_YMIN 240
|
|
||||||
#define ADC_YMAX 840
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t Touch_Status(uint32_t sel);
|
|
||||||
|
|
||||||
static void touchscreen_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) {
|
static void touchscreen_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) {
|
||||||
//lv_coord_t last_x = 0, last_y = 0;
|
|
||||||
//static uint8_t release_count = 0;
|
|
||||||
data->point.x = Touch_Status(1); // Last-pressed coordinates
|
data->point.x = Touch_Status(1); // Last-pressed coordinates
|
||||||
data->point.y = Touch_Status(2);
|
data->point.y = Touch_Status(2);
|
||||||
data->state = Touch_Status(0) ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED;
|
data->state = Touch_Status(0) ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED;
|
||||||
data->continue_reading = false; /*No buffering now so no more data read*/
|
data->continue_reading = false; /*No buffering now so no more data read*/
|
||||||
|
// keep data for TS calibration
|
||||||
|
lv_ts_calibration.state = data->state;
|
||||||
|
if (data->state == LV_INDEV_STATE_PRESSED) { // if not pressed, the data may be invalid
|
||||||
|
lv_ts_calibration.x = data->point.x;
|
||||||
|
lv_ts_calibration.y = data->point.y;
|
||||||
|
lv_ts_calibration.raw_x = Touch_Status(-1);
|
||||||
|
lv_ts_calibration.raw_y = Touch_Status(-2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// OTHER LITTLEVGL VITALS --------------------------------------------------
|
// OTHER LITTLEVGL VITALS --------------------------------------------------
|
||||||
|
@ -8,11 +8,14 @@
|
|||||||
|
|
||||||
#include "lvgl.h"
|
#include "lvgl.h"
|
||||||
#include "be_mapping.h"
|
#include "be_mapping.h"
|
||||||
|
#include "lv_berry.h"
|
||||||
#include "lv_theme_openhasp.h"
|
#include "lv_theme_openhasp.h"
|
||||||
|
|
||||||
extern int lv0_member(bvm *vm); // resolve virtual members
|
extern int lv0_member(bvm *vm); // resolve virtual members
|
||||||
extern int lv0_load_font(bvm *vm);
|
extern int lv0_load_font(bvm *vm);
|
||||||
|
|
||||||
|
extern lv_ts_calibration_t * lv_get_ts_calibration(void);
|
||||||
|
|
||||||
|
|
||||||
static int lv_get_hor_res(void) {
|
static int lv_get_hor_res(void) {
|
||||||
return lv_disp_get_hor_res(lv_disp_get_default());
|
return lv_disp_get_hor_res(lv_disp_get_default());
|
||||||
@ -62,6 +65,7 @@ const be_ntv_func_def_t lv_func[] = {
|
|||||||
{ "event_set_ext_draw_size", (void*) &lv_event_set_ext_draw_size, "", "(lv.lv_event)i" },
|
{ "event_set_ext_draw_size", (void*) &lv_event_set_ext_draw_size, "", "(lv.lv_event)i" },
|
||||||
{ "flex_init", (void*) &lv_flex_init, "", "" },
|
{ "flex_init", (void*) &lv_flex_init, "", "" },
|
||||||
{ "get_hor_res", (void*) &lv_get_hor_res, "i", "" },
|
{ "get_hor_res", (void*) &lv_get_hor_res, "i", "" },
|
||||||
|
{ "get_ts_calibration", (void*) &lv_get_ts_calibration, "lv.lv_ts_calibration", "" },
|
||||||
{ "get_ver_res", (void*) &lv_get_ver_res, "i", "" },
|
{ "get_ver_res", (void*) &lv_get_ver_res, "i", "" },
|
||||||
{ "grid_fr", (void*) &lv_grid_fr, "i", "i" },
|
{ "grid_fr", (void*) &lv_grid_fr, "i", "i" },
|
||||||
{ "grid_init", (void*) &lv_grid_init, "", "" },
|
{ "grid_init", (void*) &lv_grid_init, "", "" },
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
// Custom Tasmota functions
|
// Custom Tasmota functions
|
||||||
void lv_img_set_tasmota_logo(lv_obj_t * img);
|
void lv_img_set_tasmota_logo(lv_obj_t * img);
|
||||||
|
lv_ts_calibration_t * lv_get_ts_calibration(void);
|
||||||
|
|
||||||
// ======================================================================
|
// ======================================================================
|
||||||
// Artificial
|
// Artificial
|
||||||
|
@ -463,6 +463,18 @@ const be_ctypes_structure_t be_lv_event = {
|
|||||||
{ "user_data", 12, 0, 0, ctypes_ptr32, 0 },
|
{ "user_data", 12, 0, 0, ctypes_ptr32, 0 },
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
const be_ctypes_structure_t be_lv_ts_calibration = {
|
||||||
|
12, /* size in bytes */
|
||||||
|
5, /* number of elements */
|
||||||
|
be_ctypes_instance_mappings,
|
||||||
|
(const be_ctypes_structure_item_t[5]) {
|
||||||
|
{ "raw_x", 0, 0, 0, ctypes_i16, 0 },
|
||||||
|
{ "raw_y", 2, 0, 0, ctypes_i16, 0 },
|
||||||
|
{ "state", 8, 0, 0, ctypes_i32, 0 },
|
||||||
|
{ "x", 4, 0, 0, ctypes_i16, 0 },
|
||||||
|
{ "y", 6, 0, 0, ctypes_i16, 0 },
|
||||||
|
}};
|
||||||
|
|
||||||
static const char * be_ctypes_instance_mappings[] = {
|
static const char * be_ctypes_instance_mappings[] = {
|
||||||
"lv_color",
|
"lv_color",
|
||||||
NULL
|
NULL
|
||||||
@ -496,6 +508,7 @@ static be_define_ctypes_class(lv_meter_scale, &be_lv_meter_scale, &be_class_ctyp
|
|||||||
static be_define_ctypes_class(lv_obj_class, &be_lv_obj_class, &be_class_ctypes, "lv_obj_class");
|
static be_define_ctypes_class(lv_obj_class, &be_lv_obj_class, &be_class_ctypes, "lv_obj_class");
|
||||||
static be_define_ctypes_class(lv_point, &be_lv_point, &be_class_ctypes, "lv_point");
|
static be_define_ctypes_class(lv_point, &be_lv_point, &be_class_ctypes, "lv_point");
|
||||||
static be_define_ctypes_class(lv_sqrt_res, &be_lv_sqrt_res, &be_class_ctypes, "lv_sqrt_res");
|
static be_define_ctypes_class(lv_sqrt_res, &be_lv_sqrt_res, &be_class_ctypes, "lv_sqrt_res");
|
||||||
|
static be_define_ctypes_class(lv_ts_calibration, &be_lv_ts_calibration, &be_class_ctypes, "lv_ts_calibration");
|
||||||
|
|
||||||
void be_load_ctypes_lvgl_definitions_lib(bvm *vm) {
|
void be_load_ctypes_lvgl_definitions_lib(bvm *vm) {
|
||||||
ctypes_register_class(vm, &be_class_lv_area, &be_lv_area);
|
ctypes_register_class(vm, &be_class_lv_area, &be_lv_area);
|
||||||
@ -526,6 +539,7 @@ void be_load_ctypes_lvgl_definitions_lib(bvm *vm) {
|
|||||||
ctypes_register_class(vm, &be_class_lv_obj_class, &be_lv_obj_class);
|
ctypes_register_class(vm, &be_class_lv_obj_class, &be_lv_obj_class);
|
||||||
ctypes_register_class(vm, &be_class_lv_point, &be_lv_point);
|
ctypes_register_class(vm, &be_class_lv_point, &be_lv_point);
|
||||||
ctypes_register_class(vm, &be_class_lv_sqrt_res, &be_lv_sqrt_res);
|
ctypes_register_class(vm, &be_class_lv_sqrt_res, &be_lv_sqrt_res);
|
||||||
|
ctypes_register_class(vm, &be_class_lv_ts_calibration, &be_lv_ts_calibration);
|
||||||
}
|
}
|
||||||
|
|
||||||
be_ctypes_class_by_name_t be_ctypes_lvgl_classes[] = {
|
be_ctypes_class_by_name_t be_ctypes_lvgl_classes[] = {
|
||||||
@ -557,6 +571,7 @@ be_ctypes_class_by_name_t be_ctypes_lvgl_classes[] = {
|
|||||||
{ "lv_obj_class", &be_class_lv_obj_class },
|
{ "lv_obj_class", &be_class_lv_obj_class },
|
||||||
{ "lv_point", &be_class_lv_point },
|
{ "lv_point", &be_class_lv_point },
|
||||||
{ "lv_sqrt_res", &be_class_lv_sqrt_res },
|
{ "lv_sqrt_res", &be_class_lv_sqrt_res },
|
||||||
|
{ "lv_ts_calibration", &be_class_lv_ts_calibration },
|
||||||
};
|
};
|
||||||
const size_t be_ctypes_lvgl_classes_size = sizeof(be_ctypes_lvgl_classes)/sizeof(be_ctypes_lvgl_classes[0]);
|
const size_t be_ctypes_lvgl_classes_size = sizeof(be_ctypes_lvgl_classes)/sizeof(be_ctypes_lvgl_classes[0]);
|
||||||
|
|
||||||
|
@ -393,6 +393,18 @@ lv_event = [ # valid LVGL8
|
|||||||
]
|
]
|
||||||
lv_event = ctypes.structure(lv_event, "lv_event")
|
lv_event = ctypes.structure(lv_event, "lv_event")
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
# Special structure used to calibrate resistive touchscreens
|
||||||
|
#######################################################################
|
||||||
|
lv_ts_calibration = [ # valid LVGL8
|
||||||
|
[lv_coord, "raw_x"],
|
||||||
|
[lv_coord, "raw_y"],
|
||||||
|
[lv_coord, "x"],
|
||||||
|
[lv_coord, "y"],
|
||||||
|
[int32_t, "state"],
|
||||||
|
]
|
||||||
|
lv_ts_calibration = ctypes.structure(lv_ts_calibration, "lv_ts_calibration")
|
||||||
|
|
||||||
#
|
#
|
||||||
ctypes.print_classes("lvgl")
|
ctypes.print_classes("lvgl")
|
||||||
|
|
||||||
|
@ -228,6 +228,19 @@ int lv0_load_font(bvm *vm) {
|
|||||||
be_raise(vm, "type_error", NULL);
|
be_raise(vm, "type_error", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************************************\
|
||||||
|
* Get Touch Screen calibration information
|
||||||
|
\*********************************************************************************************/
|
||||||
|
lv_ts_calibration_t lv_ts_calibration = {
|
||||||
|
0, 0,
|
||||||
|
0, 0,
|
||||||
|
LV_INDEV_STATE_RELEASED
|
||||||
|
};
|
||||||
|
|
||||||
|
lv_ts_calibration_t * lv_get_ts_calibration(void) {
|
||||||
|
return &lv_ts_calibration;
|
||||||
|
}
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* LVGL top level virtual members
|
* LVGL top level virtual members
|
||||||
*
|
*
|
||||||
|
@ -27,6 +27,17 @@ extern void be_load_lvgl_classes(bvm *vm);
|
|||||||
// TODO temporary fix
|
// TODO temporary fix
|
||||||
extern void lv_img_set_tasmota_logo(lv_obj_t * img);
|
extern void lv_img_set_tasmota_logo(lv_obj_t * img);
|
||||||
|
|
||||||
|
// used for ToushScreen calibration
|
||||||
|
typedef struct lv_ts_calibration_t {
|
||||||
|
lv_coord_t raw_x;
|
||||||
|
lv_coord_t raw_y;
|
||||||
|
lv_coord_t x;
|
||||||
|
lv_coord_t y;
|
||||||
|
lv_indev_state_t state;
|
||||||
|
} lv_ts_calibration_t;
|
||||||
|
extern lv_ts_calibration_t lv_ts_calibration;
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -134,6 +134,7 @@ return_types = {
|
|||||||
"lv_theme_t *": "lv_theme",
|
"lv_theme_t *": "lv_theme",
|
||||||
"lv_disp_t *": "lv_disp",
|
"lv_disp_t *": "lv_disp",
|
||||||
"lv_indev_t *": "lv_indev",
|
"lv_indev_t *": "lv_indev",
|
||||||
|
"lv_ts_calibration_t *": "lv_ts_calibration",
|
||||||
#"lv_disp_t*": "lv_disp",
|
#"lv_disp_t*": "lv_disp",
|
||||||
#"lv_style_list_t*": "",
|
#"lv_style_list_t*": "",
|
||||||
|
|
||||||
@ -671,11 +672,14 @@ print("""/********************************************************************
|
|||||||
|
|
||||||
#include "lvgl.h"
|
#include "lvgl.h"
|
||||||
#include "be_mapping.h"
|
#include "be_mapping.h"
|
||||||
|
#include "lv_berry.h"
|
||||||
#include "lv_theme_openhasp.h"
|
#include "lv_theme_openhasp.h"
|
||||||
|
|
||||||
extern int lv0_member(bvm *vm); // resolve virtual members
|
extern int lv0_member(bvm *vm); // resolve virtual members
|
||||||
extern int lv0_load_font(bvm *vm);
|
extern int lv0_load_font(bvm *vm);
|
||||||
|
|
||||||
|
extern lv_ts_calibration_t * lv_get_ts_calibration(void);
|
||||||
|
|
||||||
|
|
||||||
static int lv_get_hor_res(void) {
|
static int lv_get_hor_res(void) {
|
||||||
return lv_disp_get_hor_res(lv_disp_get_default());
|
return lv_disp_get_hor_res(lv_disp_get_default());
|
||||||
|
@ -86,6 +86,7 @@ print("""
|
|||||||
|
|
||||||
// Custom Tasmota functions
|
// Custom Tasmota functions
|
||||||
void lv_img_set_tasmota_logo(lv_obj_t * img);
|
void lv_img_set_tasmota_logo(lv_obj_t * img);
|
||||||
|
lv_ts_calibration_t * lv_get_ts_calibration(void);
|
||||||
|
|
||||||
// ======================================================================
|
// ======================================================================
|
||||||
// Artificial
|
// Artificial
|
||||||
|
@ -31,6 +31,8 @@
|
|||||||
|
|
||||||
bool FT5206_found = false;
|
bool FT5206_found = false;
|
||||||
bool XPT2046_found = false;
|
bool XPT2046_found = false;
|
||||||
|
int16_t raw_touch_xp;
|
||||||
|
int16_t raw_touch_yp;
|
||||||
int16_t touch_xp;
|
int16_t touch_xp;
|
||||||
int16_t touch_yp;
|
int16_t touch_yp;
|
||||||
bool touched;
|
bool touched;
|
||||||
@ -43,7 +45,7 @@ bool touched;
|
|||||||
VButton *buttons[MAX_TOUCH_BUTTONS];
|
VButton *buttons[MAX_TOUCH_BUTTONS];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint32_t Touch_Status(uint32_t sel) {
|
uint32_t Touch_Status(int32_t sel) {
|
||||||
if (FT5206_found || XPT2046_found) {
|
if (FT5206_found || XPT2046_found) {
|
||||||
switch (sel) {
|
switch (sel) {
|
||||||
case 0:
|
case 0:
|
||||||
@ -52,6 +54,10 @@ uint32_t Touch_Status(uint32_t sel) {
|
|||||||
return touch_xp;
|
return touch_xp;
|
||||||
case 2:
|
case 2:
|
||||||
return touch_yp;
|
return touch_yp;
|
||||||
|
case -1: // before calibration
|
||||||
|
return raw_touch_xp;
|
||||||
|
case -2:
|
||||||
|
return raw_touch_yp;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
@ -141,8 +147,9 @@ void Touch_Check(void(*rotconvert)(int16_t *x, int16_t *y)) {
|
|||||||
}
|
}
|
||||||
#endif // USE_XPT2046
|
#endif // USE_XPT2046
|
||||||
|
|
||||||
|
raw_touch_xp = touch_xp;
|
||||||
|
raw_touch_yp = touch_yp;
|
||||||
if (touched) {
|
if (touched) {
|
||||||
AddLog(LOG_LEVEL_DEBUG_MORE, "TS : touched x=%i y=%i", touch_xp, touch_yp);
|
|
||||||
#ifdef USE_TOUCH_BUTTONS
|
#ifdef USE_TOUCH_BUTTONS
|
||||||
#ifdef USE_M5STACK_CORE2
|
#ifdef USE_M5STACK_CORE2
|
||||||
// handle 3 built in touch buttons
|
// handle 3 built in touch buttons
|
||||||
@ -165,6 +172,7 @@ void Touch_Check(void(*rotconvert)(int16_t *x, int16_t *y)) {
|
|||||||
#endif // USE_TOUCH_BUTTONS
|
#endif // USE_TOUCH_BUTTONS
|
||||||
|
|
||||||
rotconvert(&touch_xp, &touch_yp);
|
rotconvert(&touch_xp, &touch_yp);
|
||||||
|
AddLog(LOG_LEVEL_DEBUG_MORE, "TS : touched x=%i y=%i (raw x=%i y=%i)", touch_xp, touch_yp, raw_touch_xp, raw_touch_yp);
|
||||||
|
|
||||||
#ifdef USE_TOUCH_BUTTONS
|
#ifdef USE_TOUCH_BUTTONS
|
||||||
CheckTouchButtons(touched, touch_xp, touch_yp);
|
CheckTouchButtons(touched, touch_xp, touch_yp);
|
||||||
@ -290,8 +298,8 @@ void CheckTouchButtons(bool touched, int16_t touch_x, int16_t touch_y) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
touch_xp = 0;
|
raw_touch_xp = touch_xp = 0;
|
||||||
touch_yp = 0;
|
raw_touch_yp = touch_yp = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // USE_TOUCH_BUTTONS
|
#endif // USE_TOUCH_BUTTONS
|
||||||
@ -321,7 +329,7 @@ bool Xdrv55(uint8_t function) {
|
|||||||
#else // #if defined(USE_FT5206) || defined(USE_XPT2046) || defined(USE_LILYGO47) || defined(USE_TOUCH_BUTTONS)
|
#else // #if defined(USE_FT5206) || defined(USE_XPT2046) || defined(USE_LILYGO47) || defined(USE_TOUCH_BUTTONS)
|
||||||
|
|
||||||
// dummy for LVGL without a touch controller
|
// dummy for LVGL without a touch controller
|
||||||
uint32_t Touch_Status(uint32_t sel) {
|
uint32_t Touch_Status(int32_t sel) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user