启动一个Freertos任务

InfraredLvgl_PostKey()

static void KeyTask_Handler(void *argument)
{
    TickType_t last_wake;
    (void)argument;
    last_wake = xTaskGetTickCount();
    printf("[RTOS] KeyTask started, priority=%u.\n",
           (unsigned)uxTaskPriorityGet(NULL));

    for (;;) {
        BoardButtonEvent event;
        uint32_t now_ms = InfraredLvgl_GetMillis();
        if (BoardButtons_Scan(10, &event)) {
            BoardBuzzer_Beep(10, 50U);
            InfraredLvgl_PostKey(event);
            printf("[KEY] event=%u.\n", (unsigned)event);
        }
        vTaskDelayUntil(&last_wake, pdMS_TO_TICKS(10U));
    }
}

投递ui_keys_post()到Freertos队列中

static QueueHandle_t s_key_queue;
void InfraredLvgl_PostKey(BoardButtonEvent event)
{
    (void)ui_keys_post(event);
}
bool ui_keys_post(BoardButtonEvent event)
{
    if (s_key_queue == NULL || event == BOARD_BUTTON_NONE) return false;
    return xQueueSend(s_key_queue, &event, 0U) == pdPASS;
}

lvgl轮询去读(内部)

bool indev_init(void)
{
    static lv_indev_drv_t drv;   /* LVGL 持有该指针,不能是栈变量 */

    lv_indev_drv_init(&drv);
    drv.type = LV_INDEV_TYPE_KEYPAD;
    drv.read_cb = indev_read; //轮询触发indev_read回调
    s_indev = lv_indev_drv_register(&drv);
    return s_indev != NULL;
}

static void indev_read(lv_indev_drv_t *drv, lv_indev_data_t *data)
{
    BoardButtonEvent event;
    if (!ui_keys_poll(&event)) return;
}

处理Freertos队列消息

static bool ui_keys_poll(BoardButtonEvent *event)
{
    if (s_key_queue == NULL || event == NULL) return false;
    return xQueueReceive(s_key_queue, event, 0U) == pdPASS;
}

界面处理接收事件

// 创建一个widget
lv_obj_t *widget;
widget = lv_obj_create(NULL);

//创建一个group
lv_group_t *group;
group = lv_group_create();

//让界面和group绑定然后就可以接收group的事件了
lv_group_add_obj(group, widget);

//接收事件
lv_obj_add_event_cb(widget, key_cb, LV_EVENT_KEY, NULL);
static void key_cb(lv_event_t *event)
{
	//处理输入事件
}
//让group和输入事件lv_index进行绑定
lv_indev_set_group(indev, group);

触摸输入也是同理,但有出入

参考:参考