main.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. /*
  2. * Copyright (c) 2020 Actions Technology Co., Ltd
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stdint.h>
  9. #include <board_cfg.h>
  10. #include <os_common_api.h>
  11. #include <lvgl.h>
  12. #include <lvgl/porting/lvgl_porting.h>
  13. #include <lvgl/lvgl_bitmap_font.h>
  14. #include <lvgl/lvgl_freetype_font.h>
  15. #include <drivers/input/input_dev.h>
  16. #include <mem_manager.h>
  17. #include <sys_manager.h>
  18. #include <bt_manager.h>
  19. #include <thread_timer.h>
  20. //#include <thread_wdg.h>
  21. #include <sys_wakelock.h>
  22. #include <sensor_manager.h>
  23. #include <partition/partition.h>
  24. #include "app_msg.h"
  25. #include "ota_app.h"
  26. // NOR:A ~ NOR:C --> file_id: 10 ~ 12 (firmware.xml)
  27. #define DEF_FONT22_FILE "/NOR:C/sans22.font"
  28. #define DEF_VFONT_FILE "/NOR:C/vfont.ttf"
  29. static void _disp_vsync_cb(const lv_port_disp_callback_t *callback, uint32_t timestamp);
  30. static void _disp_pm_notify(const struct lv_port_disp_callback *callback, uint32_t pm_state);
  31. static K_SEM_DEFINE(disp_vsync_sem, 0, 1);
  32. static const lv_port_disp_callback_t disp_callback = {
  33. .vsync = _disp_vsync_cb,
  34. .pm_notify = _disp_pm_notify,
  35. };
  36. static uint8_t disp_active = 1;
  37. static void _disp_vsync_cb(const lv_port_disp_callback_t *callback, uint32_t timestamp)
  38. {
  39. k_sem_give(&disp_vsync_sem);
  40. }
  41. static void _disp_pm_notify(const struct lv_port_disp_callback *callback, uint32_t pm_state)
  42. {
  43. switch (pm_state) {
  44. case PM_DEVICE_ACTION_EARLY_SUSPEND:
  45. app_msg_send(APP_NAME, MSG_UI, CMD_SCREEN_OFF);
  46. break;
  47. case PM_DEVICE_ACTION_LATE_RESUME:
  48. app_msg_send(APP_NAME, MSG_UI, CMD_SCREEN_ON);
  49. break;
  50. default:
  51. break;
  52. }
  53. }
  54. static void _keypad_callback(struct device *dev, struct input_value *val)
  55. {
  56. static uint32_t last_value = 0;
  57. SYS_LOG_INF("type: %d, code:%d, value:%d\n",
  58. val->keypad.type, val->keypad.code, val->keypad.value);
  59. if (last_value != val->keypad.value) {
  60. // screen on
  61. sys_wake_lock(FULL_WAKE_LOCK);
  62. sys_wake_unlock(FULL_WAKE_LOCK);
  63. last_value = val->keypad.value;
  64. }
  65. }
  66. static void _keypad_init(void)
  67. {
  68. struct device *onoff_dev;
  69. onoff_dev = (struct device *)device_get_binding(CONFIG_INPUT_DEV_ACTS_ONOFF_KEY_NAME);
  70. if (!onoff_dev) {
  71. SYS_LOG_ERR("cannot found key dev %s", CONFIG_INPUT_DEV_ACTS_ONOFF_KEY_NAME);
  72. return;
  73. }
  74. input_dev_enable(onoff_dev);
  75. input_dev_register_notify(onoff_dev, _keypad_callback);
  76. }
  77. static void _lvgl_init(void)
  78. {
  79. lv_port_init();
  80. lv_port_disp_register_callback(&disp_callback);
  81. // init font
  82. lvgl_bitmap_font_init(NULL);
  83. lvgl_freetype_font_init();
  84. }
  85. static void _anim_callback(void *obj, int32_t val)
  86. {
  87. lv_obj_set_y(obj, val);
  88. lv_obj_invalidate(lv_scr_act());
  89. }
  90. static void _lvgl_anim_demo(const char* text)
  91. {
  92. //static lv_font_t ttf_font;
  93. //static lv_font_t bmp_font;
  94. // open ttf font
  95. //if (lvgl_freetype_font_open(&ttf_font, DEF_VFONT_FILE, 24) < 0) {
  96. //SYS_LOG_ERR("ttf font not found");
  97. //return;
  98. //}
  99. // open bitmap font
  100. //if (lvgl_bitmap_font_open(&bmp_font, DEF_FONT22_FILE) < 0) {
  101. //SYS_LOG_ERR("bitmap font not found");
  102. //return;
  103. //}
  104. lv_obj_t * label = lv_label_create(lv_scr_act());
  105. lv_obj_set_pos(label, 100, 100);
  106. lv_obj_set_style_text_color(label, lv_color_make(255, 0, 0), LV_PART_MAIN);
  107. //lv_obj_set_style_text_font(label, &ttf_font, 0); // set ttf font
  108. //lv_obj_set_style_text_font(label, &bmp_font, 0); // set bitmap font
  109. lv_label_set_text(label, text);
  110. lv_anim_t anim;
  111. lv_anim_init(&anim);
  112. lv_anim_set_var(&anim, label);
  113. lv_anim_set_values(&anim, 0, CONFIG_PANEL_VER_RES);
  114. lv_anim_set_time(&anim, 1000);
  115. lv_anim_set_repeat_count(&anim, LV_ANIM_REPEAT_INFINITE);
  116. lv_anim_set_playback_time(&anim, 1000);
  117. lv_anim_set_exec_cb(&anim, _anim_callback);
  118. lv_anim_start(&anim);
  119. lv_refr_now(lv_disp_get_default());
  120. }
  121. static int _sensor_callback(int evt_id, sensor_res_t *res)
  122. {
  123. SYS_LOG_INF("evt_id=%d, handup=%d, step=%d", evt_id, res->handup,
  124. (uint32_t)res->pedometer.total_steps);
  125. return 0;
  126. }
  127. static void _sensor_init(void)
  128. {
  129. sensor_manager_enable(ALGO_ACTIVITY_OUTPUT, 0);
  130. sensor_manager_enable(ALGO_HANDUP, 0);
  131. sensor_manager_add_callback(_sensor_callback);
  132. }
  133. static void _process_ui_msg(struct app_msg *msg)
  134. {
  135. switch (msg->cmd) {
  136. case CMD_SCREEN_OFF:
  137. disp_active = 0;
  138. lv_port_refr_pause();
  139. break;
  140. case CMD_SCREEN_ON:
  141. disp_active = 1;
  142. lv_port_refr_resume();
  143. lv_obj_invalidate(lv_scr_act());
  144. lv_port_refr_ready();
  145. break;
  146. default:
  147. break;
  148. }
  149. }
  150. int main(void)
  151. {
  152. // init system
  153. mem_manager_init();
  154. system_init();
  155. bt_manager_init();
  156. // init app msg
  157. app_msg_init();
  158. // init lvgl
  159. _lvgl_init();
  160. // ota check and show animation
  161. if (ota_is_already_running()) {
  162. SYS_LOG_ERR("Error: ota running!");
  163. } else if (ota_is_already_done()) {
  164. _lvgl_anim_demo("Ota done!");
  165. } else {
  166. _lvgl_anim_demo("Hello world!");
  167. }
  168. // init key device
  169. _keypad_init();
  170. // init sensor
  171. _sensor_init();
  172. // init ota
  173. ota_app_init();
  174. ota_app_init_bluetooth();
  175. system_ready();
  176. // start soft watchdog
  177. //thread_wdg_start();
  178. while (1) {
  179. struct app_msg msg;
  180. uint32_t lv_timeout = lv_task_handler();
  181. uint32_t tt_timeout = thread_timer_next_timeout();
  182. uint32_t timeout = MIN(lv_timeout, tt_timeout);
  183. int rc = poll_msg(&msg, &disp_vsync_sem, timeout);
  184. switch (rc) {
  185. case OS_POLL_MSG:
  186. SYS_LOG_INF("msg type=0x%x, cmd=0x%x", msg.type, msg.cmd);
  187. switch (msg.type) {
  188. case MSG_UI:
  189. _process_ui_msg(&msg);
  190. break;
  191. case MSG_OTA:
  192. ota_app_process();
  193. break;
  194. }
  195. if (msg.callback != NULL) {
  196. msg.callback(&msg, 0, NULL);
  197. }
  198. break;
  199. case OS_POLL_SEM:
  200. if (disp_active) {
  201. lv_port_refr_ready();
  202. }
  203. break;
  204. }
  205. thread_timer_handle_expired();
  206. }
  207. return 0;
  208. }