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 #include "Component/ModelManager.H"
00039 #include "Component/EventLog.H"
00040 #include "Image/Image.H"
00041 #include "Image/CutPaste.H"
00042 #include "Image/DrawOps.H"
00043 #include "Image/ImageSet.H"
00044 #include "Image/ShapeOps.H"
00045 #include "Psycho/PsychoDisplay.H"
00046 #include "Psycho/EyeTrackerConfigurator.H"
00047 #include "Psycho/EyeTracker.H"
00048 #include "Psycho/PsychoOpts.H"
00049 #include "Component/ComponentOpts.H"
00050 #include "GUI/GUIOpts.H"
00051 #include "Raster/Raster.H"
00052 #include "Util/Types.H"
00053 #include "Util/StringUtil.H"
00054 #include "Util/MathFunctions.H"
00055 #include <fstream>
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 static int submain(const int argc, char** argv)
00070 {
00071 MYLOGVERB = LOG_INFO;
00072
00073
00074 ModelManager manager("Psychophysics Recall");
00075
00076
00077 nub::soft_ref<EventLog> el(new EventLog(manager));
00078 manager.addSubComponent(el);
00079
00080 nub::soft_ref<EyeTrackerConfigurator>
00081 etc(new EyeTrackerConfigurator(manager));
00082 manager.addSubComponent(etc);
00083
00084 nub::soft_ref<PsychoDisplay> d(new PsychoDisplay(manager));
00085 manager.addSubComponent(d);
00086
00087
00088 manager.exportOptions(MC_RECURSE);
00089 manager.setOptionValString(&OPT_SDLdisplayDims, "1920x1080");
00090 manager.setOptionValString(&OPT_EventLogFileName, "psychodata.psy");
00091 manager.setOptionValString(&OPT_EyeTrackerType, "ISCAN");
00092
00093
00094 if (manager.parseCommandLine(argc, argv, "<fileList>", 1, -1) == false)
00095 return(1);
00096
00097
00098 nub::soft_ref<EyeTracker> et = etc->getET();
00099 d->setEyeTracker(et);
00100 d->setEventLog(el);
00101 et->setEventLog(el);
00102 initRandomNumbers();
00103
00104
00105 manager.start();
00106
00107
00108 std::ifstream file(manager.getExtraArg(0).c_str());
00109 if (file == 0) LFATAL("Couldn't open file: '%s'",
00110 manager.getExtraArg(0).c_str());
00111
00112
00113 std::string line;
00114 std::vector<std::string> lines;
00115 while(getline(file, line)) lines.push_back(line);
00116
00117
00118 uint *idx = new uint[lines.size()];
00119 for (uint i = 0; i < lines.size(); i ++) idx[i] = i;
00120 randShuffle(idx, lines.size());
00121 LINFO("Randomized %"ZU" trials.", lines.size());
00122
00123
00124 d->clearScreen();
00125 d->displayISCANcalib();
00126 d->waitForKey();
00127
00128
00129 d->displayText("<SPACE> to calibrate; other key to skip");
00130 int c = d->waitForKey();
00131 if (c == ' ') d->displayEyeTrackerCalibration();
00132 d->clearScreen();
00133 d->displayText("<SPACE> To Begin Experiment");
00134 c = d->waitForKey();
00135
00136
00137 for (uint ii = 0; ii < lines.size(); ++ii)
00138 {
00139 std::vector<std::string> tokens;
00140 split(lines[idx[ii]], " \t", std::back_inserter(tokens));
00141 if (tokens.size() < 2)
00142 LFATAL("Need at least one image and one object per line: %s",
00143 lines[idx[ii]].c_str());
00144
00145
00146 uint *ii = new uint[tokens.size()-1];
00147 for (uint i = 0; i < tokens.size()-1; ++i) ii[i] = i+1;
00148 randShuffle(ii, tokens.size()-1);
00149
00150
00151
00152 d->clearScreen();
00153 LINFO("Loading '%s'...", tokens[0].c_str());
00154 Image< PixRGB<byte> > ima = Raster::ReadRGB(tokens[0]);
00155
00156 ImageSet< PixRGB<byte> > objects;
00157 for (uint i = 0; i < tokens.size()-1; ++i)
00158 {
00159 LINFO("Loading object %u/%"ZU": %s", i+1,
00160 tokens.size()-1, tokens[i].c_str());
00161 Image< PixRGB<byte> > obj = Raster::ReadRGB(tokens[ii[i]]);
00162 objects.push_back(obj);
00163 }
00164
00165
00166 Image< PixRGB<byte> > image(d->getDims(), NO_INIT);
00167 inplaceEmbed(image, ima, Rectangle(Point2D<int>(0, 0), image.getDims()),
00168 d->getGrey(), true);
00169 SDL_Surface *surf = d->makeBlittableSurface(image, true);
00170
00171 Image< PixRGB<byte> > mask(d->getWidth()/8, d->getHeight()/8, NO_INIT);
00172 for (int i = 0; i < mask.getSize(); i ++)
00173 mask.setVal(i, PixRGB<byte>(byte(randomUpToNotIncluding(256)),
00174 byte(randomUpToNotIncluding(256)),
00175 byte(randomUpToNotIncluding(256))));
00176 mask = zoomXY(mask, 8, 8);
00177 SDL_Surface *msurf = d->makeBlittableSurface(mask, true);
00178 LINFO("%s ready.", tokens[0].c_str());
00179
00180
00181 d->displayFixation();
00182 d->waitForKey();
00183 d->pushEvent(std::string("===== Showing image: ") +
00184 tokens[0] + " =====");
00185
00186
00187 et->track(true);
00188
00189
00190 d->displayFixationBlink();
00191
00192
00193 d->displaySurface(surf, -2);
00194
00195
00196 usleep(2000000);
00197
00198
00199 d->displaySurface(msurf, -2);
00200 usleep(150000);
00201
00202
00203 d->clearScreen();
00204
00205
00206 usleep(50000);
00207 et->track(false);
00208 SDL_FreeSurface(surf);
00209 SDL_FreeSurface(msurf);
00210
00211
00212 for (uint i = 0; i < tokens.size()-1; ++i)
00213 {
00214
00215 Image< PixRGB<byte> > obj(d->getDims(), NO_INIT);
00216 obj.clear(d->getGrey());
00217 inplacePaste(obj, objects[i],
00218 Point2D<int>((d->getWidth() - objects[i].getWidth())/2,
00219 (d->getHeight() - objects[i].getHeight())/2));
00220
00221 SDL_Surface *surf2 = d->makeBlittableSurface(obj, true);
00222 d->displaySurface(surf2, -2);
00223
00224 int c = d->waitForKey();
00225 d->pushEvent(sformat("===== Object %s / %u: '%c' (%d) =====",
00226 tokens[ii[i]].c_str(), i, c, c));
00227 SDL_FreeSurface(surf2);
00228 }
00229
00230
00231 d->clearScreen();
00232 delete [] ii;
00233 }
00234
00235 d->clearScreen();
00236 d->displayText("Experiment complete. Thank you!");
00237 d->waitForKey();
00238
00239
00240 manager.stop();
00241
00242 delete [] idx;
00243
00244
00245 return 0;
00246 }
00247
00248
00249 extern "C" int main(const int argc, char** argv)
00250 {
00251
00252
00253
00254
00255 try
00256 {
00257 return submain(argc, argv);
00258 }
00259 catch (...)
00260 {
00261 REPORT_CURRENT_EXCEPTION;
00262 }
00263
00264 return 1;
00265 }
00266
00267
00268
00269
00270
00271