lvgl_view.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /*
  2. * Copyright (c) 2020 Actions Technology Co., Ltd
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <lvgl/porting/lvgl_porting.h>
  7. #include <lvgl/lvgl_view.h>
  8. #include <lvgl/lvgl_memory.h>
  9. #include <lvgl/lvgl_virtual_display.h>
  10. #include <ui_surface.h>
  11. #include <ui_service.h>
  12. #include <ui_manager.h>
  13. #include <display/display_hal.h>
  14. #include "lvgl_input_dev.h"
  15. #ifdef CONFIG_GLYPHIX
  16. #include "gx_lvgx.h"
  17. #endif
  18. static void * _lvgl_view_init(surface_t * surface)
  19. {
  20. lv_disp_t *disp = NULL;
  21. disp = lvgl_virtual_display_create(surface);
  22. if (disp == NULL) {
  23. SYS_LOG_ERR("Failed to create lvgl display");
  24. } else {
  25. /* set refr timer period to 1 ms, so it will always run when lv_timer_handler() invoked */
  26. lv_timer_set_period(disp->refr_timer, 1);
  27. }
  28. return disp;
  29. }
  30. static void _lvgl_view_deinit(void * display)
  31. {
  32. lvgl_virtual_display_destroy(display);
  33. }
  34. static int _lvgl_view_resume(void * display, bool full_invalidate)
  35. {
  36. lv_disp_t *disp = display;
  37. disp->driver->refr_paused = 0;
  38. /* redraw the inv areas if any */
  39. lv_timer_resume(disp->refr_timer);
  40. if (full_invalidate)
  41. lv_obj_invalidate(lv_disp_get_scr_act(disp));
  42. return 0;
  43. }
  44. static int _lvgl_view_pause(void * display)
  45. {
  46. lv_disp_t *disp = display;
  47. disp->driver->refr_paused = 1;
  48. return 0;
  49. }
  50. static int _lvgl_view_set_default(void * display)
  51. {
  52. return lvgl_virtual_display_set_default(display);
  53. }
  54. static int _lvgl_view_focus(void * display, bool focus)
  55. {
  56. if (focus) {
  57. return lvgl_virtual_display_set_focus(display, false);
  58. }
  59. return 0;
  60. }
  61. static int _lvgl_view_refresh(void * display, bool full_refresh)
  62. {
  63. lv_disp_t *disp = display;
  64. if (disp->driver->refr_paused == 0) {
  65. if (full_refresh)
  66. lv_obj_invalidate(lv_disp_get_scr_act(disp));
  67. lv_refr_now(disp);
  68. return 0;
  69. }
  70. return -EPERM;
  71. }
  72. static void _lvgl_view_task_handler(void)
  73. {
  74. /* run indev read_timer() before display refr_timer */
  75. lv_indev_t *indev = lv_indev_get_next(NULL);
  76. while (indev) {
  77. if (indev->driver->read_timer)
  78. lv_indev_read_timer_cb(indev->driver->read_timer);
  79. indev = lv_indev_get_next(indev);
  80. }
  81. lv_timer_handler();
  82. #ifdef CONFIG_GLYPHIX
  83. lvgx_process_events();
  84. #endif
  85. }
  86. static const ui_view_gui_callback_t view_callback = {
  87. .init = _lvgl_view_init,
  88. .deinit = _lvgl_view_deinit,
  89. .resume = _lvgl_view_resume,
  90. .pause = _lvgl_view_pause,
  91. .set_default = _lvgl_view_set_default,
  92. .focus = _lvgl_view_focus,
  93. .refresh = _lvgl_view_refresh,
  94. .task_handler = _lvgl_view_task_handler,
  95. };
  96. static void _msg_callback(struct app_msg *msg, int res, void *data)
  97. {
  98. uint32_t opa_format;
  99. uint32_t trans_format;
  100. if (LV_COLOR_DEPTH == 16) {
  101. opa_format = HAL_PIXEL_FORMAT_RGB_565;
  102. trans_format = HAL_PIXEL_FORMAT_ARGB_8565;
  103. } else {
  104. opa_format = (surface_get_max_possible_buffer_count() > 0) ?
  105. HAL_PIXEL_FORMAT_BGR_888 : HAL_PIXEL_FORMAT_XRGB_8888;
  106. trans_format = HAL_PIXEL_FORMAT_ARGB_8888;
  107. }
  108. lv_port_init();
  109. /* set anim timer period to 1 ms, so it will always run when lv_timer_handler() invoked */
  110. lv_timer_set_period(lv_anim_get_timer(), 1);
  111. /* register view callback */
  112. ui_service_register_gui_view_callback(UI_VIEW_LVGL, opa_format, trans_format, &view_callback);
  113. /* register input callback */
  114. lvgl_input_pointer_init();
  115. }
  116. int lvgl_view_system_init(void)
  117. {
  118. if (is_in_ui_thread()) {
  119. _msg_callback(NULL, 0, NULL);
  120. return 0;
  121. }
  122. return ui_message_send_sync2(VIEW_INVALID_ID, MSG_VIEW_NULL, 0, _msg_callback);
  123. }
  124. #ifdef CONFIG_GLYPHIX
  125. static void _lvgx_init_callback(struct app_msg *msg, int res, void *data)
  126. {
  127. lvgx_init();
  128. }
  129. int lvgx_view_system_init(void)
  130. {
  131. if (is_in_ui_thread()) {
  132. _lvgx_init_callback(NULL, 0, NULL);
  133. return 0;
  134. }
  135. return ui_message_send_sync2(VIEW_INVALID_ID, MSG_VIEW_NULL, 0, _lvgx_init_callback);
  136. }
  137. #endif