AssertOpenGL;
ipAddress = input('SimpleGazeTracker address: ','s');
% NEW in 0.4.0: an example of sending GazeParser's parameters.
settings = {
{'RECORDED_EYE', 'L'},...
{'SCREEN_ORIGIN', 'TopLeft'},...
{'TRACKER_ORIGIN', 'TopLeft'},...
{'SCREEN_WIDTH', 1024},...
{'SCREEN_HEIGHT', 768},...
{'VIEWING_DISTANCE', 57.3},...
{'DOTS_PER_CENTIMETER_H', 24.26},...
{'DOTS_PER_CENTIMETER_V', 24.26},...
{'SACCADE_VELOCITY_THRESHOLD', 20.0},...
{'SACCADE_ACCELERATION_THRESHOLD', 3800.0},...
{'SACCADE_MINIMUM_DURATION', 12},...
{'SACCADE_MINIMUM_AMPLITUDE', 0.2},...
{'FIXATION_MINIMUM_DURATION', 12},...
{'BLINK_MINIMUM_DURATION', 50},...
{'RESAMPLING', 0},...
{'FILTER_TYPE', 'identity'},...
{'FILTER_WN', 0.2},...
{'FILTER_SIZE', 5},...
{'FILTER_ORDER', 3}
};
try
%-----------------------------------------------------------------
% Open PsychToolbox Window.
% wptr and wrect are necessary to initialize SimpleGazeTracker
% toolbox later.
%-----------------------------------------------------------------
%[wptr, wrect] = Screen('OpenWindow',0,[0,0,0],[0,0,1024,768]);
[wptr, wrect] = Screen('OpenWindow',0);
cx = wrect(3)/2;
cy = wrect(4)/2;
%-----------------------------------------------------------------
% Initialize SimpleGazeTracker.
% Return value of SimpleGazeTracker is necessary to customize
% parameters later.
%-----------------------------------------------------------------
param = SimpleGazeTracker('Initialize',wptr,wrect);
%-----------------------------------------------------------------
% Update SimpleGazeTracker Toolbox parameters.
%-----------------------------------------------------------------
%'localhost' means that SimpleGazeTracker is running on the same PC.
param.IPAddress = ipAddress;
param.imageWidth = imageWidth;
param.imageHeight = imageHeight;
param.calArea = wrect;
param.calTargetPos = [0,0;-400,-300; 0,-300; 400,-300;\
-400, 0; 0, 0; 400, 0;\
-400, 300; 0, 300; 400, 300];
for i=1:length(param.calTargetPos)
param.calTargetPos(i,:) = param.calTargetPos(i,:)+[cx,cy];
end
result = SimpleGazeTracker('UpdateParameters',param);
if result{1} < 0 %failed
disp('Could not update parameter. Abort.');
Screen('CloseAll');
return;
end
%-----------------------------------------------------------------
% Connect to SimpleGazeTracker and open data file.
%-----------------------------------------------------------------
res = SimpleGazeTracker('Connect');
if res==-1 %connection failed
Screen('CloseAll');
return;
end
SimpleGazeTracker('OpenDataFile','data.csv',0); %datafile is not overwritten.
%-----------------------------------------------------------------
% Update camera image buffer (NEW in 0.4.0)
%-----------------------------------------------------------------
imgsize = SimpleGazeTracker('GetCameraImageSize');
param.imageWidth = imgsize(1);
param.imageHeight = imgsize(2);
result = SimpleGazeTracker('UpdateParameters',param);
if result{1} < 0 %failed
disp('Could not update parameter. Abort.');
Screen('CloseAll');
return;
end
%-----------------------------------------------------------------
% Send settings (NEW in 0.4.0)
%-----------------------------------------------------------------
res = SimpleGazeTracker('SendSettings', settings);
%-----------------------------------------------------------------
% Perform calibration.
%-----------------------------------------------------------------
while 1
res = SimpleGazeTracker('CalibrationLoop');
if res{1}=='q'
%Quit if calibrationloop is finished by 'q' key.
SimpleGazeTracker('CloseConnection');
Screen('CloseAll');
return;
end
if res{1}=='ESCAPE' && res{2}==1
%Leave from loop if calibration has been performed (res{2}==1).
break;
end
end
%-----------------------------------------------------------------
% Recording.
% If space key is pressed, a message 'Space' is inserted to the
% data file and latest 6 samples of gaze position is transferred
% from SimpleGazeTracker.
% Current gaze position is transferred every frame and a white
% square is drawn at the current gaze position.
%-----------------------------------------------------------------
gazeposlist = {};
geteyeposdelaylist = [];
previousKeyPressTime = GetSecs();
targetColor = 255;
%Start recording.
SimpleGazeTracker('StartRecording','Test trial',0.1);
for q = 1:360 %360 frames
[keyIsDown, secs, keyCode, deltaSecs] = KbCheck();
if keyCode(KbName('Space'))==1
% prevent chattering...
if GetSecs()-previousKeyPressTime > 0.2
SimpleGazeTracker('SendMessage','Space');
%get the latest 6 samples.
tmp = SimpleGazeTracker('GetEyePositionList',6,0,0.02);
if ~isempty(tmp)
gazeposlist(length(gazeposlist)+1) = {tmp};
end
%update previousKeyPressTime
previousKeyPressTime = GetSecs();
%change target color
if targetColor==255
targetColor=0;
else
targetColor=255;
end
end
end
if mod(q,60)==0
%Send message every 60 frames.
SimpleGazeTracker('SendMessage',num2str(q));
end
st = GetSecs();
%get current gaze position (moving average of 3 samples).
pos = SimpleGazeTracker('GetEyePosition',3,0.02);
geteyeposdelaylist = [geteyeposdelaylist, 1000*(GetSecs()-st)];
stimx = 200*cos(q/180*pi)+cx;
stimy = 200*sin(q/180*pi)+cy;
%horizontal component of current gaze position
markerx = pos{1}(1);
%vertical component of current gaze position
markery = pos{1}(2);
Screen('FillRect',wptr,127);
Screen('FillRect',wptr,0,[stimx-5,stimy-5,stimx+5,stimy+5]);
%draw marker at the current gaze position.
Screen('FillRect',wptr,targetColor,[markerx-5,markery-5,markerx+5,markery+5]);
Screen('Flip',wptr);
end
%Stop recording.
SimpleGazeTracker('StopRecording','',0.1);
%-----------------------------------------------------------------
% Clear Screen
%-----------------------------------------------------------------
Screen('FillRect',wptr,127);
Screen('Flip',wptr);
%-----------------------------------------------------------------
% Transfer data from SimpleGazeTracker.
%-----------------------------------------------------------------
fid = fopen('log.txt','wt');
%Get all messages.
msglist = SimpleGazeTracker('GetWholeMessageList',3.0);
fprintf(fid,'GetWholeMessageList test\n');
for i=1:length(msglist)
fprintf(fid,'%f,%s\n',msglist{i,1},msglist{i,2});
end
fprintf(fid,'\n');
%Get all gaze position data.
wholegazeposlist = SimpleGazeTracker('GetWholeEyePositionList',1,3.0);
fprintf(fid,'GetWholeEyePositionList test\n');
for i=1:length(wholegazeposlist)
fprintf(fid,'%f,%.1f,%.1f\n',...
wholegazeposlist(i,1),wholegazeposlist(i,2),wholegazeposlist(i,3));
end
fprintf(fid,'\n');
%Output result of GetEyePositionList
fprintf(fid,'GetEyePositionList test\n');
fprintf(fid,'Number of space-key press:%d\n',length(gazeposlist));
for i=1:length(gazeposlist)
fprintf(fid,'Keypress %d\n',i);
for j=1:length(gazeposlist{i})
fprintf(fid,'%f,%.1f,%.1f\n',...
gazeposlist{i}(j,1),gazeposlist{i}(j,2),gazeposlist{i}(j,3));
end
end
fprintf(fid,'\n');
%Output delay of SimpleGazeTracker('GetEyePosition')
fprintf(fid,'Delay of SimpleGazeTracker(''GetEyePosition'')\n');
for i=1:length(geteyeposdelaylist)
fprintf(fid,'%f\n',geteyeposdelaylist(i));
end
fclose(fid);
%-----------------------------------------------------------------
% Close remote data file and network connection.
%-----------------------------------------------------------------
SimpleGazeTracker('CloseDataFile');
SimpleGazeTracker('CloseConnection');
%-----------------------------------------------------------------
% Close Psychtoolbox screen.
%-----------------------------------------------------------------
Screen('CloseAll');
catch
SimpleGazeTracker('CloseConnection');
Screen('CloseAll');
psychrethrow(psychlasterror);
end