ESP32S3 resetting when updating objects

Hello,

I’m having a problem.

I’m using the following function to fill the screen with UI objects:

void ui_scrStatus_pg1_screen_init(void)
{
    ui_StdBaseWindow= lv_obj_create(NULL);
    lv_obj_remove_flag(ui_StdBaseWindow, LV_OBJ_FLAG_SCROLLABLE);      
    lv_obj_add_event_cb(ui_StdBaseWindow, scr_unloaded_delete_cb, LV_EVENT_SCREEN_UNLOADED, &ui_StdBaseWindow);    
    lv_obj_set_style_bg_color(ui_StdBaseWindow, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_bg_opa(ui_StdBaseWindow, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_opa(ui_StdBaseWindow, 0, LV_PART_MAIN | LV_STATE_DEFAULT);

    // ---------------
    // Window contents
    // ---------------

    ui_scrStatus_screen_update_pg1();

    // -----------------
    // Prev page button:
    // -----------------

    ui_Status_BtPrevGSPg = lv_button_create(ui_StdBaseWindow);
    lv_obj_set_width(ui_Status_BtPrevGSPg, 60);
    lv_obj_set_height(ui_Status_BtPrevGSPg, 40);
    lv_obj_set_x(ui_Status_BtPrevGSPg, 20);
    lv_obj_set_y(ui_Status_BtPrevGSPg, -10);
    lv_obj_set_align(ui_Status_BtPrevGSPg, LV_ALIGN_BOTTOM_LEFT);
    lv_obj_add_flag(ui_Status_BtPrevGSPg, LV_OBJ_FLAG_SCROLL_ON_FOCUS);     
    lv_obj_remove_flag(ui_Status_BtPrevGSPg, LV_OBJ_FLAG_SCROLLABLE);      
    lv_obj_set_style_bg_color(ui_Status_BtPrevGSPg, lv_color_hex(0x7A7AAA), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_bg_opa(ui_Status_BtPrevGSPg, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_color(ui_Status_BtPrevGSPg, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_opa(ui_Status_BtPrevGSPg, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_width(ui_Status_BtPrevGSPg, 1, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_color(ui_Status_BtPrevGSPg, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_opa(ui_Status_BtPrevGSPg, 100, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_width(ui_Status_BtPrevGSPg, 10, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_spread(ui_Status_BtPrevGSPg, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_offset_x(ui_Status_BtPrevGSPg, 5, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_offset_y(ui_Status_BtPrevGSPg, 5, LV_PART_MAIN | LV_STATE_DEFAULT);

    ui_Status_LbPrevGSPg = lv_label_create(ui_Status_BtPrevGSPg); 
    lv_obj_set_align(ui_Status_LbPrevGSPg, LV_ALIGN_CENTER);
    lv_label_set_text(ui_Status_LbPrevGSPg, LV_SYMBOL_LEFT);

    // -----------------
    // Next page button:
    // -----------------

    ui_Status_BtNextGSPg = lv_button_create(ui_StdBaseWindow);
    lv_obj_set_width(ui_Status_BtNextGSPg, 60);
    lv_obj_set_height(ui_Status_BtNextGSPg, 40);
    lv_obj_set_x(ui_Status_BtNextGSPg, 100);
    lv_obj_set_y(ui_Status_BtNextGSPg, -10);
    lv_obj_set_align(ui_Status_BtNextGSPg, LV_ALIGN_BOTTOM_LEFT);
    lv_obj_add_flag(ui_Status_BtNextGSPg, LV_OBJ_FLAG_SCROLL_ON_FOCUS);     
    lv_obj_remove_flag(ui_Status_BtNextGSPg, LV_OBJ_FLAG_SCROLLABLE);      
    lv_obj_set_style_bg_color(ui_Status_BtNextGSPg, lv_color_hex(0x7A7AAA), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_bg_opa(ui_Status_BtNextGSPg, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_color(ui_Status_BtNextGSPg, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_opa(ui_Status_BtNextGSPg, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_width(ui_Status_BtNextGSPg, 1, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_color(ui_Status_BtNextGSPg, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_opa(ui_Status_BtNextGSPg, 100, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_width(ui_Status_BtNextGSPg, 10, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_spread(ui_Status_BtNextGSPg, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_offset_x(ui_Status_BtNextGSPg, 5, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_offset_y(ui_Status_BtNextGSPg, 5, LV_PART_MAIN | LV_STATE_DEFAULT);

    ui_Status_LbNextGSPg = lv_label_create(ui_Status_BtNextGSPg); 
    lv_obj_set_align(ui_Status_LbNextGSPg, LV_ALIGN_CENTER);
    lv_label_set_text(ui_Status_LbNextGSPg, LV_SYMBOL_RIGHT);

    // ------------
    // NEXT button:
    // ------------

    ui_Status_BtPrev = lv_button_create(ui_StdBaseWindow);
    lv_obj_set_width(ui_Status_BtPrev, 60);
    lv_obj_set_height(ui_Status_BtPrev, 50);
    lv_obj_set_x(ui_Status_BtPrev, -20);
    lv_obj_set_y(ui_Status_BtPrev, 60);
    lv_obj_set_align(ui_Status_BtPrev, LV_ALIGN_TOP_RIGHT);
    lv_obj_add_flag(ui_Status_BtPrev, LV_OBJ_FLAG_SCROLL_ON_FOCUS);     
    lv_obj_remove_flag(ui_Status_BtPrev, LV_OBJ_FLAG_SCROLLABLE);      
    lv_obj_set_style_bg_color(ui_Status_BtPrev, lv_color_hex(0x3AAA3D), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_bg_opa(ui_Status_BtPrev, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_color(ui_Status_BtPrev, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_opa(ui_Status_BtPrev, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_width(ui_Status_BtPrev, 1, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_color(ui_Status_BtPrev, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_opa(ui_Status_BtPrev, 100, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_width(ui_Status_BtPrev, 10, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_spread(ui_Status_BtPrev, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_offset_x(ui_Status_BtPrev, 5, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_offset_y(ui_Status_BtPrev, 5, LV_PART_MAIN | LV_STATE_DEFAULT);

    ui_Status_LbPrev = lv_label_create(ui_Status_BtPrev); 
    lv_obj_set_align(ui_Status_LbPrev, LV_ALIGN_CENTER);
    lv_label_set_text(ui_Status_LbPrev, LV_SYMBOL_UP);

    // ----------------
    // Register events:
    // ----------------

    lv_obj_add_event_cb(ui_Status_BtPrevGSPg, ui_event_scrStatus_btPrevGSPg, LV_EVENT_CLICKED, NULL);
    lv_obj_add_event_cb(ui_Status_BtNextGSPg, ui_event_scrStatus_btNextGSPg, LV_EVENT_CLICKED, NULL);
    lv_obj_add_event_cb(ui_Status_BtPrev, ui_event_scrStatus_btToPg1, LV_EVENT_CLICKED, NULL);
}

This is the code I’m using to call that function and show that window:

    ui_scrStatus_pg2_screen_init();
    lv_scr_load(ui_scrStatus_pg2);   
    lv_timer_handler();  // LVGL task processing
    lv_refr_now(NULL);

The ui_scrStatus_screen_update_pg1 function thats called from the ui_scrStatus_pg1_screen_init function to show the information data on the screen is this:

void ui_scrStatus_screen_update_pg1(void)
{
    uint32_t Color;
    int GS;

    // ---------
    // Sensores:
    // ---------

    ui_Status_Text(ui_StdBaseWindow, 22, 60, 0x50FFA8, "Sensores:");
    ui_Status_DivLine(ui_StdBaseWindow, 90, 350);
    if(CabinetState.DoorIsOpen) Color=0xFFFF20; else Color=0x888888;
    ui_Status_Box(ui_StdBaseWindow, 22, 100, 160, Color, LV_SYMBOL_OK, "Porta aberta");
    if(CabinetState.VentOn) Color=0xFFFF20; else Color=0x888888;
    ui_Status_Box(ui_StdBaseWindow, 22+160+10, 100, 140, Color, LV_SYMBOL_OK, "Ventilador");
    if(CabinetState.IntLightsOn) Color=0xFFFF20; else Color=0x888888;
    ui_Status_Box(ui_StdBaseWindow, 22, 145, 210, Color, LV_SYMBOL_OK, "Iluminação interna");
    if(CabinetState.TempConnected) Color=0xFFFF20; else Color=0x888888;
    ui_Status_Box(ui_StdBaseWindow, 22+210+10, 145, 80, Color, LV_SYMBOL_OK, "--'C");

    // -----------
    // Power info:
    // -----------

    // Title box:

    lv_obj_t * obj1;
    obj1 = lv_obj_create(ui_StdBaseWindow);
    lv_obj_remove_style_all(obj1);
    lv_obj_set_width(obj1, 310);
    lv_obj_set_height(obj1, 26);
    lv_obj_set_x(obj1, 22+350+20);
    lv_obj_set_y(obj1, 60);
    lv_obj_set_align(obj1, LV_ALIGN_TOP_LEFT);
    lv_obj_remove_flag(obj1, LV_OBJ_FLAG_CLICKABLE);
    lv_obj_remove_flag(obj1, LV_OBJ_FLAG_SCROLLABLE);
    lv_obj_set_style_bg_color(obj1, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_bg_opa(obj1, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_color(obj1, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_width(obj1, 2, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_side(obj1, LV_BORDER_SIDE_FULL, LV_PART_MAIN | LV_STATE_DEFAULT);

    // Title box text:

    lv_obj_t * obj2;
    obj2 = lv_label_create(obj1);  
    lv_obj_set_x(obj2, 0);
    lv_obj_set_y(obj2, 0);
    lv_obj_set_align(obj2, LV_ALIGN_CENTER);
    lv_label_set_text(obj2, "Power Info:");
    lv_obj_set_style_text_color(obj2, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_text_font(obj2, &ui_font_MenuFont20, LV_PART_MAIN | LV_STATE_DEFAULT);

    // Box:

    lv_obj_t * obj3;
    obj3 = lv_obj_create(ui_StdBaseWindow);
    lv_obj_remove_style_all(obj3);
    lv_obj_set_width(obj3, 310);
    lv_obj_set_height(obj3, 100);
    lv_obj_set_x(obj3, 22+350+20);
    lv_obj_set_y(obj3, 60+26);
    lv_obj_set_align(obj3, LV_ALIGN_TOP_LEFT);
    lv_obj_remove_flag(obj3, LV_OBJ_FLAG_CLICKABLE);
    lv_obj_remove_flag(obj3, LV_OBJ_FLAG_SCROLLABLE);
    lv_obj_set_style_bg_color(obj3, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_bg_opa(obj3, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_color(obj3, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_width(obj3, 2, LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_side(obj3, LV_BORDER_SIDE_FULL, LV_PART_MAIN | LV_STATE_DEFAULT);

    // Voltage text:

    lv_obj_t * obj4;
    obj4 = lv_label_create(obj3);  
    lv_obj_set_x(obj4, 20);
    lv_obj_set_y(obj4, 15);
    lv_obj_set_align(obj4, LV_ALIGN_TOP_LEFT);
    if (PowerInfo.ItensRead) lv_label_set_text_fmt(obj4, "%.2f V", PowerInfo.CentiVoltage); else lv_label_set_text(obj4, "-- V");
    lv_obj_set_style_text_color(obj4, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_text_font(obj4, &ui_font_MenuFont20, LV_PART_MAIN | LV_STATE_DEFAULT);

    (... code continues)

When I run the code and call the ui_scrStatus_pg1_screen_init function for the 1st time, everything shows with no problem. But if I call the ui_scrStatus_screen_update_pg1 function just to update the contents of the screen, the ESP32S3 will reset with the exception StoreProhibited.

Am I doing this right?

I’m defining objects like this:

lv_obj_t * ui_scrStatus_pg1 = NULL;
lv_obj_t * ui_scrStatus_pg2 = NULL;
lv_obj_t * ui_Status_Obj = NULL;
lv_obj_t * ui_Status_Obj2= NULL;
lv_obj_t * ui_Status_Obj3= NULL;
lv_obj_t * ui_Status_Obj_Text = NULL;
lv_obj_t * ui_Status_BtNextGSPg = NULL;
lv_obj_t * ui_Status_LbNextGSPg = NULL;
lv_obj_t * ui_Status_BtPrevGSPg = NULL;
lv_obj_t * ui_Status_LbPrevGSPg = NULL;
lv_obj_t * ui_Status_BtNext = NULL;
lv_obj_t * ui_Status_LbNext = NULL;
lv_obj_t * ui_Status_BtPrev = NULL;
lv_obj_t * ui_Status_LbPrev = NULL;
lv_obj_t * ui_Status_BtReturn = NULL;
lv_obj_t * ui_Status_LbReturn = NULL;

Some objects I’ve defined inside the functions to see the effects, like this:

    // -----------
    // Power info:
    // -----------

    // Title box:

    lv_obj_t * obj1;    // <----------------------
    obj1 = lv_obj_create(ui_StdBaseWindow);
    lv_obj_remove_style_all(obj1);
    lv_obj_set_width(obj1, 310);
    lv_obj_set_height(obj1, 26);

But no changes. System still resets.

It looks like I’m overfilling the memory when calling the ui_scrStatus_screen_update_pg1 again. It looks like it add more children to the parent instead of just updating their values.

Am I doing this the right way? How can I call my ui_scrStatus_screen_update_pg1 function to just update the values on the main window?

Thanks

I think I see where’s my mistake. Let me know if I’m thinking this right:

When I use lv_obj_create inside any function to create an object, that command creates a new object on the RAM and return me a pointer to that new object. And that object stays on the RAM until it’s deleted with lv_obj_del or its parent is deleted with lv_obj_del. If I call the same exact function again that uses lv_obj_create to create the same object, it’ll actually create a new object and give me a new pointer, but it’ll leave the old object on the RAM. It’ll not overwrite/update it.

Even if I use, for example, ui_Status_BtPrev = lv_button_create(ui_StdBaseWindow); on a function to create a button, every time I call the function that run that command it’ll create a new object on the RAM (a new button) and put the new pointer at ui_Status_BtPrev, but it’ll leave the old button on the RAM.

So, if I want to update that button, I either have to update the parameters of the object using lv_obj_set_xxx, or delete that object and create a new one with the new parameters.

Is this correct?
Thanks for your help!

That’s right, objects only need to be created once, later their state/appearance/value is only updated…

if(obj != NULL)
{
	// Refresh state obj
}