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

Last change on this file since 2798 was 2798, checked in by ldelgass, 13 years ago

Add emacs mode magic line in preparation for indentation cleanup

  • Property svn:eol-style set to native
File size: 4.9 KB
Line 
1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2/*
3 * ----------------------------------------------------------------------
4 *  EventPlayer.cpp: client that plays back events from file
5 *
6 * ======================================================================
7 *  AUTHOR:  Wei Qiao <qiaow@purdue.edu>
8 *           Purdue Rendering and Perceptualization Lab (PURPL)
9 *
10 *  Copyright (c) 2004-2006  Purdue Research Foundation
11 *
12 *  See the file "license.terms" for information on usage and
13 *  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
14 * ======================================================================
15 */
16
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    TRACE("Average frame time = %.6f\n", ave);
79    TRACE("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  //TRACE("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  TRACE("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  //TRACE("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  TRACE("% 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    TRACE("%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      ERROR("Could not connect to a server.\n");
191      return 1;
192  }
193
194  return 0;
195}
196
197void
198help(const char *argv0)
199{
200    TRACE("Syntax: %s addr port eventfile\n", argv0);
201    exit(1);
202}
203
204/* Program entry point */
205int
206main(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.