This is an automated email from the ASF dual-hosted git repository.

pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git


The following commit(s) were added to refs/heads/master by this push:
     new 6f192bd1e lvgl/port: add libuv porting
6f192bd1e is described below

commit 6f192bd1e0de410d6b2b7d68ce724638a3ed1c32
Author: pengyiqiang <pengyiqi...@xiaomi.com>
AuthorDate: Wed Feb 22 16:00:41 2023 +0800

    lvgl/port: add libuv porting
    
    Signed-off-by: pengyiqiang <pengyiqi...@xiaomi.com>
---
 examples/lvgldemo/lvgldemo.c       |  15 +++
 graphics/lvgl/Kconfig              |   5 +
 graphics/lvgl/Makefile             |   3 +
 graphics/lvgl/port/lv_port_libuv.c | 186 +++++++++++++++++++++++++++++++++++++
 graphics/lvgl/port/lv_port_libuv.h |  92 ++++++++++++++++++
 5 files changed, 301 insertions(+)

diff --git a/examples/lvgldemo/lvgldemo.c b/examples/lvgldemo/lvgldemo.c
index 076ab10f9..8bc986cde 100644
--- a/examples/lvgldemo/lvgldemo.c
+++ b/examples/lvgldemo/lvgldemo.c
@@ -36,6 +36,11 @@
 #include <port/lv_port.h>
 #include <lvgl/demos/lv_demos.h>
 
+#ifdef CONFIG_LIBUV
+#  include <uv.h>
+#  include <port/lv_port_libuv.h>
+#endif
+
 /****************************************************************************
  * Pre-processor Definitions
  ****************************************************************************/
@@ -175,6 +180,10 @@ int main(int argc, FAR char *argv[])
   const int func_key_pair_len = sizeof(func_key_pair) /
                                 sizeof(func_key_pair[0]);
 
+#ifdef CONFIG_LIBUV
+  uv_loop_t ui_loop;
+#endif
+
   /* If no arguments are specified and only 1 demo exists, select the demo */
 
   if (argc == 1 && func_key_pair_len == 2)  /* 2 because of NULL sentinel */
@@ -225,6 +234,11 @@ int main(int argc, FAR char *argv[])
 
   /* Handle LVGL tasks */
 
+#ifdef CONFIG_LIBUV
+  uv_loop_init(&ui_loop);
+  lv_port_libuv_init(&ui_loop);
+  uv_run(&ui_loop, UV_RUN_DEFAULT);
+#else
   while (1)
     {
       uint32_t idle;
@@ -235,6 +249,7 @@ int main(int argc, FAR char *argv[])
       idle = idle ? idle : 1;
       usleep(idle * 1000);
     }
+#endif
 
   return EXIT_SUCCESS;
 }
diff --git a/graphics/lvgl/Kconfig b/graphics/lvgl/Kconfig
index c902757ae..aedf75bfd 100644
--- a/graphics/lvgl/Kconfig
+++ b/graphics/lvgl/Kconfig
@@ -54,6 +54,11 @@ config LV_PORT_FBDEV_DEFAULT_DEVICEPATH
        default "/dev/fb0"
        depends on LV_PORT_USE_FBDEV
 
+config LV_PORT_UV_POLL_DEVICEPATH
+       string "Display poll device path"
+       depends on LIBUV
+       default "/dev/fb0"
+
 config LV_PORT_USE_TOUCHPAD
        bool "Enable touchpad port"
        default n
diff --git a/graphics/lvgl/Makefile b/graphics/lvgl/Makefile
index 9188e5d73..e16bf05e3 100644
--- a/graphics/lvgl/Makefile
+++ b/graphics/lvgl/Makefile
@@ -34,6 +34,9 @@ CFLAGS += -Wno-format -Wno-unused-variable
 CSRCS += port/lv_port.c
 CSRCS += port/lv_port_tick.c
 
+ifeq ($(CONFIG_LIBUV),y)
+CSRCS += port/lv_port_libuv.c
+endif
 
 ifeq ($(CONFIG_LV_PORT_USE_LCDDEV),y)
 CSRCS += port/lv_port_lcddev.c
diff --git a/graphics/lvgl/port/lv_port_libuv.c 
b/graphics/lvgl/port/lv_port_libuv.c
new file mode 100644
index 000000000..d91fdb238
--- /dev/null
+++ b/graphics/lvgl/port/lv_port_libuv.c
@@ -0,0 +1,186 @@
+/****************************************************************************
+ * apps/graphics/lvgl/port/lv_port_libuv.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <errno.h>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <uv.h>
+#include <stdlib.h>
+#include <lvgl/lvgl.h>
+#include "lv_port_libuv.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Type Declarations
+ ****************************************************************************/
+
+struct lv_uv_ctx_s
+{
+  int fd;
+  uv_timer_t ui_timer;
+  uv_poll_t ui_refr;
+};
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: ui_timer_cb
+ ****************************************************************************/
+
+static void ui_timer_cb(FAR uv_timer_t *handle)
+{
+  uint32_t sleep_ms;
+  LV_LOG_TRACE("start");
+
+  sleep_ms = lv_timer_handler();
+
+  /* Prevent busy loops. */
+
+  if (sleep_ms == 0)
+    {
+      sleep_ms = 1;
+    }
+
+  uv_timer_start(handle, ui_timer_cb, sleep_ms, 0);
+  LV_LOG_TRACE("stop, sleep %" PRIu32 " ms", sleep_ms);
+}
+
+/****************************************************************************
+ * Name: ui_refr_cb
+ ****************************************************************************/
+
+static void ui_refr_cb(FAR uv_poll_t *handle, int status, int events)
+{
+  LV_LOG_TRACE("start");
+  _lv_disp_refr_timer(NULL);
+  LV_LOG_TRACE("stop");
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_port_libuv_init
+ *
+ * Description:
+ *   Add the UI event loop to the uv_loop.
+ *
+ * Input Parameters:
+ *   loop - Pointer to uv_loop.
+ *
+ * Returned Value:
+ *   Pointer to UI event context.
+ *
+ ****************************************************************************/
+
+FAR void *lv_port_libuv_init(FAR void *loop)
+{
+  int fd;
+  FAR uv_loop_t *ui_loop = loop;
+  FAR lv_disp_t *disp;
+  FAR struct lv_uv_ctx_s *uv_ctx;
+
+  LV_LOG_INFO("dev: " CONFIG_LV_PORT_UV_POLL_DEVICEPATH " opening...");
+  fd = open(CONFIG_LV_PORT_UV_POLL_DEVICEPATH, O_WRONLY);
+  if (fd < 0)
+    {
+      LV_LOG_ERROR(CONFIG_LV_PORT_UV_POLL_DEVICEPATH
+                   " open failed: %d", errno);
+      return NULL;
+    }
+
+  disp = lv_disp_get_default();
+  LV_ASSERT_NULL(disp);
+
+  if (disp->refr_timer == NULL)
+    {
+      LV_LOG_ERROR("disp->refr_timer is NULL");
+      close(fd);
+      return NULL;
+    }
+
+  /* Remove default refr timer. */
+
+  lv_timer_del(disp->refr_timer);
+  disp->refr_timer = NULL;
+
+  uv_ctx = malloc(sizeof(struct lv_uv_ctx_s));
+  LV_ASSERT_MALLOC(uv_ctx);
+
+  memset(uv_ctx, 0, sizeof(struct lv_uv_ctx_s));
+  uv_ctx->fd = fd;
+
+  LV_LOG_INFO("init ui_timer...");
+  uv_timer_init(ui_loop, &uv_ctx->ui_timer);
+  uv_timer_start(&uv_ctx->ui_timer, ui_timer_cb, 1, 1);
+
+  LV_LOG_INFO("init ui_refr...");
+  uv_poll_init(ui_loop, &uv_ctx->ui_refr, fd);
+  uv_poll_start(&uv_ctx->ui_refr, UV_WRITABLE, ui_refr_cb);
+
+  LV_LOG_INFO("ui loop start OK");
+  return uv_ctx;
+}
+
+/****************************************************************************
+ * Name: lv_port_libuv_uninit
+ *
+ * Description:
+ *   Remove the UI event loop.
+ *
+ * Input Parameters:
+ *   Pointer to UI event context.
+ *
+ ****************************************************************************/
+
+void lv_port_libuv_uninit(FAR void *ctx)
+{
+  FAR struct lv_uv_ctx_s *uv_ctx = ctx;
+
+  if (uv_ctx == NULL)
+    {
+      LV_LOG_WARN("uv_ctx is NULL");
+      return;
+    }
+
+  uv_close((FAR uv_handle_t *)&uv_ctx->ui_timer, NULL);
+  uv_close((FAR uv_handle_t *)&uv_ctx->ui_refr, NULL);
+  close(uv_ctx->fd);
+  free(ctx);
+  LV_LOG_INFO("ui loop close OK");
+}
diff --git a/graphics/lvgl/port/lv_port_libuv.h 
b/graphics/lvgl/port/lv_port_libuv.h
new file mode 100644
index 000000000..905fb674b
--- /dev/null
+++ b/graphics/lvgl/port/lv_port_libuv.h
@@ -0,0 +1,92 @@
+/****************************************************************************
+ * apps/graphics/lvgl/port/lv_port_libuv.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __APPS_GRAPHICS_LVGL_PORT_LV_PORT_LIBUV_H
+#define __APPS_GRAPHICS_LVGL_PORT_LV_PORT_LIBUV_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#if defined(CONFIG_LIBUV)
+
+/****************************************************************************
+ * Type Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lv_port_libuv_init
+ *
+ * Description:
+ *   Add the UI event loop to the uv_loop.
+ *
+ * Input Parameters:
+ *   loop - Pointer to uv_loop.
+ *
+ * Returned Value:
+ *   Pointer to UI event context.
+ *
+ ****************************************************************************/
+
+FAR void *lv_port_libuv_init(FAR void *loop);
+
+/****************************************************************************
+ * Name: lv_port_libuv_uninit
+ *
+ * Description:
+ *   Remove the UI event loop.
+ *
+ * Input Parameters:
+ *   Pointer to UI event context.
+ *
+ ****************************************************************************/
+
+void lv_port_libuv_uninit(FAR void *ctx);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CONFIG_LIBUV */
+
+#endif /* __APPS_GRAPHICS_LVGL_PORT_LV_PORT_LIBUV_H */

Reply via email to