00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef INVT_HAVE_LIBSDL_IMAGE
00039
00040 #include <cstdio>
00041 int main()
00042 {
00043 fprintf(stderr, "The SDL_image library must be installed to use this program\n");
00044 return 1;
00045 }
00046
00047 #else
00048
00049
00050
00051
00052
00053
00054
00055
00056 #include "Component/ModelManager.H"
00057 #include "Image/Image.H"
00058 #include "Psycho/PsychoDisplay.H"
00059 #include "Psycho/EyeTrackerConfigurator.H"
00060 #include "Psycho/EyeTracker.H"
00061 #include "Psycho/PsychoOpts.H"
00062 #include "Component/EventLog.H"
00063 #include "Component/ComponentOpts.H"
00064 #include "Raster/Raster.H"
00065 #include "Util/MathFunctions.H"
00066 #include "Util/Types.H"
00067 #include <iostream>
00068 #include <fstream>
00069 #include <SDL/SDL.h>
00070 #include <SDL/SDL_image.h>
00071 #include "AppPsycho/psycho-skin-resize.h"
00072 #include <stdio.h>
00073 #include <stdlib.h>
00074 #include <map>
00075 #include <time.h>
00076 #include "AppPsycho/psycho-skin-mapgenerator.h"
00077 #include <sstream>
00078 #include "GameBoard/basic-graphics.H"
00079
00080
00081 using namespace std;
00082
00083
00084 ModelManager manager("Psycho Constellation");
00085 nub::soft_ref<PsychoDisplay> d(new PsychoDisplay(manager));
00086 bool programQuit = false ;
00087 map<string,Uint32> colorMap ;
00088 map<string,string> starColorMap ;
00089 map<string,int> starRadiusMap ;
00090 map<string,string> starTypeMap ;
00091 map<string,int> starDensityMap ;
00092 map<string,int> starFlickingMap ;
00093 int vx , vy ;
00094 int sw=800 ;
00095 int sh=600 ;
00096
00097
00098
00099
00100 void startExperiment(){
00101 cout<<" experiment started "<< starColorMap.size()<<endl;
00102 SDL_Surface* blankSurface = getABlankSurface(sw,sh) ;
00103 int screenSize = sw * sh ;
00104
00105 for( map<string,string>:: iterator it = starColorMap.begin() ; it != starColorMap.end() ; ++it ){
00106 string starName = it->first ;
00107 int starCount = screenSize*starDensityMap[starName]/300000 ;
00108 for(int i = 0 ; i < starCount ; i++){
00109 int x = rand()% (sw-150);
00110 int y = rand()% (sh-150);
00111
00112
00113 fillQuadricRadiant(blankSurface,colorMap[starColorMap[starName]],x+50,y+50,starRadiusMap[starName]) ;
00114 }
00115
00116
00117 }
00118
00119 SDL_Rect offset;
00120 d->clearScreen() ;
00121
00122 for (int i = 0 ; i < 100 ; i++){
00123 offset.x = i + (d->getWidth() - blankSurface->w) /2;
00124 offset.y = i+ (d-> getHeight() - blankSurface->h) /2;
00125 d->displaySDLSurfacePatch(blankSurface , &offset,NULL , -2,false, true);
00126 d->waitFrames(1);
00127 }
00128
00129
00130
00131 d->waitForKey() ;
00132 }
00133
00134
00135 int emergencyExit(){
00136 time_t rawtime;
00137 time ( &rawtime );
00138 LINFO("...emergencyExit called @%s .", ctime( &rawtime ));
00139 d->pushEvent(std::string("experiment ended at ")+ ctime( &rawtime ) );
00140 manager.stop();
00141 return -1;
00142 }
00143
00144
00145
00146
00147 template <class T>
00148 string stringify(T &i)
00149 {
00150 ostringstream o ;
00151 o << i ;
00152 return o.str();
00153 }
00154
00155
00156
00157 int readTop(ifstream& inFile){
00158 char ch[1000] ;
00159 while( inFile.getline(ch , 1000) ){
00160 string line = ch ;
00161 LINFO("reads : %s" , line.c_str()) ;
00162 if( line.compare("end_top") == 0 ) break;
00163
00164 if( line.substr(0,6).compare("color:")==0 ){
00165 char rf[3] ;
00166 string::size_type colPos = line.find(":") ;
00167 string::size_type eqPos = line.find("=") ;
00168 string colorName = line.substr(colPos+1,eqPos-colPos-1) ;
00169 string colorString = line.substr(eqPos+1);
00170 string::size_type _Pos = colorString.find("_") ;
00171 strcpy(rf,colorString.substr(0,_Pos).c_str()) ;
00172 int rL = atoi(rf) ;
00173 colorString = colorString.substr(_Pos+1) ;
00174 _Pos = colorString.find("_") ;
00175 strcpy(rf,colorString.substr(0,_Pos).c_str()) ;
00176 int gL = atoi(rf) ;
00177 colorString = colorString.substr(_Pos+1) ;
00178 strcpy(rf,colorString.c_str()) ;
00179 int bL = atoi(rf) ;
00180 Uint32 color = d->getUint32color(PixRGB<byte>(rL, gL, bL));
00181 colorMap[colorName] = color ;
00182 }
00183 if( line.substr(0,2).compare("vx")==0 ){
00184 string::size_type position = line.find("=");
00185 char rf[10] ;
00186 strcpy(rf,line.substr(position+1).c_str());
00187 vx = atoi(rf);
00188 d->pushEvent(line.c_str());
00189 }
00190 if( line.substr(0,2).compare("vy")==0 ){
00191 string::size_type position = line.find("=");
00192 char rf[10] ;
00193 strcpy(rf,line.substr(position+1).c_str());
00194 vy = atoi(rf);
00195 d->pushEvent(line.c_str());
00196 }
00197
00198 }
00199 return 0 ;
00200 }
00201
00202
00203
00204 int readStarBlock(ifstream& inFile){
00205 char ch[1000] ;
00206 string starName = "" ;
00207 while( inFile.getline(ch , 1000) ){
00208 string line = ch ;
00209 LINFO("reads : %s" , line.c_str()) ;
00210 if(line.compare("end_star")==0) {
00211 d -> pushEvent("ended reading star block ");
00212 break ;
00213 }
00214
00215 if(line.substr(0,8).compare("starname")== 0 ) {
00216 string::size_type eqPos = line.find("=");
00217 starName =line.substr(eqPos+1) ;
00218 }
00219 if(line.substr(0,6).compare("color=")==0){
00220 string::size_type eqPos = line.find("=");
00221 string colorStr = line.substr(eqPos+1) ;
00222 starColorMap[starName] = colorStr ;
00223 cout<<"local star Name :" <<starName<<" and color:"<< colorStr<<endl ;
00224 }
00225 if(line.substr(0,4).compare("type")==0){
00226 string::size_type eqPos = line.find("=");
00227 string starType = line.substr(eqPos+1) ;
00228 starTypeMap[starName] = starType ;
00229 }
00230
00231 if( line.substr(0,6).compare("radius")==0 ){
00232 string::size_type position = line.find("=");
00233 char rf[10] ;
00234 strcpy(rf,line.substr(position+1).c_str());
00235 int s = atoi(rf);
00236 starRadiusMap[starName] = s ;
00237 }
00238 if( line.substr(0,7).compare("density")==0 ){
00239 string::size_type position = line.find("=");
00240 char rf[10] ;
00241 strcpy(rf,line.substr(position+1).c_str());
00242 int s = atoi(rf);
00243 starDensityMap[starName] = s ;
00244 }
00245 if( line.substr(0,8).compare("flicking")==0 ){
00246 string::size_type position = line.find("=");
00247 char rf[10] ;
00248 strcpy(rf,line.substr(position+1).c_str());
00249 int s = atoi(rf);
00250 starFlickingMap[starName] = s ;
00251 }
00252
00253
00254 }
00255 return 0 ;
00256 }
00257
00258
00259
00260
00261 int readBlock(ifstream& inFile){
00262 char ch[1000] ;
00263 while( inFile.getline(ch,1000) ){
00264 string line = ch ;
00265 LINFO("reads : %s" , line.c_str());
00266 if(line.compare("end_block")== 0) {
00267 d -> pushEvent("ended reading block") ;
00268 break ;
00269 }
00270 if( line.compare("start_star")==0 ){
00271 readStarBlock(inFile) ;
00272 }
00273 }
00274 return 0;
00275 }
00276
00277 int readprofile(const char* filename){
00278 ifstream inFile(filename, ios::in);
00279 if (! inFile)
00280 {
00281 LINFO("profile '%s' not found!" , filename);
00282 return -1;
00283 }
00284
00285 char ch[1000];
00286 while (inFile.getline(ch , 1000)){
00287 string line = ch;
00288 LINFO("reads : %s", line.c_str());
00289 if( line.substr(0,11).compare("profilename") == 0 ){
00290 string::size_type position = line.find("=");
00291 d -> pushEvent("profile "+line.substr(position+1)+" started reading" ) ;
00292 }
00293 if(line.compare("start_top")==0 ) readTop(inFile);
00294 if(line.compare("start_block")==0) readBlock(inFile);
00295 if(programQuit == true) break ;
00296 }
00297
00298 return 0 ;
00299 }
00300
00301
00302
00303 extern "C" int main( int argc, char* argv[] )
00304
00305 {
00306
00307 MYLOGVERB = LOG_INFO;
00308
00309 manager.addSubComponent(d);
00310 nub::soft_ref<EventLog> el(new EventLog(manager));
00311 manager.addSubComponent(el);
00312 d->setEventLog(el);
00313
00314 if (manager.parseCommandLine(argc, argv,"<profile.prf> <logfileName.psy>", 2, 2)==false)
00315 return(1);
00316 manager.setOptionValString(&OPT_EventLogFileName,manager.getExtraArg(1).c_str() );
00317 manager.start();
00318 d->clearScreen() ;
00319 if(readprofile(manager.getExtraArg(0).c_str())== 0 ) startExperiment();
00320 d->displayText("Experiment is done! Thanks for participating! ") ;
00321 d->waitForKey() ;
00322 manager.stop();
00323 return(0) ;
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352 }
00353
00354 #endif // INVT_HAVE_LIBSDL_IMAGE
00355