text/plain
•
1.49 KB
•
54 lines
/**
* @file lvgl_indev.c
* Shared LVGL input device driver for Moon firmware
* Reads from button_state and translates to LVGL keypad events
*/
#include "lvgl_port.h"
#include "moon.h"
static lv_indev_t *indev_keypad;
static lv_group_t *default_group;
static void keypad_read_cb(lv_indev_t *indev, lv_indev_data_t *data) {
(void)indev;
static uint8_t last_key = 0;
uint8_t key = 0;
// Determine which key is pressed (priority: OK > BACK > UP > DOWN)
// LVGL groups use NEXT/PREV for focus navigation, not directional keys
if (button_state & BUTTON_STATE_OK) {
key = LV_KEY_ENTER;
} else if (button_state & BUTTON_STATE_BACK) {
key = LV_KEY_ESC;
} else if (button_state & BUTTON_STATE_UP) {
key = LV_KEY_PREV;
} else if (button_state & BUTTON_STATE_DOWN) {
key = LV_KEY_NEXT;
}
if (key != 0) {
data->key = key;
data->state = LV_INDEV_STATE_PRESSED;
last_key = key;
} else {
data->key = last_key;
data->state = LV_INDEV_STATE_RELEASED;
}
}
void lvgl_port_indev_init(void) {
// Create keypad input device
indev_keypad = lv_indev_create();
lv_indev_set_type(indev_keypad, LV_INDEV_TYPE_KEYPAD);
lv_indev_set_read_cb(indev_keypad, keypad_read_cb);
// Create default group for focus management
default_group = lv_group_create();
lv_group_set_default(default_group);
lv_indev_set_group(indev_keypad, default_group);
}
lv_indev_t *lvgl_port_get_indev(void) { return indev_keypad; }
lv_group_t *lvgl_port_get_group(void) { return default_group; }