Login
1 branch 0 tags
Ben (Desktop/Arch) Software controlled display brightness c2671dd 1 month ago 67 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;
}