Description
Hi,
I have a simple lv_list
and I want to navigate through it using a keypad. To achieve this I am using lv_indev
and lv_groups
. Below is my code. The problem I am facing is, the list’s button handler function event_handler
is not getting called when the LV_KEY_ENTER
is being pressed. But the list can be scrolled up and down using up/down or left/right buttons of the keypad. I had this working on LVGL version 7 but after updating to 8 it stopped.
What am I doing wrong?
Thanks
What MCU/Processor/Board and compiler are you using?
STM32G4 on a custom board
Zephyr 3.2
What LVGL version are you using?
LVGL v 8.2.0
What do you want to achieve?
I want use lv_list
and lv_groups
to make a multi level settings menu. I had it working on LVGL version 7
What have you tried so far?
I enabled the LVGL logs to find out whether the key presses are getting detected or not. It looks to me they are getting detected fine, but the button event handler doesn’t get called.
Code to reproduce
static lv_group_t * m_group = NULL;
static lv_obj_t * list1 = NULL;
static lv_indev_drv_t m_keypad_drv;
static lv_indev_t * m_keypad_indev = NULL;
static void event_handler(lv_event_t *event)
{
lv_event_code_t code = lv_event_get_code(event);
lv_obj_t * obj = lv_event_get_target(event);
LOG_INF("code %d", code);
if(code == LV_EVENT_CLICKED) {
LOG_INF("Clicked: %s", lv_list_get_btn_text(list1, obj));
}
}
static void keypad_read(lv_indev_drv_t *drv, lv_indev_data_t *data) {
static int call_count = 0;
switch (m_key_pressed) {
case CHECK:
data->key = LV_KEY_ENTER;
break;
case BACK:
data->key = LV_KEY_ESC;
break;
case LEFT:
data->key = LV_KEY_LEFT;
break;
case RIGHT:
data->key = LV_KEY_RIGHT;
break;
case UP:
data->key = LV_KEY_UP;
break;
case DOWN:
data->key = LV_KEY_DOWN;
break;
case POWER:
break;
case HOME:
break;
default:
break;
}
/* key press */
if (m_key_pressed != NONE) {
if (call_count == 0) {
data->state = LV_INDEV_STATE_PR;
call_count = 1;
} else if (call_count == 1) {
call_count = 2;
data->state = LV_INDEV_STATE_REL;
}
}
/* reset the keys */
if ((m_key_pressed != NONE) && (call_count == 2)) {
call_count = 0;
m_key_pressed = NONE;
m_press_type = UNKNOWN;
}
}
void keypad_app_cb_handler(...) {
/* interrupt callback function to set m_key_pressed variable */
...
}
void lv_ex_list_1(void) {
/*Create a list*/
/*lv_obj_t * */list1 = lv_list_create(lv_scr_act());
lv_obj_set_size(list1, 128, 64);
lv_obj_align(list1, LV_ALIGN_CENTER, 0, 0);
/*Add buttons to the list*/
lv_obj_t * list_btn;
list_btn = lv_list_add_btn(list1, LV_SYMBOL_FILE, "New");
lv_obj_add_event_cb(list_btn, event_handler, LV_EVENT_CLICKED, NULL);
list_btn = lv_list_add_btn(list1, LV_SYMBOL_DIRECTORY, "Open");
lv_obj_add_event_cb(list_btn, event_handler, LV_EVENT_CLICKED, NULL);
list_btn = lv_list_add_btn(list1, LV_SYMBOL_CLOSE, "Delete");
lv_obj_add_event_cb(list_btn, event_handler, LV_EVENT_CLICKED, NULL);
list_btn = lv_list_add_btn(list1, LV_SYMBOL_EDIT, "Edit");
lv_obj_add_event_cb(list_btn, event_handler, LV_EVENT_CLICKED, NULL);
list_btn = lv_list_add_btn(list1, LV_SYMBOL_SAVE, "Save");
lv_obj_add_event_cb(list_btn, event_handler, LV_EVENT_CLICKED, NULL);
list_btn = lv_list_add_btn(list1, LV_SYMBOL_BELL, "Notify");
lv_obj_add_event_cb(list_btn, event_handler, LV_EVENT_CLICKED, NULL);
list_btn = lv_list_add_btn(list1, LV_SYMBOL_BATTERY_FULL, "Battery");
lv_obj_add_event_cb(list_btn, event_handler, LV_EVENT_CLICKED, NULL);
}
static int setup_keypad() {
int ret = 0;
lv_indev_drv_init(&m_keypad_drv);
m_keypad_drv.type = LV_INDEV_TYPE_KEYPAD;
m_keypad_drv.read_cb = keypad_read;
m_key_pressed = NONE;
m_press_type = UNKNOWN;
m_keypad_indev = lv_indev_drv_register(&m_keypad_drv);
...
}
void main() {
...
setup_keypad();
g = lv_group_create();
lv_indev_set_group(m_keypad_indev, g);
lv_ex_list_1();
lv_group_add_obj(g, list1);
while (1) {
lv_task_handler();
...
k_sleep(K_MSEC(10));
}
}
Logs
[Info] (6.354, +5961) indev_keypad_proc: 10 key is pressed (in lv_indev.c line #413)
[Info] (6.392, +38) indev_keypad_proc: 10 key is released (in lv_indev.c line #497)
[Info] (94.786, +82788) indev_keypad_proc: 19 key is pressed (in lv_indev.c line #413)
[Info] (94.819, +33) indev_keypad_proc: 19 key is released (in lv_indev.c line #497)
[Info] (97.281, +2462) indev_keypad_proc: 17 key is pressed (in lv_indev.c line #413)
[Info] (97.313, +32) indev_keypad_proc: 17 key is released (in lv_indev.c line #497)