Login
1 branch 0 tags
Ben (Desktop/Arch) AUDIO! d8add76 1 month ago 17 Commits
moon / firmware / src / lvgl_indev.c
/**
 * @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;
}