Skip to content

Commit b491f7f

Browse files
committed
recuse waitForTriggers to pace experiment
1 parent 8fdb408 commit b491f7f

File tree

3 files changed

+114
-44
lines changed

3 files changed

+114
-44
lines changed

demos/CPP_waitForTriggerDemo.m

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
1-
cd ..;
1+
addpath(genpath(fullfile(pwd, '..', 'src')));
22

3+
4+
%%
35
cfg.testingDevice = 'mri';
46

5-
cfg.mri.triggerNb = 4;
7+
cfg.mri.triggerNb = 2;
68

79
cfg.mri.triggerKey = 'space';
810

911
KbName('UnifyKeyNames');
1012

11-
waitForTrigger(cfg);
13+
%%
14+
% waitForTrigger(cfg);
15+
16+
%%
17+
quietMode = true;
18+
% waitForTrigger(cfg, [], quietMode);
19+
20+
21+
%%
22+
nbTriggersToWait = 1;
23+
waitForTrigger(cfg, [], quietMode, nbTriggersToWait);

src/waitFor.m

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
function waitFor(cfg, timeToWait)
2+
% waitFor(cfg, timeToWait)
3+
%
4+
% Will either wait for a certain amount of time or a number of triggers
5+
6+
if cfg.pacedByTriggers.do
7+
waitForTrigger(...
8+
cfg, ...
9+
cfg.keyboard.responseBox, ...
10+
cfg.pacedByTriggers.quietMode, ...
11+
timeToWait);
12+
else
13+
WaitSecs(timeToWait);
14+
end
15+
16+
end

src/waitForTrigger.m

Lines changed: 83 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
function waitForTrigger(cfg, deviceNumber)
2-
% waitForTrigger(cfg, deviceNumber)
1+
function waitForTrigger(varargin)
2+
% waitForTrigger(cfg, deviceNumber, quietMode, nbTriggersToWait)
33
%
44
% Counts a certain number of triggers coming from the scanner before returning.
55
%
@@ -13,73 +13,115 @@ function waitForTrigger(cfg, deviceNumber)
1313
% When no deviceNumber is set then it will check the default device: this is
1414
% probably only useful in debug as you will want to make sure you get the
1515
% triggers coming from the scanner in a real case scenario.
16-
17-
if nargin < 1 || isempty(cfg)
18-
error('I need at least one input.');
19-
end
20-
21-
if nargin < 2 || isempty(deviceNumber)
22-
deviceNumber = -1;
23-
fprintf('Will wait for triggers on the main keyboard device.\n');
24-
end
25-
16+
%
17+
% INPUTS
18+
% - varargin{1} = cfg
19+
%
20+
% - varargin{2} = deviceNumber
21+
%
22+
% - varargin{3} = quietMode: a boolean to make sure nothing is printed on the screen or
23+
% the prompt
24+
%
25+
% - nbTriggersToWait
26+
27+
[cfg, nbTriggersToWait, deviceNumber, quietMode] = checkInputs(varargin);
28+
2629
triggerCounter = 0;
27-
30+
2831
if strcmpi(cfg.testingDevice, 'mri')
29-
32+
3033
msg = ['Experiment starting in ', ...
31-
num2str(cfg.mri.triggerNb - triggerCounter), '...'];
32-
talkToMe(cfg, msg);
33-
34-
while triggerCounter < cfg.mri.triggerNb
35-
34+
num2str(nbTriggersToWait - triggerCounter), '...'];
35+
36+
talkToMe(cfg, msg, quietMode);
37+
38+
while triggerCounter < nbTriggersToWait
39+
3640
keyCode = []; %#ok<NASGU>
37-
41+
3842
[~, keyCode] = KbPressWait(deviceNumber);
39-
43+
4044
if strcmp(KbName(keyCode), cfg.mri.triggerKey)
41-
45+
4246
triggerCounter = triggerCounter + 1 ;
43-
47+
4448
msg = sprintf(' Trigger %i', triggerCounter);
45-
talkToMe(cfg, msg);
46-
49+
50+
talkToMe(cfg, msg, quietMode);
51+
4752
% we only wait if this is not the last trigger
48-
if triggerCounter < cfg.mri.triggerNb
53+
if triggerCounter < nbTriggersToWait
4954
pauseBetweenTriggers(cfg);
5055
end
51-
56+
5257
end
5358
end
5459
end
5560
end
5661

57-
function talkToMe(cfg, msg)
58-
59-
fprintf([msg, ' \n']);
60-
61-
if isfield(cfg, 'screen') && isfield(cfg.screen, 'win')
62-
63-
DrawFormattedText(cfg.screen.win, msg, ...
64-
'center', 'center', cfg.text.color);
65-
66-
Screen('Flip', cfg.screen.win);
67-
62+
function [cfg, nbTriggersToWait, deviceNumber, quietMode] = checkInputs(varargin)
63+
64+
varargin = varargin{1};
65+
66+
if numel(varargin) < 1 || isempty(varargin{1}) || ~isstruct(varargin{1})
67+
error('First input must be a cfg structure.');
68+
elseif isstruct(varargin{1})
69+
cfg = varargin{1};
70+
end
71+
72+
if numel(varargin) < 3 || isempty(varargin{3})
73+
quietMode = false;
74+
else
75+
quietMode = varargin{3};
76+
end
77+
78+
if numel(varargin) < 2 || isempty(varargin{2})
79+
deviceNumber = -1;
80+
if ~quietMode
81+
fprintf('Will wait for triggers on the main keyboard device.\n');
82+
end
83+
else
84+
deviceNumber = varargin{2};
85+
end
86+
87+
if numel(varargin) < 4 || isempty(varargin{4})
88+
nbTriggersToWait = cfg.mri.triggerNb;
89+
else
90+
nbTriggersToWait = varargin{4};
6891
end
92+
93+
end
6994

95+
function talkToMe(cfg, msg, quietMode)
96+
97+
if ~quietMode
98+
99+
fprintf([msg, ' \n']);
100+
101+
if isfield(cfg, 'screen') && isfield(cfg.screen, 'win')
102+
103+
DrawFormattedText(cfg.screen.win, msg, ...
104+
'center', 'center', cfg.text.color);
105+
106+
Screen('Flip', cfg.screen.win);
107+
108+
end
109+
110+
end
111+
70112
end
71113

72114
function pauseBetweenTriggers(cfg)
73115
% we pause between triggers otherwise KbWait and KbPressWait might be too fast and could
74116
% catch several triggers in one go.
75-
117+
76118
waitTime = 0.5;
77119
if isfield(cfg, 'mri') && isfield(cfg.mri, 'repetitionTime') && ~isempty(cfg.mri.repetitionTime)
78120
waitTime = cfg.mri.repetitionTime / 2;
79121
end
80-
122+
81123
WaitSecs(waitTime);
82-
124+
83125
end
84126

85127
% function [MyPort] = WaitForScanTrigger(Parameters)

0 commit comments

Comments
 (0)