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