Description
I have an APP developed based on LVGL v7.4.0, multiple image buttons are used on a screen, when one image button is pressed, the others are set to released state. When I upgrade to LVGL v7.10.1, the same code doesn’t work anymore.
What MCU/Processor/Board and compiler are you using?
Simulator
What LVGL version are you using?
LVGL 7.10.1
What do you want to achieve?
When one image button is pressed, the state of other image buttons are set to released.
What have you tried so far?
Run the APP with LVGL v7.4.0, it works as expectation, run the same APP with LVGL v7.10.1, the state of other image buttons are not refreshed.
Code to reproduce
typedef struct
{
lv_obj_t *Scr1;
lv_obj_t *Scr1_Bckgnd;
lv_obj_t *Scr1_broilBtn;
lv_obj_t *Scr1_broilBtn_label;
lv_obj_t *Scr1_warmBtn;
lv_obj_t *Scr1_warmBtn_label;
}lv_ui;
lv_ui appui;
void setup_scr_Scr1(lv_ui *ui){
ui->Scr1 = lv_obj_create(NULL, NULL);
ui->Scr1_Bckgnd = lv_img_create(ui->Scr1, NULL);
lv_obj_set_pos(ui->Scr1_Bckgnd, 0, 0);
lv_obj_set_size(ui->Scr1_Bckgnd, 480, 272);
lv_img_set_src(ui->Scr1_Bckgnd,&_Oven01_alpha_480x272);
ui->Scr1_broilBtn = lv_imgbtn_create(ui->Scr1, NULL);
lv_obj_set_pos(ui->Scr1_broilBtn, 10, 60);
lv_obj_set_size(ui->Scr1_broilBtn, 30, 30);
lv_imgbtn_set_src(ui->Scr1_broilBtn,LV_BTN_STATE_RELEASED,&_Broil_alpha_30x30);
lv_imgbtn_set_src(ui->Scr1_broilBtn,LV_BTN_STATE_PRESSED,&_Broil_selected_alpha_30x30);
lv_imgbtn_set_src(ui->Scr1_broilBtn,LV_BTN_STATE_CHECKED_RELEASED,&_Broil_selected_alpha_30x30);
lv_imgbtn_set_src(ui->Scr1_broilBtn,LV_BTN_STATE_CHECKED_PRESSED,&_Broil_alpha_30x30);
lv_imgbtn_set_checkable(ui->Scr1_broilBtn, true);
ui->Scr1_warmBtn = lv_imgbtn_create(ui->Scr1, NULL);
lv_obj_set_pos(ui->Scr1_warmBtn, 10, 95);
lv_obj_set_size(ui->Scr1_warmBtn, 30, 30);
lv_imgbtn_set_src(ui->Scr1_warmBtn,LV_BTN_STATE_RELEASED,&_Warm_alpha_30x30);
lv_imgbtn_set_src(ui->Scr1_warmBtn,LV_BTN_STATE_PRESSED,&_Warm_selected_alpha_30x30);
lv_imgbtn_set_src(ui->Scr1_warmBtn,LV_BTN_STATE_CHECKED_RELEASED,&_Warm_selected_alpha_30x30);
lv_imgbtn_set_src(ui->Scr1_warmBtn,LV_BTN_STATE_CHECKED_PRESSED,&_Warm_alpha_30x30);
lv_imgbtn_set_checkable(ui->Scr1_warmBtn, true);
}
void btnSelection_cb(lv_obj_t * btn, lv_event_t event)
{
uint32_t btnState;
if(event == LV_EVENT_RELEASED) {
if(btn == appui.Scr1_broilBtn) {
btnState = lv_btn_get_state(appui.Scr1_broilBtn);
if (btnState == 0x3) {
lv_btn_set_state(appui.Scr1_warmBtn, LV_BTN_STATE_RELEASED);
}
}
else if(btn == appui.Scr1_warmBtn) {
btnState = lv_btn_get_state(appui.Scr1_warmBtn);
if (btnState == 0x3) {
lv_btn_set_state(appui.Scr1_broilBtn, LV_BTN_STATE_RELEASED);
}
}
}
}
static void btnEvent_handler(lv_obj_t * obj, lv_event_t event)
{
switch (event)
{
case LV_EVENT_RELEASED:
{
btnSelection_cb(obj, event);
}
break;
default:
break;
}
}
void events_init_Scr1(lv_ui *ui)
{
lv_obj_set_event_cb(ui->Scr1_broilBtn, btnEvent_handler);
lv_obj_set_event_cb(ui->Scr1_warmBtn, btnEvent_handler);
}
void setup_ui(lv_ui *ui){
LV_THEME_DEFAULT_INIT(LV_THEME_DEFAULT_COLOR_PRIMARY, LV_THEME_DEFAULT_COLOR_SECONDARY,
LV_THEME_MATERIAL_FLAG_LIGHT, LV_THEME_DEFAULT_FONT_SMALL, LV_THEME_DEFAULT_FONT_NORMAL,
LV_THEME_DEFAULT_FONT_SUBTITLE, LV_THEME_DEFAULT_FONT_TITLE);
setup_scr_Scr1(ui);
lv_scr_load(ui->Scr1);
events_init_Scr1(ui);
}
Screenshot and/or video
Press image button1
Expected result after pressing image button2 with LVGL v7.4.0
Incorrect result after pressing image button2 with LVGL v7.10.1