changed arguments to GetMetsRes
[dyninst.git] / visiClients / tclVisi / src / DGclient.C
1 /*
2  *  DGclient.C -- Code for the visi<->tcl interface.
3  *    
4  * $Log: DGclient.C,v $
5  * Revision 1.4  1994/09/25 02:07:47  newhall
6  * changed arguments to GetMetsRes
7  *
8  * Revision 1.3  1994/08/05  20:17:10  rbi
9  * Update for new version of libvisi.a
10  *
11  * Revision 1.2  1994/06/14  18:57:47  rbi
12  * Updated layout and added curve validation callback.
13  *
14  * Revision 1.1  1994/05/31  21:05:47  rbi
15  * Initial version of tclVisi and tabVis
16  *
17  */
18 #include <stdlib.h>
19 #include <tcl.h>
20 #include <tk.h>
21 #include "../../../visi/h/visualization.h"
22
23 extern "C" {
24   int Blt_GraphElement(Tcl_Interp *interp, char *pathName, char *elemName, 
25                        int numValues, double *valueArr);
26 }
27
28 extern Tcl_Interp *MainInterp;
29
30 int Dg_Add(int dummy) {
31   int retval;
32
33   retval = Tcl_Eval(MainInterp, "DgConfigCallback");
34   if (retval == TCL_ERROR) {
35     fprintf(stderr, "%s\n", MainInterp->result);
36   }
37   return(retval);
38 }
39
40 int Dg_Data(int dummy) {
41   int retval = TCL_OK, thislast = -1;
42   static LastBucket = 0;
43   char cmd[256];
44
45   /* 
46    *  Simulate valid callback
47    */
48   for (unsigned m = 0; m < dataGrid.NumMetrics(); m++) {
49     for (unsigned r = 0; r < dataGrid.NumResources(); r++) {
50       if(dataGrid[m][r].Valid){
51         if (! dataGrid[m][r].userdata) {
52           sprintf(cmd,"DgValidCallback %d %d", m, r);
53           retval = Tcl_Eval(MainInterp, cmd);
54           if (retval == TCL_ERROR) {
55             fprintf(stderr, "%s\n", MainInterp->result);
56           }
57           dataGrid[m][r].userdata = (void *) malloc(sizeof (int));
58           *((int *) dataGrid[m][r].userdata) = 1;
59         }
60         if (thislast < 0) {
61           thislast = dataGrid[m][r].LastBucketFilled();
62         }
63       }
64     }
65   }
66
67   /*
68    *  Send range to tcl
69    */
70   if (thislast < LastBucket) {
71     LastBucket = thislast-1;
72   }
73   if (thislast >= 0) {
74     sprintf(cmd,"DgDataCallback %d %d", LastBucket+1, thislast);
75     retval = Tcl_Eval(MainInterp, cmd);
76     if (retval == TCL_ERROR) {
77       fprintf(stderr, "%s\n", MainInterp->result);
78     }
79     LastBucket = thislast;
80   }
81
82   return(retval);
83 }
84
85 int Dg_Fold(int dummy) {
86   int retval;
87
88   retval = Tcl_Eval(MainInterp, "DgFoldCallback");
89   if (retval == TCL_ERROR) {
90     fprintf(stderr, "%s\n", MainInterp->result);
91   }
92   return(retval);
93 }
94
95 int Dg_Invalid(int dummy) {
96   int retval;
97
98   retval = Tcl_Eval(MainInterp, "DgInvalidCallback");
99   if (retval == TCL_ERROR) {
100     fprintf(stderr, "%s\n", MainInterp->result);
101   }
102   return(retval);
103 }
104
105 int Dg_Phase(int dummy) {
106   int retval;
107
108   retval = Tcl_Eval(MainInterp, "DgPhaseCallback");
109   if (retval == TCL_ERROR) {
110     fprintf(stderr, "%s\n", MainInterp->result);
111   }
112   return(retval);
113 }
114
115 int Dg_GraphElem(Tcl_Interp *interp, char *path, char *elem, int mid, int rid) 
116 {
117   static double *coords = NULL;
118   double *cptr, bwid;
119   float *vals, *vptr;
120   int numb, b;
121
122   /* Allocate an array for the coords */
123   if (coords == NULL) {
124     numb = dataGrid.NumBins();
125     coords = (double *) malloc(sizeof(double) * numb * 2);
126     if (!coords) {
127       sprintf(interp->result, "Dg_GraphElem: Could not allocate coords\n");
128       return TCL_ERROR;
129     }
130   }    
131
132   /* Binwidth and numbuckets give us the t coords */
133   numb = dataGrid[mid][rid].LastBucketFilled()+1;
134   bwid = dataGrid.BinWidth();
135
136   /* Get the data values */
137   vals = dataGrid[mid][rid].Value();
138
139   /* Fill the array */
140   cptr = coords;  
141   vptr = vals;
142   for (b = 0; b < numb; b++) {
143     *cptr++ = b*bwid;
144     if (isnan(*vptr)) {
145       *cptr = 0.0;
146     } else {
147       *cptr = (double) *vptr;
148     }
149     cptr++;
150     vptr++;
151   }
152
153   /* Give it to BLT */
154   return(Blt_GraphElement(interp, path, elem, numb*2, coords));
155 }
156
157
158 #define   AGGREGATE        0
159 #define   BINWIDTH         1
160 #define   FOLDMETHOD       2
161 #define   METRICNAME       3
162 #define   METRICUNITS      4
163 #define   NUMBINS          5
164 #define   NUMMETRICS       6
165 #define   NUMRESOURCES     7
166 #define   DEFINEPHASE      8
167 #define   RESOURCENAME     9
168 #define   STARTSTREAM      10
169 #define   STOPSTREAM       11
170 #define   DGSUM            12
171 #define   DGVALID          13
172 #define   VALUE            14
173 #define   CMDERROR         15
174 #define   LASTBUCKET       16
175 #define   BLTGRAPHELEM     17
176 #define   FIRSTBUCKET      18
177
178 struct cmdTabEntry 
179 {
180   char *cmdname;
181   int index;
182   int numargs;
183 };
184
185 static struct cmdTabEntry Dg_Cmds[] = {
186   {"aggregate",    AGGREGATE,       2},
187   {"binwidth",     BINWIDTH,        0},
188   {"bltgraphelem", BLTGRAPHELEM,    4},
189   {"firstbucket",  FIRSTBUCKET,      2},
190   {"foldmethod",   FOLDMETHOD,      2},
191   {"lastbucket",   LASTBUCKET,      2},
192   {"metricname",   METRICNAME,      1},
193   {"metricunits",  METRICUNITS,     1},
194   {"numbins",      NUMBINS,         0},
195   {"nummetrics",   NUMMETRICS,      0},
196   {"numresources", NUMRESOURCES,    0},
197   {"phase",        DEFINEPHASE,     3},
198   {"resourcename", RESOURCENAME,    1},
199   {"start",        STARTSTREAM,     2},
200   {"stop",         STOPSTREAM,      2},
201   {"sum",          DGSUM,           2},
202   {"valid",        DGVALID,         2},
203   {"value",        VALUE,           3},
204   {NULL,           CMDERROR,        0}
205 };
206
207 static int findCommand(Tcl_Interp *interp, 
208                        int argc, 
209                        char *argv[])
210 {
211   struct cmdTabEntry *C;
212
213   if (argc == 0) {
214     sprintf(interp->result, "USAGE: Dg <option> [args...]\n");
215     return CMDERROR;
216   }
217   for (C = Dg_Cmds; C->cmdname; C++) {
218     if (strcmp(argv[0], C->cmdname) == 0) {
219       if ((argc-1) == C->numargs) 
220         return C->index;
221       sprintf(interp->result, 
222               "%s: wrong number of args (%d). Should be %d\n",
223               argv[0], argc-1, C->numargs);
224       return CMDERROR;
225     }
226   }
227
228   sprintf(interp->result, "unknown option (%s)\n", argv[0]);
229   return CMDERROR;
230 }
231
232 int Dg_TclCommand(ClientData clientData,
233                Tcl_Interp *interp, 
234                int argc, 
235                char *argv[])
236 {
237   int cmdDex, m, r, buck;
238
239   cmdDex = findCommand(interp, argc-1, argv+1);
240   if (cmdDex == CMDERROR) {
241     return TCL_ERROR;
242   }
243
244   switch(cmdDex) {
245   case AGGREGATE:   
246     m = atoi(argv[2]);
247     r = atoi(argv[3]);
248     sprintf(interp->result,"%g", dataGrid.AggregateValue(m,r));
249     return TCL_OK;
250
251   case BINWIDTH:     
252     sprintf(interp->result, "%g", dataGrid.BinWidth());
253     return TCL_OK;
254
255   case BLTGRAPHELEM:     
256     m = atoi(argv[2]);
257     r = atoi(argv[3]);
258     return (Dg_GraphElem(interp, argv[4], argv[5], m, r));
259
260   case FIRSTBUCKET:
261     m = atoi(argv[2]);
262     r = atoi(argv[3]);
263     sprintf(interp->result,"%d", dataGrid[m][r].FirstValidBucket()); 
264     return TCL_OK;
265
266   case FOLDMETHOD:
267     m = atoi(argv[2]);
268     sprintf(interp->result,"%d", dataGrid.FoldMethod(m));
269     return TCL_OK;
270
271   case LASTBUCKET:
272     m = atoi(argv[2]);
273     r = atoi(argv[3]);
274     sprintf(interp->result,"%d", dataGrid[m][r].LastBucketFilled());
275     return TCL_OK;
276
277   case METRICNAME:  
278     m = atoi(argv[2]);
279     sprintf(interp->result, "%s", dataGrid.MetricName(m));
280     return TCL_OK;
281
282   case METRICUNITS:  
283     m = atoi(argv[2]);
284     sprintf(interp->result, "%s", dataGrid.MetricUnits(m));
285     return TCL_OK;
286
287   case NUMBINS:     
288     sprintf(interp->result, "%d", dataGrid.NumBins());
289     return TCL_OK;
290
291   case NUMMETRICS:  
292     sprintf(interp->result, "%d", dataGrid.NumMetrics());
293     return TCL_OK;
294
295   case NUMRESOURCES:
296     sprintf(interp->result, "%d", dataGrid.NumResources());
297     return TCL_OK;
298
299   case DEFINEPHASE:       
300     NamePhase(atof(argv[2]), atof(argv[3]), argv[4]);
301     return TCL_OK;
302
303   case RESOURCENAME:
304     r = atoi(argv[2]);
305     sprintf(interp->result, "%s", dataGrid.ResourceName(r));
306     return TCL_OK;
307
308   case STARTSTREAM:       
309     // GetMetsRes(argv[2], argv[3], 0); 
310     GetMetsRes((char *)NULL,0, 0); 
311     return TCL_OK;
312
313   case STOPSTREAM:
314     m = atoi(argv[2]);
315     r = atoi(argv[3]);
316     StopMetRes(m, r);
317     return TCL_OK;
318
319   case DGSUM:         
320     m = atoi(argv[2]);
321     r = atoi(argv[3]);
322     sprintf(interp->result,"%g", dataGrid.SumValue(m,r));
323     return TCL_OK;
324
325   case DGVALID:
326     m = atoi(argv[2]);
327     r = atoi(argv[3]);
328     sprintf(interp->result, "%d", dataGrid.Valid(m,r));
329     return TCL_OK;
330
331   case VALUE:       
332     m = atoi(argv[2]);
333     r = atoi(argv[3]);
334     buck = atoi(argv[4]);
335     sprintf(interp->result,"%g", dataGrid[m][r].Value(buck));
336     return TCL_OK;
337   }
338
339   sprintf(interp->result, "Internal error (func findCommand)\n");
340   return TCL_ERROR;
341 }
342
343 static void
344 my_visi_callback(void* arg0, int* arg1, long unsigned int* arg2)
345 {
346     int ret;
347
348     ret = visi_callback();
349     if (ret == -1) exit(0);
350 }
351
352 int 
353 Dg_Init(Tcl_Interp *interp)
354 {
355   int fd;
356
357   /* Initialize visualization module */
358   if((fd = VisiInit()) < 0){
359     exit(-1);
360   }
361   (void) RegistrationCallback(ADDMETRICSRESOURCES,Dg_Add); 
362   (void) RegistrationCallback(DATAVALUES,Dg_Data); 
363   (void) RegistrationCallback(FOLD,Dg_Fold); 
364   (void) RegistrationCallback(INVALIDMETRICSRESOURCES,Dg_Invalid);
365   (void) RegistrationCallback(PHASENAME,Dg_Phase);
366   {
367     /* char *vargv[3];*/
368     /* vargv[0] = "foo";*/
369     /* vargv[1] = "cpu";*/
370     /* vargv[2] = "Procedure Process Machine SyncObject";*/
371
372     /* (void) StartVisi(3,vargv);*/
373     (void) StartVisi(0,NULL); 
374   }
375
376   Tcl_CreateCommand(interp, "Dg", Dg_TclCommand, 
377                     (ClientData *) NULL,(Tcl_CmdDeleteProc *) NULL);
378  
379   Tk_CreateFileHandler(fd, TK_READABLE, (Tk_FileProc *) my_visi_callback, 0);
380
381   return TCL_OK;
382 }
383
384