1414#include "freertos/portmacro.h"
1515#include "freertos/task.h"
1616#include "freertos/semphr.h"
17+ #include "freertos/event_groups.h"
1718#include "esp_lvgl_port.h"
1819#include "esp_lvgl_port_priv.h"
1920#include "lvgl.h"
@@ -30,7 +31,7 @@ typedef struct lvgl_port_ctx_s {
3031 TaskHandle_t lvgl_task ;
3132 SemaphoreHandle_t lvgl_mux ;
3233 SemaphoreHandle_t timer_mux ;
33- QueueHandle_t lvgl_queue ;
34+ EventGroupHandle_t lvgl_events ;
3435 SemaphoreHandle_t task_init_mux ;
3536 esp_timer_handle_t tick_timer ;
3637 bool running ;
@@ -79,8 +80,8 @@ esp_err_t lvgl_port_init(const lvgl_port_cfg_t *cfg)
7980 lvgl_port_ctx .task_init_mux = xSemaphoreCreateMutex ();
8081 ESP_GOTO_ON_FALSE (lvgl_port_ctx .task_init_mux , ESP_ERR_NO_MEM , err , TAG , "Create LVGL task sem fail!" );
8182 /* Task queue */
82- lvgl_port_ctx .lvgl_queue = xQueueCreate ( 100 , sizeof ( lvgl_port_event_t ) );
83- ESP_GOTO_ON_FALSE (lvgl_port_ctx .lvgl_queue , ESP_ERR_NO_MEM , err , TAG , "Create LVGL queue fail!" );
83+ lvgl_port_ctx .lvgl_events = xEventGroupCreate ( );
84+ ESP_GOTO_ON_FALSE (lvgl_port_ctx .lvgl_events , ESP_ERR_NO_MEM , err , TAG , "Create LVGL Event Group fail!" );
8485
8586 BaseType_t res ;
8687 if (cfg -> task_affinity < 0 ) {
@@ -169,23 +170,30 @@ void lvgl_port_unlock(void)
169170
170171esp_err_t lvgl_port_task_wake (lvgl_port_event_type_t event , void * param )
171172{
172- if (!lvgl_port_ctx .lvgl_queue ) {
173+ EventBits_t bits = 0 ;
174+ if (!lvgl_port_ctx .lvgl_events ) {
173175 return ESP_ERR_INVALID_STATE ;
174176 }
175177
176- lvgl_port_event_t ev = {
177- .type = event ,
178- .param = param ,
179- };
178+ /* Get unprocessed bits */
179+ if (xPortInIsrContext () == pdTRUE ) {
180+ bits = xEventGroupGetBitsFromISR (lvgl_port_ctx .lvgl_events );
181+ } else {
182+ bits = xEventGroupGetBits (lvgl_port_ctx .lvgl_events );
183+ }
184+
185+ /* Set event */
186+ bits |= event ;
180187
188+ /* Save */
181189 if (xPortInIsrContext () == pdTRUE ) {
182190 BaseType_t xHigherPriorityTaskWoken = pdFALSE ;
183- xQueueSendFromISR (lvgl_port_ctx .lvgl_queue , & ev , & xHigherPriorityTaskWoken );
191+ xEventGroupSetBitsFromISR (lvgl_port_ctx .lvgl_events , bits , & xHigherPriorityTaskWoken );
184192 if (xHigherPriorityTaskWoken ) {
185193 portYIELD_FROM_ISR ( );
186194 }
187195 } else {
188- xQueueSend (lvgl_port_ctx .lvgl_queue , & ev , 0 );
196+ xEventGroupSetBits (lvgl_port_ctx .lvgl_events , bits );
189197 }
190198
191199 return ESP_OK ;
@@ -212,7 +220,7 @@ IRAM_ATTR bool lvgl_port_task_notify(uint32_t value)
212220static void lvgl_port_task (void * arg )
213221{
214222 TaskHandle_t task_to_notify = (TaskHandle_t )arg ;
215- lvgl_port_event_t event ;
223+ EventBits_t events = 0 ;
216224 uint32_t task_delay_ms = 0 ;
217225 lv_indev_t * indev = NULL ;
218226
@@ -235,21 +243,17 @@ static void lvgl_port_task(void *arg)
235243 while (lvgl_port_ctx .running ) {
236244 /* Wait for queue or timeout (sleep task) */
237245 TickType_t wait = (pdMS_TO_TICKS (task_delay_ms ) >= 1 ? pdMS_TO_TICKS (task_delay_ms ) : 1 );
238- xQueueReceive (lvgl_port_ctx .lvgl_queue , & event , wait );
246+ events = xEventGroupWaitBits (lvgl_port_ctx .lvgl_events , 0xFF , pdTRUE , pdFALSE , wait );
239247
240248 if (lv_display_get_default () && lvgl_port_lock (0 )) {
241249
242250 /* Call read input devices */
243- if (event . type == LVGL_PORT_EVENT_TOUCH ) {
251+ if (events & LVGL_PORT_EVENT_TOUCH ) {
244252 xSemaphoreTake (lvgl_port_ctx .timer_mux , portMAX_DELAY );
245- if (event .param != NULL ) {
246- lv_indev_read (event .param );
247- } else {
248- indev = lv_indev_get_next (NULL );
249- while (indev != NULL ) {
250- lv_indev_read (indev );
251- indev = lv_indev_get_next (indev );
252- }
253+ indev = lv_indev_get_next (NULL );
254+ while (indev != NULL ) {
255+ lv_indev_read (indev );
256+ indev = lv_indev_get_next (indev );
253257 }
254258 xSemaphoreGive (lvgl_port_ctx .timer_mux );
255259 }
@@ -287,8 +291,8 @@ static void lvgl_port_task_deinit(void)
287291 if (lvgl_port_ctx .task_init_mux ) {
288292 vSemaphoreDelete (lvgl_port_ctx .task_init_mux );
289293 }
290- if (lvgl_port_ctx .lvgl_queue ) {
291- vQueueDelete (lvgl_port_ctx .lvgl_queue );
294+ if (lvgl_port_ctx .lvgl_events ) {
295+ vEventGroupDelete (lvgl_port_ctx .lvgl_events );
292296 }
293297 memset (& lvgl_port_ctx , 0 , sizeof (lvgl_port_ctx ));
294298#if LV_ENABLE_GC || !LV_MEM_CUSTOM
0 commit comments