Updating LVGL Library

Hello all,
I have a simple Hello World working on a LVGL 8.3.8 version.
When I try to update the Library to the newest (9.1.0), I get several errors from undefined functions and variables. Seems a lot of the API changed.
Unfortunately, I haven’t been able to get a Hello World working on the newest version, and the examples / demos are made in the 8.2.0 (i.e.: GitHub - lvgl/lv_platformio: PlatformIO project example for LVGL ).

This is the working 8.3.8 Hello World:

#include <lvgl.h>
#include <TFT_eSPI.h>

static const uint16_t screenWidth  = 240;
static const uint16_t screenHeight = 240;

static lv_disp_draw_buf_t draw_buf;
static lv_color_t buf[ screenWidth * screenHeight / 10 ];

TFT_eSPI tft = TFT_eSPI(screenWidth, screenHeight); /* TFT instance */

#if LV_USE_LOG != 0
/* Serial debugging */
void my_print(const char * buf)
{
    Serial.printf(buf);
    Serial.flush();
}
#endif

/* Display flushing */
void my_disp_flush( lv_disp_drv_t *disp_drv, 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_drv );
}


void setup()
{
    Serial.begin( 115200 ); /* prepare for possible serial debug */

    String LVGL_Arduino = "Hello Arduino! ";
    LVGL_Arduino += String('V') + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch();

    Serial.println( LVGL_Arduino );
    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( 0 ); /* Landscape orientation, flipped */

    lv_disp_draw_buf_init( &draw_buf, buf, NULL, screenWidth * screenHeight / 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 );

  
    /* Create simple label */
    lv_obj_t *label = lv_label_create( lv_scr_act() );
    lv_label_set_text( label, "Hello World");
    lv_label_set_recolor(label,true);
    lv_obj_align( label, LV_ALIGN_CENTER, 0, 0 );
 
     /*Or try out a demo. Don't forget to enable the demos in lv_conf.h. E.g. LV_USE_DEMOS_WIDGETS*/
    //lv_demo_widgets();
    
    Serial.println( "Setup done" );
}

void loop()
{
    lv_timer_handler(); /* let the GUI do its work */
    delay( 5 );
}

Are you using an ESP32?
Did you try this updated example?

Yes, it does not work as well, both on ArduinoIDE as well as in PlatformIO
In platformIO it’s missing an Arduino.h include, but afterwards both return the same error:

/Users/neubern/Documents/Arduino/libraries/lvgl/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino: In function ‘void setup()’:
/Users/neubern/Documents/Arduino/libraries/lvgl/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino:82:20: error: invalid conversion from ‘long unsigned int ()()’ to ‘lv_tick_get_cb_t’ {aka 'unsigned int ()()’} [-fpermissive]
lv_tick_set_cb(millis);
^~~~~~
In file included from /Users/neubern/Documents/Arduino/libraries/lvgl/src/…/src/misc/lv_timer.h:16,
from /Users/neubern/Documents/Arduino/libraries/lvgl/src/…/lvgl.h:31,
from /Users/neubern/Documents/Arduino/libraries/lvgl/src/lvgl.h:16,
from /Users/neubern/Documents/Arduino/libraries/lvgl/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino:4:
/Users/neubern/Documents/Arduino/libraries/lvgl/src/…/src/misc/…/tick/lv_tick.h:77:38: note: initializing argument 1 of ‘void lv_tick_set_cb(lv_tick_get_cb_t)’
void lv_tick_set_cb(lv_tick_get_cb_t cb);
~~~~~~~~~~~~~~~~~^~

exit status 1

Compilation error: invalid conversion from ‘long unsigned int ()()’ to ‘lv_tick_get_cb_t’ {aka 'unsigned int ()()’} [-fpermissive]

That’s normal, because it is an ino file. Only the Arduino IDE will automatically add it. But this often leads to confusion.

The example is not 100% correct.

This works:

static uint32_t my_tick_get_cb(void) {
  return millis();
}

void setup() {
  ...
  lv_tick_set_cb(my_tick_get_cb);
  ...
}
1 Like