Here is the code I still have it.
#include <lvgl.h>
#include <Ticker.h>
#include <TFT_eSPI.h>
#define LVGL_TICK_PERIOD 20
// GLOBAL LV objects
lv_obj_t * tabview;
lv_obj_t * tabThermostat;
lv_obj_t * tabMessage;
lv_obj_t * tabviewOnOff;
lv_obj_t * tabThermostatOn;
lv_obj_t * tabThermostatOff;
lv_obj_t * currentTemperatureOffBox;
lv_obj_t * targetTemperatureBox;
lv_obj_t * currentHumidityOnBox;
lv_obj_t * currentHumidityOffBox;
lv_obj_t * currentTemperatureOnBox;
lv_obj_t * messageLabel; // place to write the messages too.
Ticker tick; /* timer for interrupt handler /
TFT_eSPI tft = TFT_eSPI(); / TFT instance */
static lv_disp_buf_t disp_buf;
static lv_color_t buf[LV_HOR_RES_MAX * 10];
#if USE_LV_LOG != 0
/* Serial debugging */
void my_print(lv_log_level_t level, const char * file, uint32_t line, const char * dsc)
{
Serial.printf("%s@%d->%s\r\n", file, line, dsc);
delay(100);
}
#endif
/* Display flushing */
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
{
uint16_t c;
tft.startWrite(); /* Start new TFT transaction /
tft.setAddrWindow(area->x1, area->y1, (area->x2 - area->x1 + 1), (area->y2 - area->y1 + 1)); / set the working window /
for (int y = area->y1; y <= area->y2; y++) {
for (int x = area->x1; x <= area->x2; x++) {
c = color_p->full;
tft.writeColor(c, 1);
color_p++;
}
}
tft.endWrite(); / terminate TFT transaction /
lv_disp_flush_ready(disp); / tell lvgl that flushing is done */
}
/* Interrupt driven periodic handler */
static void lv_tick_handler(void)
{
lv_tick_inc(LVGL_TICK_PERIOD);
}
/* Reading input device (simulated encoder here) /
bool read_encoder(lv_indev_drv_t * indev, lv_indev_data_t * data)
{
static int32_t last_diff = 0;
int32_t diff = 0; / Dummy - no movement /
int btn_state = LV_INDEV_STATE_REL; / Dummy - no press */
data->enc_diff = diff - last_diff;;
data->state = btn_state;
last_diff = diff;
return false;
}
bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data)
{
uint16_t touchX, touchY;
bool touched = tft.getTouch(&touchX, &touchY, 600);
if(!touched) {
return false;
}
if(touchX > 480 || touchY > 320) {
Serial.println("X or y outside of expected parameters..");
Serial.print("y:");
Serial.print(touchX);
Serial.print(" x:");
Serial.print(touchY);
} else {
data->state = touched ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
/*Save the state and save the pressed coordinate*/
//if(data->state == LV_INDEV_STATE_PR) touchpad_get_xy(&last_x, &last_y);
/*Set the coordinates (if released use the last pressed coordinates)*/
data->point.x = touchX;
data->point.y = touchY;
Serial.print("Data x");
Serial.println(touchX);
Serial.print("Data y");
Serial.println(touchY);
}
return false; /*Return `false` because we are not buffering and no more data to read*/
}
void setup() {
Serial.begin(115200); /* prepare for possible serial debug */
lv_init();
#if USE_LV_LOG != 0
lv_log_register_print(my_print); /* register print function for debugging */
#endif
tft.begin(); /* TFT init /
tft.setRotation(1); / Landscape orientation */
lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * 10);
/Initialize the display/
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.hor_res = 480;
disp_drv.ver_res = 320;
disp_drv.flush_cb = my_disp_flush;
disp_drv.buffer = &disp_buf;
lv_disp_drv_register(&disp_drv);
/Initialize the touch pad/
lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv); /Descriptor of a input device driver/
indev_drv.type = LV_INDEV_TYPE_POINTER; /Touch pad is a pointer-like device/
indev_drv.read_cb = my_touchpad_read; /Set your driver function/
lv_indev_drv_register(&indev_drv); /Finally register the driver/
// Initialize the graphics library’s tick
tick.attach_ms(LVGL_TICK_PERIOD, lv_tick_handler);
tabviewOnOff = lv_tabview_create(lv_scr_act(), NULL);
// place the buttons on the left side
lv_tabview_set_btns_pos(tabviewOnOff, LV_TABVIEW_BTNS_POS_LEFT);
// Add 2 tabs (the tabs are page (lv_page) and can be scrolled
tabThermostatOn = lv_tabview_add_tab(tabviewOnOff, “On”);
tabThermostatOff = lv_tabview_add_tab(tabviewOnOff, “Off”);
// create the button
lv_obj_t * btnUp = lv_btn_create(tabThermostatOn, NULL);
lv_obj_set_size(btnUp, 370, 200);
// the thermostat tab to ON or OFF
lv_tabview_set_tab_act(tabviewOnOff, 1, LV_ANIM_OFF);
}
void loop() {
lv_task_handler(); /* let the GUI do its work */
delay(5);
}