source: trunk/vizservers/nanovis/EventPlayer.cpp @ 829

Last change on this file since 829 was 421, checked in by qiaow, 18 years ago

Added EventPlayer? back. It will connect with nanovis and display the render result.

File size: 4.9 KB
Line 
1/*
2 * ----------------------------------------------------------------------
3 *  EventPlayer.cpp: client that plays back events from file
4 *
5 * ======================================================================
6 *  AUTHOR:  Wei Qiao <qiaow@purdue.edu>
7 *           Purdue Rendering and Perceptualization Lab (PURPL)
8 *
9 *  Copyright (c) 2004-2006  Purdue Research Foundation
10 *
11 *  See the file "license.terms" for information on usage and
12 *  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
13 * ======================================================================
14 */
15
16//#include <GL/freeglut.h>
17#include <stdlib.h>
18#include <unistd.h>
19#include <sstream>
20#include <string.h>
21#include <time.h>
22#include <sys/time.h>
23#include <iostream>
24#include <assert.h>
25
26#include "clientlib.h"
27#include "../Event.h"
28
29using namespace std;
30
31Event* event[300];
32int cur_event = 0;
33double interval_sum = 0;
34
35int width = 512;
36int height = 512;
37char screen_buffer[512*512*3];
38int screen_size = width * height;
39
40int socket_fd;  //socekt file descriptor
41
42/*
43void display()
44{
45   //paste to screen
46   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
47   glDrawPixels(width, height, GL_RGB, GL_UNSIGNED_BYTE, screen_buffer);       
48   glFlush();
49   glutSwapBuffers();
50   return;
51}
52*/
53
54
55void key(unsigned char key, int x, int y)
56{
57    switch (key)
58    {
59        case 'q':
60          exit(0);
61          break;
62        default:
63          return;
64    }
65}
66
67
68/*
69 *Client communicates with the server
70 */
71void idle(void)
72{
73  //send requests
74
75  if (cur_event >= sizeof(event)/sizeof(event[0])) {
76    float ave = interval_sum / (cur_event-1);
77    float fps = 1/ave;
78    printf("Average frame time = %.6f\n", ave);
79    printf("Frames per second  = %f\n", fps);
80    exit(0);
81  }
82
83  Event* cur = event[cur_event];
84  std::stringstream msgstream;
85  std::string msg;
86
87  switch(cur->type){
88    case 0: //rotate
89      msgstream << "camera " << cur->parameter[0] << " "
90                    << cur->parameter[1] << " "
91                    << cur->parameter[2] << " " << endl;
92      break;
93
94    case 1: //move
95      msgstream << "move " << cur->parameter[0] << " "
96                    << cur->parameter[1] << " "
97                    << cur->parameter[2] << " " << endl;
98      break;
99
100    case 2: //other
101      msgstream << "refresh " << cur->parameter[0] << " "
102                    << cur->parameter[1] << " "
103                    << cur->parameter[2] << " " << endl;
104      break;
105
106    default:
107      return;
108  }
109
110  msg = msgstream.str();
111
112  //sleep a little
113  struct timespec ts;
114  ts.tv_sec = 0;
115  ts.tv_nsec = cur->msec*1000000000;
116  nanosleep(&ts, 0);
117 
118  //start timer
119  struct timeval clock;
120  gettimeofday(&clock, NULL);
121  double start_time = clock.tv_sec + clock.tv_usec/1000000.0;
122
123  //send msg
124  //printf("Writing message %04d to server: '%s'\n", cur_event, msg.c_str());
125  int status = write(socket_fd, msg.c_str(), strlen(msg.c_str()));
126  if (status <= 0) {
127     perror("socket write");
128     return;
129  }
130
131#if DO_RLE
132  int sizes[2];
133  status = read(socket_fd, &sizes, sizeof(sizes));
134  printf("Reading %d,%d bytes\n", sizes[0], sizes[1]);
135  int len = sizes[0] + sizes[1];
136#else
137  int len = width * height * 3;
138#endif
139
140  //receive screen update
141  int remain = len;
142  char* ptr = screen_buffer;
143  while(remain>0){
144    status = read(socket_fd, ptr, remain);
145    if(status <= 0) {
146      perror("socket read");
147      return;
148    }
149    else {
150       remain -= status;
151       ptr += status;
152    }
153  }
154
155  //printf("Read message to server.\n");
156
157  //end timer
158  gettimeofday(&clock, NULL);
159  double end_time = clock.tv_sec + clock.tv_usec/1000000.0;
160
161  double time_interval = end_time - start_time;
162
163  if (cur_event != 0) {
164    interval_sum += time_interval;
165  }
166  cur_event++;
167
168  fprintf(stderr, "% 6d %.6f\n", len, time_interval);
169}
170
171
172int init_client(char* host, char* port, char* file){
173
174  //load the event file
175  FILE* fd = fopen(file, "r");
176
177  //load events
178  for(int i=0; i<sizeof(event)/sizeof(event[0]); i++){
179    int type;
180    float param[3];
181    double interval;
182    fscanf(fd, "%d %f %f %f %g\n", &type, param, param+1, param+2, &interval);
183    event[i] = new Event(type, param, interval);
184    //fprintf(stderr, "%d %f %f %f\n", type, param[0], param[1], param[2]);
185  }
186  fclose(fd);
187
188  socket_fd = connect_renderer(host, atoi(port), 100);
189  if (socket_fd == -1) {
190     fprintf(stderr, "Could not connect to a server.\n");
191     return 1;
192  }
193
194  return 0;
195}
196
197void help(const char *argv0)
198{
199  fprintf(stderr,
200          "Syntax: %s addr port eventfile\n",
201          argv0);
202  exit(1);
203}
204
205/* Program entry point */
206int main(int argc, char *argv[])
207{
208    //parameters: host and port and event file
209    if(argc!=4) help(argv[0]);
210
211    assert(init_client(argv[1], argv[2], argv[3])==0);
212
213/*
214    glutInit(&argc, argv);
215    glutInitWindowSize(width,height);
216    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
217
218    glutCreateWindow("Client");
219
220    glutDisplayFunc(display);
221    glutKeyboardFunc(key);
222    glutIdleFunc(idle);
223
224    glClearColor(0.,0.,0.,0.);
225    glutMainLoop();
226*/
227    while(1) idle();
228
229    return 0;
230}
231
Note: See TracBrowser for help on using the repository browser.