store the usage group in the private data. make sure and set the object again in...
[AROS.git] / workbench / system / SysMon / main.c
blob260ee9b8149a9c831a7401cd408e4de4a3d13f03
1 /*
2 Copyright 2010-2017, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #define DEBUG 0
7 #include <aros/debug.h>
9 #include <proto/alib.h>
10 #include <proto/muimaster.h>
12 #include <dos/dos.h>
14 #include <zune/graph.h>
16 #include "sysmon_intern.h"
18 #include "locale.h"
20 #define VERSION "$VER: SysMon 1.9 (26.02.2017) ©2011-2017 The AROS Development Team"
22 CONST_STRPTR CPU_DEFSTR = "CPU --\n--.- %";
24 //#define NOTYET_USED
26 AROS_UFH3(VOID, tasklistrefreshfunction,
27 AROS_UFHA(struct Hook *, h, A0),
28 AROS_UFHA(Object *, object, A2),
29 AROS_UFHA(APTR, msg, A1))
31 AROS_USERFUNC_INIT
33 struct SysMonData * smdata = h->h_Data;
34 IPTR taskReady = 0, taskWait = 0;
36 D(bug("[SysMon] %s(0x%p)\n", __func__, object));
38 GET(smdata->tasklist, MUIA_Tasklist_ReadyCount, &taskReady);
39 GET(smdata->tasklist, MUIA_Tasklist_WaitingCount, &taskWait);
41 __sprintf(smdata->tasklistinfobuf, smdata->msg_taskreadywait, taskReady, taskWait);
43 set(smdata->tasklistinfo, MUIA_Text_Contents, smdata->tasklistinfobuf);
45 AROS_USERFUNC_EXIT
48 #ifdef NOTYET_USED
49 AROS_UFH3(VOID, pageactivefunction,
50 AROS_UFHA(struct Hook *, h, A0),
51 AROS_UFHA(Object *, object, A2),
52 AROS_UFHA(APTR, msg, A1))
54 AROS_USERFUNC_INIT
56 IPTR thisPage = 0;
58 D(bug("[SysMon] %s(0x%p)\n", __func__, object));
60 // get the selected page
61 get(object, MUIA_Group_ActivePage, &thisPage);
63 D(bug("[SysMon] page #%d\n", thisPage));
65 // TODO: change the menu for the active page.
67 AROS_USERFUNC_EXIT
69 #endif
71 BOOL CreateApplication(struct SysMonData * smdata)
73 Object * menuitemfast,
74 * menuitemnormal,
75 * menuitemslow,
76 * cmenucpugauge,
77 * cmenucpugraph,
78 * cmenucpugraphpcpu = NULL;
80 Object * cpufreqgroup,
81 * cpufreqcntnr;
83 IPTR i;
84 ULONG processorcount;
86 processorcount = GetProcessorCount();
88 smdata->tabs[0] = _(MSG_TAB_TASKS);
89 smdata->tabs[1] = _(MSG_TAB_CPU);
90 smdata->tabs[2] = _(MSG_TAB_SYSTEM);
91 smdata->tabs[3] = NULL;
93 smdata->tasklistinfobuf = AllocVec(30, MEMF_PUBLIC);
94 smdata->tasklistrefreshhook.h_Entry = (APTR)tasklistrefreshfunction;
95 smdata->tasklistrefreshhook.h_Data = (APTR)smdata;
97 #ifdef NOTYET_USED
98 smdata->pageactivehook.h_Entry = (APTR)pageactivefunction;
99 smdata->pageactivehook.h_Data = (APTR)smdata;
100 #endif
102 smdata->msg_taskreadywait = (STRPTR)_(MSG_TASK_READY_WAIT);
103 smdata->msg_project = (STRPTR)_(MSG_PROJECT);
104 smdata->msg_refresh_speed = (STRPTR)_(MSG_REFRESH_SPEED);
105 smdata->msg_fast = (STRPTR)_(MSG_FAST);
106 smdata->msg_normal = (STRPTR)_(MSG_NORMAL);
107 smdata->msg_slow = (STRPTR)_(MSG_SLOW);
109 smdata->tasklist = (Object *)NewObject(Tasklist_CLASS->mcc_Class, NULL, MUIA_Tasklist_RefreshMSecs, MUIV_Tasklist_Refresh_Normal, TAG_DONE);
111 /* prepare the cpu frequency group */
112 cpufreqgroup = ColGroup(4),
113 End;
115 /* If we have more than 3 processors,
116 use a scrollgroup */
117 if (processorcount <= 4)
119 cpufreqcntnr = GroupObject,
120 GroupFrameT(_(MSG_FREQUENCY)),
121 Child, cpufreqgroup,
122 End;
124 else
126 cpufreqcntnr = ScrollgroupObject,
127 GroupFrameT(_(MSG_FREQUENCY)),
128 MUIA_Scrollgroup_FreeHoriz, FALSE,
129 MUIA_Scrollgroup_Contents, VirtgroupObject,
130 Child, cpufreqgroup,
131 End,
132 End;
135 smdata->application = ApplicationObject,
136 MUIA_Application_Title, __(MSG_APP_NAME),
137 MUIA_Application_Version, (IPTR) VERSION,
138 MUIA_Application_Author, (IPTR) "Krzysztof Smiechowicz",
139 MUIA_Application_Copyright, (IPTR)"©2011-2017, The AROS Development Team",
140 MUIA_Application_Base, (IPTR)"SYSMON",
141 MUIA_Application_Description, __(MSG_APP_TITLE),
142 SubWindow,
143 smdata->mainwindow = WindowObject,
144 MUIA_Window_Title, __(MSG_WINDOW_TITLE),
145 MUIA_Window_ID, MAKE_ID('S','Y','S','M'),
146 MUIA_Window_Height, MUIV_Window_Height_Visible(45),
147 MUIA_Window_Width, MUIV_Window_Width_Visible(35),
148 MUIA_Window_Menustrip, (MenustripObject,
149 MUIA_Family_Child, (MenuObject,
150 MUIA_Menu_Title, (IPTR)smdata->msg_project,
151 MUIA_Family_Child, (MenuitemObject,
152 MUIA_Menuitem_Title, (IPTR)smdata->msg_refresh_speed,
153 MUIA_Family_Child, (menuitemfast = MenuitemObject, MUIA_Menuitem_Title, (IPTR)smdata->msg_fast, MUIA_Menuitem_Shortcut, (IPTR)"F",End),
154 MUIA_Family_Child, (menuitemnormal = MenuitemObject, MUIA_Menuitem_Title, (IPTR)smdata->msg_normal, MUIA_Menuitem_Shortcut, (IPTR)"N",End),
155 MUIA_Family_Child, (menuitemslow = MenuitemObject, MUIA_Menuitem_Title, (IPTR)smdata->msg_slow, MUIA_Menuitem_Shortcut, (IPTR)"S",End),
156 End),
157 End),
158 End),
159 WindowContents,
160 smdata->pages = RegisterGroup(smdata->tabs),
161 Child, (VGroup,
162 Child, ListviewObject,
163 MUIA_Listview_List, (IPTR)smdata->tasklist,
164 End,
165 Child, VGroup,
166 Child, smdata->tasklistinfo = TextObject,
167 NoFrame,
168 MUIA_Font, MUIV_Font_Tiny,
169 MUIA_Text_PreParse, (IPTR)"\33r",
170 MUIA_Text_Contents, (IPTR)_(MSG_TASK_READY_WAIT_INIT),
171 End,
172 End,
173 End),
174 Child, (VGroup,
175 Child, (smdata->cpuusagegroup = HGroup,
176 GroupFrameT(_(MSG_USAGE)),
177 MUIA_ContextMenu, (MenustripObject,
178 MUIA_Family_Child, (MenuObject,
179 MUIA_Menu_Title, (IPTR)"Processor Load",
180 MUIA_Family_Child, (MenuitemObject,
181 MUIA_Menuitem_Title, (IPTR)"Display Mode",
182 MUIA_Family_Child, (cmenucpugauge = MenuitemObject, MUIA_Menuitem_Title, (IPTR)"Gauge", MUIA_Menuitem_Shortcut, (IPTR)"G",End),
183 MUIA_Family_Child, (cmenucpugraph = MenuitemObject, MUIA_Menuitem_Title, (IPTR)"Graph", MUIA_Menuitem_Shortcut, (IPTR)"S",End),
184 (processorcount > 1) ? MUIA_Family_Child : TAG_IGNORE,
185 (cmenucpugraphpcpu = MenuitemObject, MUIA_Menuitem_Title, (IPTR)"Graph Per Processor", MUIA_Menuitem_Shortcut, (IPTR)"P",End),
186 End),
187 End),
188 End),
189 Child, (IPTR)(smdata->cpuusageobj = ProcessorGroupObject(smdata, processorcount)),
190 End),
191 Child, cpufreqcntnr,
192 End),
193 Child, (VGroup,
194 Child, ColGroup(2),
195 Child, VGroup, GroupFrameT(_(MSG_MEMORY_SIZE)),
196 Child, ColGroup(2),
197 Child, Label(_(MSG_TOTAL_RAM)),
198 Child, smdata->memorysize[MEMORY_RAM] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
199 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"---- Kb",
200 End,
201 Child, Label(_(MSG_CHIP_RAM)),
202 Child, smdata->memorysize[MEMORY_CHIP] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
203 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
204 End,
205 Child, Label(_(MSG_FAST_RAM)),
206 Child, smdata->memorysize[MEMORY_FAST] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
207 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
208 End,
209 End,
210 End,
211 Child, VGroup, GroupFrameT(_(MSG_MEMORY_FREE)),
212 Child, ColGroup(2),
213 Child, Label(_(MSG_TOTAL_RAM)),
214 Child, smdata->memoryfree[MEMORY_RAM] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
215 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"---- Kb",
216 End,
217 Child, Label(_(MSG_CHIP_RAM)),
218 Child, smdata->memoryfree[MEMORY_CHIP] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
219 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
220 End,
221 Child, Label(_(MSG_FAST_RAM)),
222 Child, smdata->memoryfree[MEMORY_FAST] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
223 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
224 End,
225 End,
226 End,
227 End,
228 Child, ColGroup(2),
229 Child, VGroup, GroupFrameT(_(MSG_VIDEO_SIZE)),
230 Child, ColGroup(2),
231 Child, Label(_(MSG_VIDEO_RAM)),
232 Child, smdata->memorysize[MEMORY_VRAM] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
233 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
234 End,
235 Child, Label(_(MSG_GART_APER)),
236 Child, smdata->memorysize[MEMORY_GART] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
237 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
238 End,
239 End,
240 End,
241 Child, VGroup, GroupFrameT(_(MSG_VIDEO_FREE)),
242 Child, ColGroup(2),
243 Child, Label(_(MSG_VIDEO_RAM)),
244 Child, smdata->memoryfree[MEMORY_VRAM] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
245 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
246 End,
247 Child, Label(_(MSG_GART_APER)),
248 Child, smdata->memoryfree[MEMORY_GART] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
249 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
250 End,
251 End,
252 End,
253 End,
254 Child, HVSpace,
255 End),
256 End,
257 End,
258 End;
260 if (!smdata->application)
261 return FALSE;
263 DoMethod(smdata->mainwindow, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
264 smdata->application, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
266 DoMethod(menuitemfast, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
267 smdata->tasklist, 3, MUIM_Set, MUIA_Tasklist_RefreshMSecs, MUIV_Tasklist_Refresh_Fast);
268 DoMethod(menuitemnormal, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
269 smdata->tasklist, 3, MUIM_Set, MUIA_Tasklist_RefreshMSecs, MUIV_Tasklist_Refresh_Normal);
270 DoMethod(menuitemslow, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
271 smdata->tasklist, 3, MUIM_Set, MUIA_Tasklist_RefreshMSecs, MUIV_Tasklist_Refresh_Slow);
273 DoMethod(smdata->tasklist, MUIM_Notify, MUIA_Tasklist_Refreshed, TRUE,
274 smdata->application, 2, MUIM_CallHook, (IPTR)&smdata->tasklistrefreshhook);
276 #ifdef NOTYET_USED
277 DoMethod(smdata->pages, MUIM_Notify, MUIA_Group_ActivePage, MUIV_EveryTime,
278 smdata->pages, 2, MUIM_CallHook, (IPTR)&smdata->pageactivehook);
279 #endif
281 smdata->cpuusagecmhooks[0].h_Entry = (APTR)processorgaugehookfunc;
282 smdata->cpuusagecmhooks[0].h_Data = (APTR)smdata;
283 smdata->cpuusagecmhooks[1].h_Entry = (APTR)processorgraphhookfunc;
284 smdata->cpuusagecmhooks[1].h_Data = (APTR)smdata;
286 DoMethod(cmenucpugauge, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
287 smdata->application, 5, MUIM_Application_PushMethod,
288 smdata->application, 2, MUIM_CallHook, (IPTR)&smdata->cpuusagecmhooks[0]);
289 DoMethod(cmenucpugraph, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
290 smdata->application, 5, MUIM_Application_PushMethod,
291 smdata->application, 2, MUIM_CallHook, (IPTR)&smdata->cpuusagecmhooks[1]);
292 if (cmenucpugraphpcpu)
294 smdata->cpuusagecmhooks[2].h_Entry = (APTR)processorgraphpercpuhookfunc;
295 smdata->cpuusagecmhooks[2].h_Data = (APTR)smdata;
297 DoMethod(cmenucpugraphpcpu, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
298 smdata->application, 5, MUIM_Application_PushMethod,
299 smdata->application, 2, MUIM_CallHook, (IPTR)&smdata->cpuusagecmhooks[2]);
302 /* Adding cpu frequency labels */
303 smdata->cpufreqlabels = AllocVec(sizeof(Object *) * processorcount, MEMF_ANY | MEMF_CLEAR);
304 smdata->cpufreqvalues = AllocVec(sizeof(Object *) * processorcount, MEMF_ANY | MEMF_CLEAR);
306 for (i = 0; i < processorcount; i++)
308 smdata->cpufreqlabels[i] = TextObject, MUIA_Text_PreParse, "\33l",
309 MUIA_Text_Contents, (IPTR)"", End;
310 smdata->cpufreqvalues[i] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
311 MUIA_Text_PreParse, (IPTR)"\33l",
312 MUIA_Text_Contents, (IPTR)"", End;
314 DoMethod(cpufreqgroup, OM_ADDMEMBER, (IPTR)HVSpace);
315 DoMethod(cpufreqgroup, OM_ADDMEMBER, smdata->cpufreqlabels[i]);
316 DoMethod(cpufreqgroup, OM_ADDMEMBER, smdata->cpufreqvalues[i]);
317 DoMethod(cpufreqgroup, OM_ADDMEMBER, (IPTR)HVSpace);
319 DoMethod(cpufreqgroup, OM_ADDMEMBER, (IPTR)HVSpace);
320 DoMethod(cpufreqgroup, OM_ADDMEMBER, (IPTR)HVSpace);
321 DoMethod(cpufreqgroup, OM_ADDMEMBER, (IPTR)HVSpace);
322 DoMethod(cpufreqgroup, OM_ADDMEMBER, (IPTR)HVSpace);
324 return TRUE;
327 VOID DisposeApplication(struct SysMonData * smdata)
329 MUI_DisposeObject(smdata->application);
331 FreeVec(smdata->tasklistinfobuf);
332 FreeVec(smdata->cpufreqlabels);
333 FreeVec(smdata->cpufreqvalues);
336 VOID DeInitModules(struct SysMonModule ** modules, struct SysMonData *smdata, LONG lastinitedmodule)
338 LONG i;
340 for (i = lastinitedmodule; i >= 0; i--)
341 modules[i]->DeInit(smdata);
344 LONG InitModules(struct SysMonModule ** modules, struct SysMonData *smdata)
346 LONG lastinitedmodule = -1;
348 /* Make sure we initialize values ..*/
349 smdata->cpuusageclass = NULL;
351 while(modules[lastinitedmodule + 1] != NULL)
353 if (modules[lastinitedmodule + 1]->Init(smdata))
354 lastinitedmodule++;
355 else
357 DeInitModules(modules, smdata, lastinitedmodule);
358 return -1;
362 return lastinitedmodule;
365 int main()
367 ULONG signals = 0;
368 ULONG itercounter = 0;
369 struct SysMonData smdata;
370 struct SysMonModule * modules [] = {&memorymodule, &videomodule, &processormodule, &timermodule, NULL};
371 LONG lastinitedmodule = -1;
373 if ((lastinitedmodule = InitModules(modules, &smdata)) == -1)
374 return 1;
376 if (!CreateApplication(&smdata))
377 return 1;
379 UpdateProcessorStaticInformation(&smdata);
380 UpdateProcessorInformation(&smdata);
381 UpdateMemoryStaticInformation(&smdata);
382 UpdateMemoryInformation(&smdata);
383 UpdateVideoStaticInformation(&smdata);
384 UpdateVideoInformation(&smdata);
386 set(smdata.mainwindow, MUIA_Window_Open, TRUE);
387 set(smdata.pages, MUIA_Group_ActivePage, 0);
388 SignalMeAfter(250);
390 while (DoMethod(smdata.application, MUIM_Application_NewInput, &signals) != MUIV_Application_ReturnID_Quit)
392 if (signals)
394 signals = Wait(signals | SIGBREAKF_CTRL_C | GetSIG_TIMER());
395 if (signals & SIGBREAKF_CTRL_C)
396 break;
398 if (signals & GetSIG_TIMER())
400 IPTR currentPage = 0;
402 get(smdata.pages, MUIA_Group_ActivePage, &currentPage);
403 switch (currentPage)
405 case 1:
406 UpdateProcessorInformation(&smdata);
407 break;
408 case 2:
409 if ((itercounter % 8) == 0)
411 UpdateMemoryInformation(&smdata);
412 UpdateVideoInformation(&smdata);
414 break;
415 default:
416 break;
419 itercounter++;
421 SignalMeAfter(250);
426 set(smdata.mainwindow, MUIA_Window_Open, FALSE);
428 DisposeApplication(&smdata);
430 DeInitModules(modules, &smdata, lastinitedmodule);
432 return 0;