working version. needs small amount of placing tweaking to put
[charm.git] / examples / charm++ / lvServer / lvServer.C
1 /*-------------------------------------------------------------
2  *  file   : lvServer.C
3  *  author : Isaac Dooley
4  *  date   : 08-18-05
5  *  
6  *  A sample LiveViz polling server application. Uses the new
7  *  poll mode interface.
8  *  
9  *  Use the corresponding lvClient java application. The server
10  *  in poll mode will not expect a ccs "lvConfig" request, so 
11  *  it will not work with other standard liveViz clients which 
12  *  are not in poll mode. This may change at some point in the 
13  *  future.
14  *  
15  *-------------------------------------------------------------*/
16
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include "liveViz.h"
20 #include "lvServer.decl.h"
21 #include "math.h"
22
23 int nChares=4;
24 int gridWidth=400;  // image dimensions
25 int gridHeight=400; // image dimensions
26
27 /*readonly*/ CProxy_Main mainProxy;
28 /*readonly*/ CProxy_lvServer arr;
29
30 /*mainchare*/
31 class Main : public CBase_Main
32 {
33 public:
34
35   Main(CkArgMsg* m)
36   {
37         delete m;
38         
39         CkPrintf("lvServer with %d slices on %d Processors\n", nChares, CkNumPes());
40         mainProxy=thishandle;
41         
42         // Register with python
43         mainProxy.registerPython("pycode");
44         
45         // Register with liveViz
46         liveVizPollInit();
47
48     // Create Array
49         CkArrayOptions opts(nChares);
50         arr = CProxy_lvServer::ckNew(opts);
51         CkPrintf("array has been created\n");
52
53         // At this point all chares are just idle until a liveViz message comes
54   } 
55
56
57   // can be called by client generated python
58   void pycall(int handle){
59         arr.genNextImage();
60         pythonReturn(handle);
61   }
62   
63 };
64
65
66 /*array [1D]*/
67 class lvServer : public CBase_lvServer 
68 {
69 public:
70   lvServer(CkMigrateMessage *m) {}
71   lvServer() {}
72
73
74   void genNextImage() {
75         int myHeight = gridHeight / nChares;  // dimensions of my portion of the image
76     int myWidth = gridWidth;
77
78         int sx=0, sy=thisIndex*(myHeight);    // start coordinate(upper left corner) for my portion of the image
79
80     unsigned char *intensity= new unsigned char[3*myWidth*myHeight]; // the byte array that is my portion of the image
81
82         // Fill in the image byte array
83     for (int y=0;y<myHeight;y++)
84       for (int x=0;x<myWidth;x++) {
85         int i=y*myWidth+x;
86                 if(thisIndex==0){
87                   intensity[3*i+0] = (byte) 128;//Red
88                   intensity[3*i+1] = (byte) 128;//Green
89                   intensity[3*i+2] = (byte) 128;//Blue
90                 }
91                 else if(thisIndex==1){
92                   intensity[3*i+0] = (byte) 0;//Red
93                   intensity[3*i+1] = (byte) 0;//Green
94                   intensity[3*i+2] = (byte) 0;//Blue
95                 }
96                 else{
97                   intensity[3*i+0] = (byte) 128;//Red
98                   intensity[3*i+1] = (byte) (128*thisIndex/nChares);//Green
99                   intensity[3*i+2] = (byte) (128*thisIndex/nChares);//Blue
100                 }
101
102     }
103
104         // Deposit with liveViz
105         liveVizPollDeposit((ArrayElement *)this, 
106                                            sx,sy, 
107                                            myWidth,myHeight, 
108                                            gridWidth, gridHeight, 
109                                            (byte*) intensity,
110                                            sum_image_data, 3);
111
112         // cleanup
113     delete[] intensity;
114   }
115   
116 };
117   
118 #include "lvServer.def.h"