source: trunk/packages/vizservers/nanovis/EventPlayer.cpp @ 1429

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