=== delete this after reading ===
Please make sure you read this post before asking for help. No one can help you unless you provide a clear description of the software environment you are using and your programming problem…
=== delete until here ===
Now the following script ask participant to press space to end each trial, how can i amend the code so that each image will be presented for 3 sec and then auto present the next image.
function EyeLink_SimplePicture(screenNumber)
% A simple EyeLink integration demo that records eye movements passively
% while an image is presented on the screen. Each trial ends when the
% space bar or a button is pressed.
%
% Usage:
% Eyelink_SimplePicture(screenNumber)
%
% screenNumber is an optional parameter which can be used to pass a specific value to Screen(‘OpenWindow’, …)
% If screenNumber is not specified, or if isempty(screenNumber) then the default:
% screenNumber = max(Screen(‘Screens’));
% will be used.
% Bring the Command Window to the front if it is already open
if ~IsOctave; commandwindow; end;
% Use default screenNumber if none specified
if (nargin < 1)
screenNumber = ;
end
try
%% STEP 1: INITIALIZE EYELINK CONNECTION; OPEN EDF FILE; GET EYELINK TRACKER VERSION
% Initialize EyeLink connection (dummymode = 0) or run in "Dummy Mode" without an EyeLink connection (dummymode = 1);
dummymode = 0;
% Optional: Set IP address of eyelink tracker computer to connect to.
% Call this before initializing an EyeLink connection if you want to use a non-default IP address for the Host PC.
%Eyelink('SetAddress', '10.10.10.240');
EyelinkInit(dummymode); % Initialize EyeLink connection
status = Eyelink('IsConnected');
if status < 1 % If EyeLink not connected
dummymode = 1;
end
% Open dialog box for EyeLink Data file name entry. File name up to 8 characters
prompt = {'Enter EDF file name (up to 8 characters)'};
dlg_title = 'Create EDF file';
def = {'demo'}; % Create a default edf file name
answer = inputdlg(prompt, dlg_title, 1, def); % Prompt for new EDF file name
% Print some text in Matlab's Command Window if a file name has not been entered
if isempty(answer)
fprintf('Session cancelled by user\n')
error('Session cancelled by user'); % Abort experiment (see cleanup function below)
end
edfFile = answer{1}; % Save file name to a variable
% Print some text in Matlab's Command Window if file name is longer than 8 characters
if length(edfFile) > 8
fprintf('Filename needs to be no more than 8 characters long (letters, numbers and underscores only)\n');
error('Filename needs to be no more than 8 characters long (letters, numbers and underscores only)');
end
% Open an EDF file and name it
failOpen = Eyelink('OpenFile', edfFile);
if failOpen ~= 0 % Abort if it fails to open
fprintf('Cannot create EDF file %s', edfFile); % Print some text in Matlab's Command Window
error('Cannot create EDF file %s', edfFile); % Print some text in Matlab's Command Window
end
% Get EyeLink tracker and software version
% <ver> returns 0 if not connected
% <versionstring> returns 'EYELINK I', 'EYELINK II x.xx', 'EYELINK CL x.xx' where 'x.xx' is the software version
ELsoftwareVersion = 0; % Default EyeLink version in dummy mode
[ver, versionstring] = Eyelink('GetTrackerVersion');
if dummymode == 0 % If connected to EyeLink
% Extract software version number.
[r1 vnumcell] = regexp(versionstring,'.*?(\d)\.\d*?','Match','Tokens'); % Extract EL version before decimal point
ELsoftwareVersion = str2double(vnumcell{1}{1}); % Returns 1 for EyeLink I, 2 for EyeLink II, 3/4 for EyeLink 1K, 5 for EyeLink 1KPlus, 6 for Portable Duo
% Print some text in Matlab's Command Window
fprintf('Running experiment on %s version %d\n', versionstring, ver );
end
% Add a line of text in the EDF file to identify the current experimemt name and session. This is optional.
% If your text starts with "RECORDED BY " it will be available in DataViewer's Inspector window by clicking
% the EDF session node in the top panel and looking for the "Recorded By:" field in the bottom panel of the Inspector.
preambleText = sprintf('RECORDED BY Psychtoolbox demo %s session name: %s', mfilename, edfFile);
Eyelink('Command', 'add_file_preamble_text "%s"', preambleText);
%% STEP 2: SELECT AVAILABLE SAMPLE/EVENT DATA
% See EyeLinkProgrammers Guide manual > Useful EyeLink Commands > File Data Control & Link Data Control
% Select which events are saved in the EDF file. Include everything just in case
Eyelink('Command', 'file_event_filter = LEFT,RIGHT,FIXATION,SACCADE,BLINK,MESSAGE,BUTTON,INPUT');
% Select which events are available online for gaze-contingent experiments. Include everything just in case
Eyelink('Command', 'link_event_filter = LEFT,RIGHT,FIXATION,SACCADE,BLINK,BUTTON,FIXUPDATE,INPUT');
% Select which sample data is saved in EDF file or available online. Include everything just in case
if ELsoftwareVersion > 3 % Check tracker version and include 'HTARGET' to save head target sticker data for supported eye trackers
Eyelink('Command', 'file_sample_data = LEFT,RIGHT,GAZE,HREF,RAW,AREA,HTARGET,GAZERES,BUTTON,STATUS,INPUT');
Eyelink('Command', 'link_sample_data = LEFT,RIGHT,GAZE,GAZERES,AREA,HTARGET,STATUS,INPUT');
else
Eyelink('Command', 'file_sample_data = LEFT,RIGHT,GAZE,HREF,RAW,AREA,GAZERES,BUTTON,STATUS,INPUT');
Eyelink('Command', 'link_sample_data = LEFT,RIGHT,GAZE,GAZERES,AREA,STATUS,INPUT');
end
%% STEP 3: OPEN GRAPHICS WINDOW
% Open experiment graphics on the specified screen
if isempty(screenNumber)
screenNumber = max(Screen('Screens')); % Use default screen if none specified
end
window = Screen('OpenWindow', screenNumber, [128 128 128]); % Open graphics window
Screen('Flip', window);
% Return width and height of the graphics window/screen in pixels
[width, height] = Screen('WindowSize', window);
%% STEP 4: SET CALIBRATION SCREEN COLOURS/SOUNDS; PROVIDE WINDOW SIZE TO EYELINK HOST & DATAVIEWER; SET CALIBRATION PARAMETERS; CALIBRATE
% Provide EyeLink with some defaults, which are returned in the structure "el".
el = EyelinkInitDefaults(window);
% set calibration/validation/drift-check(or drift-correct) size as well as background and target colors.
% It is important that this background colour is similar to that of the stimuli to prevent large luminance-based
% pupil size changes (which can cause a drift in the eye movement data)
el.calibrationtargetsize = 3;% Outer target size as percentage of the screen
el.calibrationtargetwidth = 0.7;% Inner target size as percentage of the screen
el.backgroundcolour = [128 128 128];% RGB grey
el.calibrationtargetcolour = [0 0 0];% RGB black
% set "Camera Setup" instructions text colour so it is different from background colour
el.msgfontcolour = [0 0 0];% RGB black
% Use an image file instead of the default calibration bull's eye targets.
% Commenting out the following two lines will use default targets:
el.calTargetType = 'image';
el.calImageTargetFilename = [pwd '/' 'fixTarget.jpg'];
% Set calibration beeps (0 = sound off, 1 = sound on)
el.targetbeep = 1; % sound a beep when a target is presented
el.feedbackbeep = 1; % sound a beep after calibration or drift check/correction
% You must call this function to apply the changes made to the el structure above
EyelinkUpdateDefaults(el);
% Set display coordinates for EyeLink data by entering left, top, right and bottom coordinates in screen pixels
Eyelink('Command','screen_pixel_coords = %ld %ld %ld %ld', 0, 0, width-1, height-1);
% Write DISPLAY_COORDS message to EDF file: sets display coordinates in DataViewer
% See DataViewer manual section: Protocol for EyeLink Data to Viewer Integration > Pre-trial Message Commands
Eyelink('Message', 'DISPLAY_COORDS %ld %ld %ld %ld', 0, 0, width-1, height-1);
% Set number of calibration/validation dots and spread: horizontal-only(H) or horizontal-vertical(HV) as H3, HV3, HV5, HV9 or HV13
Eyelink('Command', 'calibration_type = HV9'); % horizontal-vertical 9-points
% Allow a supported EyeLink Host PC button box to accept calibration or drift-check/correction targets via button 5
Eyelink('Command', 'button_function 5 "accept_target_fixation"');
% Hide mouse cursor
HideCursor(screenNumber);
% Start listening for keyboard input. Suppress keypresses to Matlab windows.
ListenChar(-1);
Eyelink('Command', 'clear_screen 0'); % Clear Host PC display from any previus drawing
% Put EyeLink Host PC in Camera Setup mode for participant setup/calibration
EyelinkDoTrackerSetup(el);
%% STEP 5: TRIAL LOOP.
spaceBar = KbName('space');% Identify keyboard key code for spacebar to end each trial later on
imgList = {'Inf_sad_un.bmp' 'Inm_neutral_m.bmp' 'Inf_sad_m.bmp' 'Inm_neutral_un.bmp' 'exp1f_disgust_m.bmp' 'exp2f_disgust_un.bmp' 'exp3f_happy_m.bmp' 'exp1m_happy_un.bmp' 'exp2m_neutral_m.bmp' 'exp3m_neutral_un.bmp' 'exp1f_disgust_un.bmp' 'exp2f_happy_m.bmp' 'exp3f_happy_un.bmp' 'exp1m_neutral_m.bmp' 'exp2m_neutral_un.bmp' 'exp3m_sad_m.bmp' 'exp1f_happy_m.bmp' 'exp2f_happy_un.bmp' 'exp3f_neutral_m.bmp' 'exp1m_neutral_un.bmp' 'exp2m_sad_m.bmp' 'exp3m_sad_un.bmp' 'exp1f_happy_un.bmp' 'exp2f_neutral_m.bmp' 'exp3f_neutral_un.bmp' 'exp1m_sad_m.bmp' 'exp2m_sad_un.bmp' 'exp3m_disgust_m.bmp' 'exp1f_neutral_m.bmp' 'exp2f_neutral_un.bmp' 'exp3f_sad_m.bmp' 'exp1m_sad_un.bmp' 'exp2m_disgust_m.bmp' 'exp3m_disgust_un.bmp' 'exp1f_neutral_un.bmp' 'exp2f_sad_m.bmp' 'exp3f_sad_un.bmp' 'exp1m_disgust_m.bmp' 'exp2m_disgust_un.bmp' 'exp3m_happy_m.bmp' 'exp1f_sad_m.bmp' 'exp2f_sad_un.bmp' 'exp3f_disgust_m.bmp' 'exp1m_disgust_un.bmp' 'exp2m_happy_m.bmp' 'exp3m_happy_un.bmp' 'exp1f_sad_un.bmp' 'exp2f_disgust_m.bmp' 'exp3f_disgust_un.bmp' 'exp1m_happy_m.bmp' 'exp2m_happy_un.bmp' 'exp3m_neutral_m.bmp'};% Provide image list for 2 trials
for i = 1:length(imgList)
% region of interest
% STEP 5.1: START TRIAL; SHOW TRIAL INFO ON HOST PC; SHOW BACKDROP IMAGE AND/OR DRAW FEEDBACK GRAPHICS ON HOST PC; DRIFT-CHECK/CORRECTION
% Write TRIALID message to EDF file: marks the start of a trial for DataViewer
% See DataViewer manual section: Protocol for EyeLink Data to Viewer Integration > Defining the Start and End of a Trial
Eyelink('Message', 'TRIALID %d', i);
% Write !V CLEAR message to EDF file: creates blank backdrop for DataViewer
% See DataViewer manual section: Protocol for EyeLink Data to Viewer Integration > Simple Drawing
Eyelink('Message', '!V CLEAR %d %d %d', el.backgroundcolour(1), el.backgroundcolour(2), el.backgroundcolour(3));
% Supply the trial number as a line of text on Host PC screen
Eyelink('Command', 'record_status_message "TRIAL %d/%d"', i, length(imgList));
% Draw graphics on the EyeLink Host PC display. See COMMANDS.INI in the Host PC's exe folder for a list of commands
imgName = char(imgList(i)); % Get image file name for current trial
imgInfo = imfinfo(imgName); % Get image file info
Eyelink('SetOfflineMode');% Put tracker in idle/offline mode before drawing Host PC graphics and before recording
Eyelink('Command', 'clear_screen 0'); % Clear Host PC display from any previus drawing
% Optional: Transfer a 24-bit or 32-bit bitmap as Host PC backdrop image
% [status] = Eyelink('ImageTransfer', imagePath, xs, ys, width, height, xd, yd, options);
% xs, ys: top-left corner of the region to be transferred within the source image
% width, height: size of region to be transferred within the source image (note, values of 0 will include the entire width/height)
% xd, yd: location (top-left) where image region to be transferred will be presented on the Host PC
% This image transfer function works for non-resized image presentation only. If you need to resize images and use this function please resize
% the original image files beforehand
transferStatus = Eyelink('ImageTransfer', imgInfo.Filename, 0, 0, 0, 0, round(width/2-imgInfo.Width/2), round(height/2-imgInfo.Height/2));
if dummymode == 0 && transferStatus ~= 0 % If connected to EyeLink and image transfer fails
fprintf('Image transfer Failed\n'); % Print some text in Matlab's Command Window
end
% Optional: draw feedback box and lines on Host PC interface instead of (or on top of) backdrop image.
% See section 25.7 'Drawing Commands' in the EyeLink Programmers Guide manual
Eyelink('Command', 'draw_box %d %d %d %d 15', round(width/2-imgInfo.Width/2), round(height/2-imgInfo.Height/2), round(width/2+imgInfo.Width/2), round(height/2+imgInfo.Height/2));
% Perform a drift check/correction.
% Optionally provide x y target location, otherwise target is presented on screen centre
EyelinkDoDriftCorrection(el, round(width/2), round(height/2));
%STEP 5.2: START RECORDING
% Put tracker in idle/offline mode before recording. Eyelink('SetOfflineMode') is recommended
% however if Eyelink('Command', 'set_idle_mode') is used allow 50ms before recording as shown in the commented code:
% Eyelink('Command', 'set_idle_mode');% Put tracker in idle/offline mode before recording
% WaitSecs(0.05); % Allow some time for transition
Eyelink('SetOfflineMode');% Put tracker in idle/offline mode before recording
Eyelink('StartRecording'); % Start tracker recording
WaitSecs(0.1); % Allow some time to record a few samples before presenting first stimulus
% STEP 5.3: PRESENT STIMULUS; CREATE DATAVIEWER BACKDROP AND INTEREST AREA
% Prepare and present stimulus
Screen('FillRect', window, el.backgroundcolour);% Prepare grey background on backbuffer
imgData = imread(imgName); % Read image from file
imgTexture = Screen('MakeTexture',window, imgData); % Convert image file to texture
Screen('DrawTexture', window, imgTexture); % Prepare image texture on backbuffer
Screen('TextSize', window, 30); % Specify text size
Screen('DrawText', window, 'Press space or button to end trial', 5, height-35, 0); % Prepare text on backbuffer
[~, RtStart] = Screen('Flip', window); % Present stimulus
% Write message to EDF file to mark the start time of stimulus presentation.
Eyelink('Message', 'STIM_ONSET');
% Write !V IMGLOAD message to EDF file: provides instructions for DataViewer so it will show trial stimulus as backdrop
% See DataViewer manual section: Protocol for EyeLink Data to Viewer Integration > Image Commands
Eyelink('Message', '!V IMGLOAD CENTER %s %d %d', imgName, width/2, height/2);
% Write !V IAREA message to EDF file: creates interest area around image in DataViewer
% See DataViewer manual section: Protocol for EyeLink Data to Viewer Integration > Interest Area Commands
Eyelink('Message', '!V IAREA RECTANGLE %d %d %d %d %d %s', 1, round(width/2-imgInfo.Width/2), round(height/2-imgInfo.Height/2), round(width/2+imgInfo.Width/2), round(height/2+imgInfo.Height/2),'IMAGE_IA');
% STEP 5.4: WAIT FOR KEYPRESS/BUTTON; SHOW BLANK SCREEN; STOP RECORDING
while 1 % loop until error, space bar or button press
% Check that eye tracker is still recording. Otherwise close and transfer copy of EDF file to Display PC
err = Eyelink('CheckRecording');
if(err ~= 0)
fprintf('EyeLink Recording stopped!\n');
% Transfer a copy of the EDF file to Display PC
Eyelink('SetOfflineMode');% Put tracker in idle/offline mode
Eyelink('CloseFile'); % Close EDF file on Host PC
Eyelink('Command', 'clear_screen 0'); % Clear trial image on Host PC at the end of the experiment
WaitSecs(0.1); % Allow some time for screen drawing
% Transfer a copy of the EDF file to Display PC
transferFile; % See transferFile function below)
error('EyeLink is not in record mode when it should be. Unknown error. EDF transferred from Host PC to Display PC, please check its integrity.');
end
% End trial if spacebar is pressed
[~, RtEnd, keyCode] = KbCheck;
if keyCode(spaceBar)
% Write message to EDF file to mark the spacebar press time
Eyelink('Message', 'KEY_PRESSED');
reactionTime = round((RtEnd-RtStart)*1000); % Calculate RT from stimulus onset
break; % Exit while loop
end
% End trial if button 5 on a supported Host PC button box is pressed
% Use (button number * -1) + 1 to determine bitshift value
% (e.g., button 5 should use bitshift value of -4)
buttonResult = Eyelink('ButtonStates');
if buttonResult
if bitshift(buttonResult, -4) == 1
% Write message to EDF file to mark the button press time
Eyelink('Message', 'BUTTON_PRESSED');
reactionTime = round((GetSecs-RtStart)*1000); % Calculate RT from stimulus onset
break; % Exit while loop
end
end
end % End of while loop
% Draw blank screen at end of trial
Screen('FillRect', window, el.backgroundcolour); % Prepare grey background on backbuffer
Screen('Flip', window); % Present blank screen
% Write message to EDF file to mark time when blank screen is presented
Eyelink('Message', 'BLANK_SCREEN');
% Write !V CLEAR message to EDF file: creates blank backdrop for DataViewer
% See DataViewer manual section: Protocol for EyeLink Data to Viewer Integration > Simple Drawing
Eyelink('Message', '!V CLEAR %d %d %d', el.backgroundcolour(1), el.backgroundcolour(2), el.backgroundcolour(3));
% Stop recording eye movements at the end of each trial
WaitSecs(0.1); % Add 100 msec of data to catch final events before stopping
Eyelink('StopRecording'); % Stop tracker recording
% STEP 5.5: CREATE VARIABLES FOR DATAVIEWER; END TRIAL
% Write !V TRIAL_VAR messages to EDF file: creates trial variables in DataViewer
% See DataViewer manual section: Protocol for EyeLink Data to Viewer Integration > Trial Message Commands
Eyelink('Message', '!V TRIAL_VAR iteration %d', i); % Trial iteration
Eyelink('Message', '!V TRIAL_VAR image %s', imgName); % Image name
WaitSecs(0.001); % Allow some time between messages. Some messages can be lost if too many are written at the same time
Eyelink('Message', '!V TRIAL_VAR rt %d', reactionTime); % Reaction time
% Write TRIAL_RESULT message to EDF file: marks the end of a trial for DataViewer
% See DataViewer manual section: Protocol for EyeLink Data to Viewer Integration > Defining the Start and End of a Trial
Eyelink('Message', 'TRIAL_RESULT 0');
WaitSecs(0.01); % Allow some time before ending the trial
% Clear Screen() textures that were initialized for each trial iteration
Screen('Close', imgTexture);
end % End trial loop
%% STEP 6: CLOSE EDF FILE. TRANSFER EDF COPY TO DISPLAY PC. CLOSE EYELINK CONNECTION. FINISH UP
% Put tracker in idle/offline mode before closing file. Eyelink('SetOfflineMode') is recommended.
% However if Eyelink('Command', 'set_idle_mode') is used, allow 50ms before closing the file as shown in the commented code:
% Eyelink('Command', 'set_idle_mode');% Put tracker in idle/offline mode
% WaitSecs(0.05); % Allow some time for transition
Eyelink('SetOfflineMode'); % Put tracker in idle/offline mode
Eyelink('Command', 'clear_screen 0'); % Clear Host PC backdrop graphics at the end of the experiment
WaitSecs(0.5); % Allow some time before closing and transferring file
Eyelink('CloseFile'); % Close EDF file on Host PC
% Transfer a copy of the EDF file to Display PC
transferFile; % See transferFile function below
catch % If syntax error is detected
% Print error message and line number in Matlab’s Command Window
psychrethrow(psychlasterror);
end
cleanup;
% Cleanup function used throughout the script above
function cleanup
try
Screen(‘CloseAll’); % Close window if it is open
end
Eyelink(‘Shutdown’); % Close EyeLink connection
ListenChar(0); % Restore keyboard output to Matlab
ShowCursor; % Restore mouse cursor
if ~IsOctave; commandwindow; end; % Bring Command Window to front
end
% Function for transferring copy of EDF file to the experiment folder on Display PC.
% Allows for optional destination path which is different from experiment folder
function transferFile
try
if dummymode ==0 % If connected to EyeLink
% Show ‘Receiving data file…’ text until file transfer is complete
Screen(‘FillRect’, window, el.backgroundcolour); % Prepare background on backbuffer
Screen(‘DrawText’, window, ‘Receiving data file…’, 5, height-35, 0); % Prepare text
Screen(‘Flip’, window); % Present text
fprintf(‘Receiving data file ‘’%s.edf’‘\n’, edfFile); % Print some text in Matlab’s Command Window
% Transfer EDF file to Host PC
% [status =] Eyelink('ReceiveFile',['src'], ['dest'], ['dest_is_path'])
status = Eyelink('ReceiveFile');
% Optionally uncomment below to change edf file name when a copy is transferred to the Display PC
% % If <src> is omitted, tracker will send last opened data file.
% % If <dest> is omitted, creates local file with source file name.
% % Else, creates file using <dest> as name. If <dest_is_path> is supplied and non-zero
% % uses source file name but adds <dest> as directory path.
% newName = ['Test_',char(datetime('now','TimeZone','local','Format','y_M_d_HH_mm')),'.edf'];
% status = Eyelink('ReceiveFile', [], newName, 0);
% Check if EDF file has been transferred successfully and print file size in Matlab's Command Window
if status > 0
fprintf('EDF file size: %.1f KB\n', status/1024); % Divide file size by 1024 to convert bytes to KB
end
% Print transferred EDF file path in Matlab's Command Window
fprintf('Data file ''%s.edf'' can be found in ''%s''\n', edfFile, pwd);
else
fprintf('No EDF file saved in Dummy mode\n');
end
catch % Catch a file-transfer error and print some text in Matlab's Command Window
fprintf('Problem receiving data file ''%s''\n', edfFile);
psychrethrow(psychlasterror);
end
end
end