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