Login
1 branch 0 tags
Ben (Desktop/Arch) ToDos bd8dbad 1 month ago 61 Commits
moon / 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; }