wip commit.
[AROS.git] / workbench / system / SysMon / processor_graph.c
blobf8ced7ec0bce904afe222518a911e94e435d8fc3
1 /*
2 Copyright © 2017, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #define DEBUG 0
7 #include <aros/debug.h>
9 #include <proto/utility.h>
10 #include <proto/intuition.h>
11 #include <proto/muimaster.h>
12 #include <proto/processor.h>
14 #include <clib/alib_protos.h>
16 #include <resources/processor.h>
17 #include <zune/graph.h>
19 #include "sysmon_intern.h"
21 #include "processor.h"
23 struct ProcessorGraph_DATA
25 IPTR pg_Flags;
26 IPTR pg_CPUCount;
27 Object **pg_Graphs;
28 struct Hook *pg_GraphReadHooks;
31 struct cpuPen {
32 ULONG r;
33 ULONG g;
34 ULONG b;
37 #define PROCESSORPEN_COUNT 8
38 struct cpuPen processorPens[PROCESSORPEN_COUNT] =
40 { 0x9B9B9B9B, 0xDEDEDEDE, 0xC0C0C0C0 },
41 { 0x9E9E9E9E, 0x9B9B9B9B, 0xDEDEDEDE },
42 { 0xDEDEDEDE, 0x9B9B9B9B, 0xBABABABA },
43 { 0xDEDEDEDE, 0xB5B5B5B5, 0x9B9B9B9B },
44 { 0xDEDEDEDE, 0x9B9B9B9B, 0x9E9E9E9E },
45 { 0xA6A6A6A6, 0xDEDEDEDE, 0x9B9B9B9B },
46 { 0x9B9B9B9B, 0xB2B2B2B2, 0xDEDEDEDE },
47 { 0xE4E4E4E4, 0xEBEBEBEB, 0x2A2A2A2A }
50 #define PROCGF_SINGLE (1 << 1)
52 #define SETUP_PROCGRAPH_INST_DATA struct ProcessorGraph_DATA *data = INST_DATA(CLASS, self)
54 AROS_UFH3(IPTR, GraphReadProcessorValueFunc,
55 AROS_UFHA(struct Hook *, procHook, A0),
56 AROS_UFHA(IPTR *, storage, A2),
57 AROS_UFHA(IPTR, cpuNo, A1))
59 AROS_USERFUNC_INIT
61 struct TagItem tags [] =
63 { GCIT_SelectedProcessor, cpuNo },
64 { GCIT_ProcessorLoad, (IPTR)storage },
65 { TAG_DONE, TAG_DONE }
68 D(bug("[SysMon:ProcGraph] %s(%d)\n", __func__, cpuNo);)
70 *storage = 0;
72 GetCPUInfo(tags);
74 *storage = ((*storage >> 16) * 1000) >> 16;
76 D(bug("[SysMon:ProcGraph] %s: 0x%p = %d\n", __func__, storage, *storage);)
78 return TRUE;
80 AROS_USERFUNC_EXIT
83 ULONG cpusperrow(ULONG x)
85 register unsigned long op = x, res = 0, one;
87 one = 1 << 30;
88 while (one > op)
89 one >>= 2;
91 while (one != 0)
93 if (op >= res + one)
95 op -= res + one;
96 res += one << 1;
98 res >>= 1;
99 one >>= 2;
101 return res;
104 Object *ProcessorGraph__GraphObject()
106 return GraphObject,
107 MUIA_Graph_InfoText, (IPTR) CPU_DEFSTR,
108 MUIA_Graph_ValueCeiling, 1000,
109 MUIA_Graph_ValueStep, 100,
110 MUIA_Graph_PeriodCeiling, 100000,
111 MUIA_Graph_PeriodStep, 10000,
112 MUIA_Graph_PeriodInterval, 1000,
113 End;
116 Object *ProcessorGraph__OM_NEW(Class *CLASS, Object *self, struct opSet *message)
118 BOOL singlemode = (BOOL)GetTagData(MUIA_ProcessorGrp_SingleMode, TRUE, message->ops_AttrList);
119 ULONG processorcount = (ULONG)GetTagData(MUIA_ProcessorGrp_CPUCount, 1, message->ops_AttrList);
120 Object *procGuage = NULL;
121 ULONG cpupr = 1;
123 D(bug("[SysMon:ProcGraph] %s()\n", __func__));
125 if ((singlemode) || (processorcount == 1))
127 self = (Object *) DoSuperNewTags(CLASS, self, NULL,
128 Child, (IPTR)(procGuage = ProcessorGraph__GraphObject()),
129 TAG_MORE, (IPTR) message->ops_AttrList
132 else
134 if (processorcount <= 4)
135 cpupr = processorcount;
136 else if ((cpupr = cpusperrow(processorcount)) < 4)
138 if (processorcount <= 4)
139 cpupr = processorcount;
140 else
141 cpupr = 4;
144 self = (Object *) DoSuperNewTags(CLASS, self, NULL,
145 MUIA_Group_Columns, cpupr,
146 TAG_MORE, (IPTR) message->ops_AttrList
150 if (self != NULL)
152 APTR procDataSource;
153 IPTR i;
155 SETUP_PROCGRAPH_INST_DATA;
157 data->pg_Flags = 0;
158 data->pg_CPUCount = processorcount;
159 data->pg_GraphReadHooks = AllocVec(sizeof(struct Hook) * processorcount, MEMF_ANY | MEMF_CLEAR);
161 if ((!singlemode) && (processorcount > 1))
162 data->pg_Graphs = AllocVec(sizeof(Object *) * processorcount, MEMF_ANY | MEMF_CLEAR);
163 else
165 data->pg_Graphs = (Object **)procGuage;
166 data->pg_Flags |= PROCGF_SINGLE;
169 for (i = 0; i < processorcount; i++)
171 if (!(data->pg_Flags & PROCGF_SINGLE))
173 data->pg_Graphs[i] = GraphObject,
174 MUIA_Graph_InfoText, (IPTR) CPU_DEFSTR,
175 MUIA_Graph_ValueCeiling, 1000,
176 MUIA_Graph_ValueStep, 100,
177 MUIA_Graph_PeriodCeiling, 100000,
178 MUIA_Graph_PeriodStep, 10000,
179 MUIA_Graph_PeriodInterval, 1000,
180 MUIA_UserData, i,
181 End;
183 procGuage = data->pg_Graphs[i];
184 procDataSource = (APTR)DoMethod(procGuage, MUIM_Graph_GetSourceHandle, 0);
186 DoMethod(self, OM_ADDMEMBER, procGuage);
188 else
190 procDataSource = (APTR)DoMethod(procGuage, MUIM_Graph_GetSourceHandle, i);
191 DoMethod(procGuage, MUIM_Graph_SetSourceAttrib, procDataSource, MUIV_Graph_Source_PenSrc, &processorPens[i % PROCESSORPEN_COUNT]);
194 data->pg_GraphReadHooks[i].h_Entry = (APTR)GraphReadProcessorValueFunc;
195 data->pg_GraphReadHooks[i].h_Data = (APTR)i;
197 DoMethod(procGuage, MUIM_Graph_SetSourceAttrib, procDataSource, MUIV_Graph_Source_ReadHook, &data->pg_GraphReadHooks[i]);
199 for (i %= cpupr; (i > 0) && (i < cpupr); i ++)
201 DoMethod(self, OM_ADDMEMBER, (IPTR)HVSpace);
205 return self;
208 IPTR ProcessorGraph__OM_DISPOSE(Class *CLASS, Object *self, Msg message)
210 SETUP_PROCGRAPH_INST_DATA;
211 BOOL singlemode = (BOOL)(data->pg_Flags & PROCGF_SINGLE);
212 IPTR retVal;
214 D(bug("[SysMon:ProcGraph] %s()\n", __func__));
216 retVal = DoSuperMethodA(CLASS, self, message);
218 FreeVec(data->pg_GraphReadHooks);
219 if (!singlemode)
220 FreeVec(data->pg_Graphs);
222 return retVal;
225 IPTR ProcessorGraph__OM_SET(Class *CLASS, Object *self, struct opSet *message)
227 // SETUP_PROCGRAPH_INST_DATA;
228 struct TagItem *tstate = message->ops_AttrList, *tag;
230 D(bug("[SysMon:ProcGraph] %s()\n", __func__));
232 while ((tag = NextTagItem((struct TagItem **)&tstate)) != NULL)
234 switch (tag->ti_Tag)
238 return DoSuperMethodA(CLASS, self, (Msg) message);
241 IPTR ProcessorGraph__OM_GET(Class *CLASS, Object *self, struct opGet *message)
243 SETUP_PROCGRAPH_INST_DATA;
244 IPTR *store = message->opg_Storage;
245 IPTR retval = 0;
247 D(bug("[SysMon:ProcGraph] %s()\n", __func__));
249 switch (message->opg_AttrID)
251 case MUIA_ProcessorGrp_CPUCount:
252 *store = (IPTR)data->pg_CPUCount;
253 break;
255 case MUIA_ProcessorGrp_SingleMode:
256 *store = (IPTR)(data->pg_Flags & PROCGF_SINGLE);
257 break;
260 if (!retval)
261 retval = DoSuperMethodA(CLASS, self, (Msg) message);
263 return retval;
266 IPTR ProcessorGraph__MUIM_ProcessorGrp_Update(Class *CLASS, Object *self, Msg message)
268 SETUP_PROCGRAPH_INST_DATA;
269 TEXT buffer[128];
270 ULONG totaluse = 0;
271 ULONG i;
273 D(bug("[SysMon:ProcGraph] %s()\n", __func__));
275 for (i = 0; i < data->pg_CPUCount; i++)
277 ULONG usage = 0;
278 struct TagItem tags [] =
280 { GCIT_SelectedProcessor, (IPTR)i },
281 { GCIT_ProcessorLoad, (IPTR)&usage },
282 { TAG_DONE, TAG_DONE }
285 GetCPUInfo(tags);
286 usage = ((usage >> 16) * 1000) >> 16;
288 if (!(data->pg_Flags & PROCGF_SINGLE))
290 __sprintf(buffer, "CPU %d\n%d.%d %%", i, usage / 10, usage % 10);
291 SET(data->pg_Graphs[i], MUIA_Graph_InfoText, (IPTR)buffer);
293 else
294 totaluse += usage;
297 if (data->pg_Flags & PROCGF_SINGLE)
299 totaluse /= data->pg_CPUCount;
300 __sprintf(buffer, "%d CPU's\n%d.%d %%", data->pg_CPUCount, totaluse / 10, totaluse % 10);
301 SET((Object *)data->pg_Graphs, MUIA_Graph_InfoText, (IPTR)buffer);
303 return 0;
306 /*** Setup ******************************************************************/
307 PROCESSORGRP_CUSTOMCLASS
309 ProcessorGraph, NULL, MUIC_Group, NULL,
310 OM_NEW, struct opSet *,
311 OM_DISPOSE, Msg,
312 OM_SET, struct opSet *,
313 OM_GET, struct opGet *,
314 MUIM_ProcessorGrp_Update, Msg