info.c 6.0 KB

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