启动一个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);