info.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. */
  9. #include <rtthread.h>
  10. #ifdef RT_USING_RTGUI
  11. #include <rtgui/rtgui.h>
  12. #include <rtgui/rtgui_server.h>
  13. #include <rtgui/rtgui_system.h>
  14. #include <rtgui/widgets/view.h>
  15. #include <rtgui/widgets/workbench.h>
  16. #include "adc.h"
  17. #include "cpuusage.h"
  18. extern rt_uint16_t adc_value;
  19. static rt_uint8_t index = 0 ;
  20. static rt_bool_t view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
  21. {
  22. if (event->type == RTGUI_EVENT_PAINT)
  23. {
  24. struct rtgui_dc* dc;
  25. struct rtgui_rect rect;
  26. dc = rtgui_dc_begin_drawing(widget);
  27. if (dc == RT_NULL)
  28. return RT_FALSE;
  29. rtgui_widget_get_rect(widget, &rect);
  30. rtgui_dc_fill_rect(dc, &rect);
  31. rect.x2 -= 1; rect.y2 -= 1;
  32. rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y1);
  33. rtgui_dc_draw_vline(dc, rect.x1, rect.y1, rect.y2);
  34. rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y2);
  35. rtgui_dc_draw_vline(dc, rect.x2, rect.y1, rect.y2 + 1);
  36. /* shrink border */
  37. rtgui_rect_inflate(&rect, -1);
  38. /* draw text */
  39. rtgui_widget_get_rect(widget, &rect);
  40. rect.y1 += 25;
  41. rtgui_dc_draw_text(dc, " FM3 Easy Kit Demo", &rect);
  42. rect.y1 += 10;
  43. rtgui_dc_draw_text(dc, " rt-thread / RTGUI", &rect);
  44. rtgui_dc_end_drawing(dc, RT_TRUE);
  45. return RT_FALSE;
  46. }
  47. else if (event->type == RTGUI_EVENT_KBD)
  48. {
  49. struct rtgui_dc* dc;
  50. struct rtgui_rect rect;
  51. struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event;
  52. if (ekbd->type == RTGUI_KEYDOWN)
  53. {
  54. char key_str[16];
  55. switch (ekbd->key)
  56. {
  57. case RTGUIK_LEFT:
  58. rt_sprintf(key_str, "%s", "L");
  59. break;
  60. case RTGUIK_RIGHT:
  61. rt_sprintf(key_str, "%s", "R");
  62. break;
  63. case RTGUIK_DOWN:
  64. rt_sprintf(key_str, "%s", "D");
  65. break;
  66. case RTGUIK_UP:
  67. rt_sprintf(key_str, "%s", "U");
  68. break;
  69. default:
  70. rt_sprintf(key_str, "%s", "S");
  71. break;
  72. }
  73. dc = rtgui_dc_begin_drawing(widget);
  74. if (dc == RT_NULL)
  75. return RT_FALSE;
  76. rect.x1 = 118;
  77. rect.y1 = 1;
  78. rect.x2 = 127;
  79. rect.y2 = 10;
  80. rtgui_dc_fill_rect(dc, &rect);
  81. rtgui_dc_draw_text(dc, key_str, &rect);
  82. rtgui_dc_end_drawing(dc, RT_TRUE);
  83. }
  84. else if (ekbd->type == RTGUI_KEYUP)
  85. {
  86. dc = rtgui_dc_begin_drawing(widget);
  87. if (dc == RT_NULL)
  88. return RT_FALSE;
  89. rect.x1 = 118;
  90. rect.y1 = 1;
  91. rect.x2 = 127;
  92. rect.y2 = 10;
  93. rtgui_dc_fill_rect(dc, &rect);
  94. //rtgui_dc_draw_text(dc, key_str, &rect);
  95. rtgui_dc_end_drawing(dc, RT_TRUE);
  96. }
  97. }
  98. else if (event->type == RTGUI_EVENT_COMMAND)
  99. {
  100. char str[16];
  101. struct rtgui_dc* dc;
  102. struct rtgui_rect rect;
  103. struct rtgui_event_command* ecmd;
  104. rt_uint8_t major,minor;
  105. dc = rtgui_dc_begin_drawing(widget);
  106. if (dc == RT_NULL)
  107. return RT_FALSE;
  108. ecmd = (struct rtgui_event_command*)event;
  109. switch (ecmd->command_id)
  110. {
  111. case ADC_UPDATE:
  112. rect.x1 = 1;
  113. rect.y1 = 1;
  114. rect.x2 = 117;
  115. rect.y2 = 10;
  116. rtgui_dc_fill_rect(dc, &rect);
  117. rt_sprintf(str, "ADC = %d mv", adc_value);
  118. rtgui_dc_draw_text(dc, str, &rect);
  119. break;
  120. case CPU_UPDATE:
  121. cpu_usage_get(&major, &minor);
  122. rect.x1 = 1;
  123. rect.y1 = 12;
  124. rect.x2 = 127;
  125. rect.y2 = 22;
  126. rtgui_dc_fill_rect(dc, &rect);
  127. rt_sprintf(str, "CPU : %d.%d%", major, minor);
  128. rtgui_dc_draw_text(dc, str, &rect);
  129. rect.y1 = 23;
  130. rect.y2 = 63;
  131. index++;
  132. if (index == 127)
  133. {
  134. index = 1;
  135. rtgui_dc_fill_rect(dc, &rect);
  136. }
  137. if (major>40)
  138. rtgui_dc_draw_vline(dc, index, rect.y1, rect.y2);
  139. else
  140. rtgui_dc_draw_vline(dc, index, rect.y2-major, rect.y2);
  141. break;
  142. }
  143. rtgui_dc_end_drawing(dc, RT_TRUE);
  144. }
  145. return rtgui_view_event_handler(widget, event);
  146. }
  147. static void info_entry(void* parameter)
  148. {
  149. rt_mq_t mq;
  150. struct rtgui_view* view;
  151. struct rtgui_workbench* workbench;
  152. mq = rt_mq_create("qInfo", 256, 4, RT_IPC_FLAG_FIFO);
  153. rtgui_thread_register(rt_thread_self(), mq);
  154. workbench = rtgui_workbench_create("info", "workbench");
  155. if(workbench == RT_NULL)
  156. return;
  157. view = rtgui_view_create("view");
  158. RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(view)) = white;
  159. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(view)) = black;
  160. rtgui_widget_set_event_handler(RTGUI_WIDGET(view), view_event_handler);
  161. rtgui_workbench_add_view(workbench, view);
  162. /* this view can be focused */
  163. RTGUI_WIDGET(view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
  164. /* set widget focus */
  165. rtgui_widget_focus(RTGUI_WIDGET(view));
  166. rtgui_view_show(view, RT_FALSE);
  167. rtgui_workbench_event_loop(workbench);
  168. rtgui_thread_deregister(rt_thread_self());
  169. rt_mq_delete(mq);
  170. }
  171. rt_thread_t info_tid;
  172. void info_init()
  173. {
  174. info_tid = rt_thread_create("info",
  175. info_entry, RT_NULL,
  176. 2048, 25, 10);
  177. if (info_tid != RT_NULL) rt_thread_startup(info_tid);
  178. }
  179. void rtgui_startup()
  180. {
  181. rtgui_rect_t rect;
  182. rtgui_system_server_init();
  183. /* register dock panel */
  184. rect.x1 = 0;
  185. rect.y1 = 0;
  186. rect.x2 = 128;
  187. rect.y2 = 64;
  188. rtgui_panel_register("info", &rect);
  189. rtgui_panel_set_default_focused("info");
  190. /*init info workbench */
  191. info_init();
  192. }
  193. #endif