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