Files
lvgl_test_esp32/src/main.cpp
2022-01-31 15:38:41 +01:00

270 lines
6.9 KiB
C++

#include <Arduino.h>
#include <Wire.h>
#include <SPI.h>
#include <TFT_eSPI.h>
#include "FT62XXTouchScreen.h"
TFT_eSPI tft = TFT_eSPI();
FT62XXTouchScreen touchScreen = FT62XXTouchScreen(TFT_WIDTH, PIN_SDA, PIN_SCL);
#include "lvgl.h"
#include "widgets/meter/lv_meter.h"
#include "esp_freertos_hooks.h"
static lv_disp_buf_t disp_buf;
static lv_color_t buf[LV_HOR_RES_MAX * 10];
lv_obj_t *screenMain;
lv_obj_t *tabview;
lv_obj_t *tab1;
lv_obj_t *label;
lv_obj_t *btn1;
lv_obj_t *btn2;
lv_obj_t *tab2;
lv_obj_t *guage;
lv_obj_t *meter;
static void event_handler_btn(lv_obj_t * obj, lv_event_t event){
if(event == LV_EVENT_CLICKED) {
if (obj == btn1)
lv_label_set_text(label, "Hello");
else if (obj == btn2){
lv_label_set_text(label, "Goodbye");
}
}
}
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
{
uint32_t w = (area->x2 - area->x1 + 1);
uint32_t h = (area->y2 - area->y1 + 1);
tft.startWrite();
tft.setAddrWindow(area->x1, area->y1, w, h);
tft.pushColors(&color_p->full, w * h, true);
tft.endWrite();
lv_disp_flush_ready(disp);
}
uint16_t lastx = 0;
uint16_t lasty = 0;
bool my_input_read2(lv_indev_drv_t * drv, lv_indev_data_t*data) {
Serial.println("#");
TouchPoint touchPos = touchScreen.read();
if (touchPos.touched) {
Serial.println(String(touchPos.xPos) + ": " + String(touchPos.yPos));
data->state = LV_INDEV_STATE_PR;
data->point.x = touchPos.xPos;
data->point.y = touchPos.yPos;
lastx = touchPos.xPos;
lasty = touchPos.yPos;
} else {
data->state = LV_INDEV_STATE_REL;
data->point.x = lastx;
data->point.y = lasty;
}
return false;
}
static void lv_tick_task(void)
{
lv_tick_inc(portTICK_RATE_MS);
}
// static void set_value(void * indic, int32_t v)
// {
// lv_meter_set_indicator_end_value(meter, indic, v);
// }
/**
* A meter with multiple arcs
*/
// void lv_example_meter_2(void)
// {
// meter = lv_meter_create(lv_scr_act());
// lv_obj_center(meter);
// lv_obj_set_size(meter, 200, 200);
// /*Remove the circle from the middle*/
// lv_obj_remove_style(meter, NULL, LV_PART_INDICATOR);
// /*Add a scale first*/
// lv_meter_scale_t * scale = lv_meter_add_scale(meter);
// lv_meter_set_scale_ticks(meter, scale, 11, 2, 10, lv_palette_main(LV_PALETTE_GREY));
// lv_meter_set_scale_major_ticks(meter, scale, 1, 2, 30, lv_color_hex3(0xeee), 15);
// lv_meter_set_scale_range(meter, scale, 0, 100, 270, 90);
// /*Add a three arc indicator*/
// lv_meter_indicator_t * indic1 = lv_meter_add_arc(meter, scale, 10, lv_palette_main(LV_PALETTE_RED), 0);
// lv_meter_indicator_t * indic2 = lv_meter_add_arc(meter, scale, 10, lv_palette_main(LV_PALETTE_GREEN), -10);
// lv_meter_indicator_t * indic3 = lv_meter_add_arc(meter, scale, 10, lv_palette_main(LV_PALETTE_BLUE), -20);
// /*Create an animation to set the value*/
// lv_anim_t a;
// lv_anim_init(&a);
// lv_anim_set_exec_cb(&a, set_value);
// lv_anim_set_values(&a, 0, 100);
// lv_anim_set_repeat_delay(&a, 100);
// lv_anim_set_playback_delay(&a, 100);
// lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
// lv_anim_set_time(&a, 2000);
// lv_anim_set_playback_time(&a, 500);
// lv_anim_set_var(&a, indic1);
// lv_anim_start(&a);
// lv_anim_set_time(&a, 1000);
// lv_anim_set_playback_time(&a, 1000);
// lv_anim_set_var(&a, indic2);
// lv_anim_start(&a);
// lv_anim_set_time(&a, 1000);
// lv_anim_set_playback_time(&a, 2000);
// lv_anim_set_var(&a, indic3);
// lv_anim_start(&a);
// }
void lv_gauge_2(lv_obj_t* par)
{
/*Describe the color for the needles*/
static lv_color_t needle_colors[3];
needle_colors[0] = LV_COLOR_BLUE;
needle_colors[1] = LV_COLOR_ORANGE;
needle_colors[2] = LV_COLOR_PURPLE;
LV_IMG_DECLARE(img_hand);
/*Create a gauge*/
guage = lv_gauge_create(par, NULL);
lv_gauge_set_needle_count(guage, 3, needle_colors);
lv_obj_set_size(guage, 200, 200);
lv_obj_align(guage, NULL, LV_ALIGN_CENTER, 100, 0);
lv_gauge_set_needle_img(guage, &img_hand, 4, 4);
/*Allow recoloring of the images according to the needles' color*/
lv_obj_set_style_local_image_recolor_opa(guage, LV_GAUGE_PART_NEEDLE, LV_STATE_DEFAULT, LV_OPA_COVER);
/*Set the values*/
lv_gauge_set_value(guage, 0, 10);
lv_gauge_set_value(guage, 1, 20);
lv_gauge_set_value(guage, 2, 30);
}
void lv_ex_tabview(lv_obj_t* par)
{
/*Create a Tab view object*/
lv_scr_load(par);
tabview = lv_tabview_create(lv_scr_act(), NULL);
/*Add 3 tabs (the tabs are page (lv_page) and can be scrolled*/
tab1 = lv_tabview_add_tab(tabview, "Tab 1");
tab2 = lv_tabview_add_tab(tabview, "Tab 2");
lv_tabview_set_anim_time(tabview,2);
}
void lv_Create_text(lv_obj_t* par)
{
label = lv_label_create(par, NULL);
lv_label_set_long_mode(label, LV_LABEL_LONG_BREAK);
lv_label_set_text(label, "Press a button");
lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
lv_obj_set_size(label, 240, 40);
lv_obj_set_pos(label, 0, 15);
}
void lv_Create_button1(lv_obj_t* par)
{
btn1 = lv_btn_create(par, NULL);
lv_obj_set_event_cb(btn1, event_handler_btn);
lv_obj_set_width(btn1, 70);
lv_obj_set_height(btn1, 32);
lv_obj_set_pos(btn1, 32, 100);
lv_obj_t * label1 = lv_label_create(btn1, NULL);
lv_label_set_text(label1, "Hello");
}
void lv_Create_button2(lv_obj_t* par)
{
btn2 = lv_btn_create(par, NULL);
lv_obj_set_event_cb(btn2, event_handler_btn);
lv_obj_set_width(btn2, 70);
lv_obj_set_height(btn2, 32);
lv_obj_set_pos(btn2, 142, 100);
lv_obj_t * label2 = lv_label_create(btn2, NULL);
lv_label_set_text(label2, "Goodbye");
}
void setup() {
lv_disp_drv_t disp_drv;
lv_indev_drv_t indev_drv;
Serial.begin(115200);
lv_init();
// Setup tick hook for lv_tick_task
/*esp_err_t err = */esp_register_freertos_tick_hook((esp_freertos_tick_cb_t)lv_tick_task);
// Enable TFT
tft.begin();
tft.setRotation(1);
// Enable Backlight
pinMode(TFT_BL, OUTPUT);
digitalWrite(TFT_BL,1);
// Start TouchScreen
touchScreen.begin();
// Display Buffer
lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * 10);
// Init Display
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);
// Init Touchscreen
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = my_input_read2;
lv_indev_drv_register(&indev_drv);
// Screen Object
screenMain = lv_obj_create(NULL, NULL);
lv_ex_tabview(screenMain);
// Text
lv_Create_text(tab1);
// BUtton 1
lv_Create_button1(tab1);
// Button 2
lv_Create_button2(tab1);
lv_gauge_2(tab2);
// Screen load
lv_scr_load(screenMain);
}
void loop() {
lv_task_handler();
delay(1);
}