From d7d36f89b3286871bfd4747a3cb0dcd1783958c9 Mon Sep 17 00:00:00 2001 From: ataweg Date: Mon, 3 May 2021 20:26:10 +0200 Subject: [PATCH] update to work with Arduino (#2200) --- component.mk | 49 ++++--- examples/arduino/LVGL_Arduino.ino | 113 -------------- .../arduino/LVGL_Arduino/LVGL_Arduino.ino | 138 ++++++++++++++++++ 3 files changed, 169 insertions(+), 131 deletions(-) delete mode 100644 examples/arduino/LVGL_Arduino.ino create mode 100644 examples/arduino/LVGL_Arduino/LVGL_Arduino.ino diff --git a/component.mk b/component.mk index d7cef094b..9cecdec3d 100644 --- a/component.mk +++ b/component.mk @@ -1,21 +1,34 @@ # ESP-IDF component file for make based commands -COMPONENT_SRCDIRS := . -COMPONENT_SRCDIRS += src -COMPONENT_SRCDIRS += src/core -COMPONENT_SRCDIRS += src/draw -COMPONENT_SRCDIRS += src/font -COMPONENT_SRCDIRS += src/gpu -COMPONENT_SRCDIRS += src/hal -COMPONENT_SRCDIRS += src/misc -COMPONENT_SRCDIRS += src/widgets +COMPONENT_SRCDIRS := . \ + src \ + src/core \ + src/draw \ + src/extra \ + src/font \ + src/gpu \ + src/hal \ + src/misc \ + src/widgets \ + src/extra/layouts \ + src/extra/layouts/flex \ + src/extra/layouts/grid \ + src/extra/themes \ + src/extra/themes/basic \ + src/extra/themes/default \ + src/extra/widgets/calendar \ + src/extra/widgets/colorwheel \ + src/extra/widgets \ + src/extra/widgets/imgbtn \ + src/extra/widgets/keyboard \ + src/extra/widgets/led \ + src/extra/widgets/list \ + src/extra/widgets/msgbox \ + src/extra/widgets/spinbox \ + src/extra/widgets/spinner \ + src/extra/widgets/tabview \ + src/extra/widgets/tileview \ + src/extra/widgets/win -COMPONENT_ADD_INCLUDEDIRS := . -COMPONENT_ADD_INCLUDEDIRS += src -COMPONENT_ADD_INCLUDEDIRS += src/core -COMPONENT_ADD_INCLUDEDIRS += src/draw -COMPONENT_ADD_INCLUDEDIRS += src/font -COMPONENT_ADD_INCLUDEDIRS += src/gpu -COMPONENT_ADD_INCLUDEDIRS += src/hal -COMPONENT_ADD_INCLUDEDIRS += src/misc -COMPONENT_ADD_INCLUDEDIRS += src/widgets + +COMPONENT_ADD_INCLUDEDIRS := $(COMPONENT_SRCDIRS) . diff --git a/examples/arduino/LVGL_Arduino.ino b/examples/arduino/LVGL_Arduino.ino deleted file mode 100644 index b58322528..000000000 --- a/examples/arduino/LVGL_Arduino.ino +++ /dev/null @@ -1,113 +0,0 @@ -#include -#include -/*If you want to use the LVGL examples, - make sure to install the lv_examples Arduino library - and uncomment the following line. -#include */ - -TFT_eSPI tft = TFT_eSPI(); /*TFT instance*/ - -/*Change to your screen resolution*/ -static uint32_t screenWidth = 320; -static uint32_t screenHeight = 240; - -static lv_draw_buf_t draw_buf; -static lv_color_t buf[screenWidth * 10]; - -#if LV_USE_LOG != 0 -/*Serial debugging*/ -void my_print(lv_log_level_t level, const char *file, uint32_t line, const char *fn_name, const char *dsc) -{ - Serial.printf("%s(%s)@%d->%s\r\n", file, fn_name, line, dsc); - Serial.flush(); -} -#endif - -/*Display flushing*/ -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); -} - -/*Read the touchpad*/ -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) { - data->state = LV_INDEV_STATE_REL; - } else { - data->state = LV_INDEV_STATE_PR; - - /*Set the 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 LV_USE_LOG != 0 - lv_log_register_print_cb(my_print); /*register print function for debugging*/ -#endif - - tft.begin(); /*TFT init*/ - tft.setRotation(1); /*Landscape orientation*/ - - /*Set the touchscreen calibration data, - the actual data for your display can be aquired using - the Generic -> Touch_calibrate example from the TFT_eSPI library*/ - uint16_t calData[5] = {275, 3620, 264, 3532, 1}; - tft.setTouch(calData); - - lv_draw_buf_init(&draw_buf, buf, NULL, screenWidth * 10); - - /*Initialize the display*/ - lv_disp_drv_t disp_drv; - lv_disp_drv_init(&disp_drv); - /*Change the following line to your display resolution*/ - disp_drv.hor_res = screenWidth; - disp_drv.ver_res = screenHeight; - disp_drv.flush_cb = my_disp_flush; - disp_drv.draw_buf = &draw_buf; - lv_disp_drv_register(&disp_drv); - - /*Initialize the (dummy) input device driver*/ - lv_indev_drv_t indev_drv; - lv_indev_drv_init(&indev_drv); - indev_drv.type = LV_INDEV_TYPE_POINTER; - indev_drv.read_cb = my_touchpad_read; - lv_indev_drv_register(&indev_drv); - - /*Try an example from the lv_examples Arduino library - make sure to include it as written above. - lv_example_btn_1();*/ -} - -void loop() -{ - lv_timer_handler(); /*let the GUI do its work*/ - delay(5); -} diff --git a/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino b/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino new file mode 100644 index 000000000..402f79b2d --- /dev/null +++ b/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino @@ -0,0 +1,138 @@ +#include +#include +/*If you want to use the LVGL examples, + make sure to install the lv_examples Arduino library + and uncomment the following line. +#include +*/ + +#include + +TFT_eSPI tft = TFT_eSPI(); /* TFT instance */ + +/*Change to your screen resolution*/ +static const uint32_t screenWidth = 480; +static const uint32_t screenHeight = 320; + +static lv_disp_draw_buf_t draw_buf; +static lv_color_t buf[ screenWidth * 10 ]; + +#if LV_USE_LOG != 0 +/* Serial debugging */ +void my_print( lv_log_level_t level, const char * file, uint32_t line, const char * fn_name, const char * dsc ) +{ + Serial.printf( "%s(%s)@%d->%s\r\n", file, fn_name, line, dsc ); + Serial.flush(); +} +#endif + +/* Display flushing */ +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( ( uint16_t * )&color_p->full, w * h, true ); + tft.endWrite(); + + lv_disp_flush_ready( disp ); +} + +/*Read the touchpad*/ +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 ) + { + data->state = LV_INDEV_STATE_REL; + } + else + { + data->state = LV_INDEV_STATE_PR; + + /*Set the 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 */ + Serial.println( "Hello Arduino! (V8.0.X)" ); + Serial.println( "I am LVGL_Arduino" ); + + lv_init(); + +#if LV_USE_LOG != 0 + lv_log_register_print_cb( my_print ); /* register print function for debugging */ +#endif + + tft.begin(); /* TFT init */ + tft.setRotation( 3 ); /* Landscape orientation, flipped */ + + /*Set the touchscreen calibration data, + the actual data for your display can be aquired using + the Generic -> Touch_calibrate example from the TFT_eSPI library*/ + uint16_t calData[5] = { 275, 3620, 264, 3532, 1 }; + tft.setTouch( calData ); + + lv_disp_draw_buf_init( &draw_buf, buf, NULL, screenWidth * 10 ); + + /*Initialize the display*/ + static lv_disp_drv_t disp_drv; + lv_disp_drv_init( &disp_drv ); + /*Change the following line to your display resolution*/ + disp_drv.hor_res = screenWidth; + disp_drv.ver_res = screenHeight; + disp_drv.flush_cb = my_disp_flush; + disp_drv.draw_buf = &draw_buf; + lv_disp_drv_register( &disp_drv ); + + /*Initialize the (dummy) input device driver*/ + static lv_indev_drv_t indev_drv; + lv_indev_drv_init( &indev_drv ); + indev_drv.type = LV_INDEV_TYPE_POINTER; + indev_drv.read_cb = my_touchpad_read; + lv_indev_drv_register( &indev_drv ); + +#if 0 + /* Create simple label */ + lv_obj_t *label = lv_label_create( lv_scr_act() ); + lv_label_set_text( label, "Hello Arduino! (V8.0.X)" ); + lv_obj_align( label, LV_ALIGN_CENTER, 0, 0 ); +#else + /* Try an example from the lv_examples Arduino library + make sure to include it as written above. + lv_example_btn_1(); + */ + + // uncomment one of these demos + lv_demo_widgets(); // OK + // lv_demo_benchmark(); // OK + // lv_demo_keypad_encoder(); // works, but I haven't an encoder + // lv_demo_music(); // NOK + // lv_demo_printer(); + // lv_demo_stress(); // seems to be OK +#endif + Serial.println( "Setup done" ); +} + +void loop() +{ + lv_timer_handler(); /* let the GUI do its work */ + delay( 5 ); +}