Skip to content

Commit 7276cad

Browse files
authored
Merge pull request #80 from cpp-lln-lab/remi-paced_by_scanner
use waitForTriggers to pace experiment
2 parents 3673a4f + 7861863 commit 7276cad

File tree

3 files changed

+92
-24
lines changed

3 files changed

+92
-24
lines changed

demos/CPP_waitForTriggerDemo.m

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

3+
%%
34
cfg.testingDevice = 'mri';
45

5-
cfg.mri.triggerNb = 4;
6+
cfg.mri.triggerNb = 2;
67

78
cfg.mri.triggerKey = 'space';
89

910
KbName('UnifyKeyNames');
1011

11-
waitForTrigger(cfg);
12+
%%
13+
% waitForTrigger(cfg);
14+
15+
%%
16+
quietMode = true;
17+
% waitForTrigger(cfg, [], quietMode);
18+
19+
%%
20+
nbTriggersToWait = 1;
21+
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: 63 additions & 21 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,25 +13,29 @@ 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+
% 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
1626

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
27+
[cfg, nbTriggersToWait, deviceNumber, quietMode] = checkInputs(varargin);
2528

2629
triggerCounter = 0;
2730

2831
if strcmpi(cfg.testingDevice, 'mri')
2932

3033
msg = ['Experiment starting in ', ...
31-
num2str(cfg.mri.triggerNb - triggerCounter), '...'];
32-
talkToMe(cfg, msg);
34+
num2str(nbTriggersToWait - triggerCounter), '...'];
35+
36+
talkToMe(cfg, msg, quietMode);
3337

34-
while triggerCounter < cfg.mri.triggerNb
38+
while triggerCounter < nbTriggersToWait
3539

3640
keyCode = []; %#ok<NASGU>
3741

@@ -42,10 +46,11 @@ function waitForTrigger(cfg, deviceNumber)
4246
triggerCounter = triggerCounter + 1 ;
4347

4448
msg = sprintf(' Trigger %i', triggerCounter);
45-
talkToMe(cfg, msg);
49+
50+
talkToMe(cfg, msg, quietMode);
4651

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
5156

@@ -54,16 +59,53 @@ function waitForTrigger(cfg, deviceNumber)
5459
end
5560
end
5661

57-
function talkToMe(cfg, msg)
62+
function [cfg, nbTriggersToWait, deviceNumber, quietMode] = checkInputs(varargin)
5863

59-
fprintf([msg, ' \n']);
64+
varargin = varargin{1};
6065

61-
if isfield(cfg, 'screen') && isfield(cfg.screen, 'win')
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
6271

63-
DrawFormattedText(cfg.screen.win, msg, ...
64-
'center', 'center', cfg.text.color);
72+
if numel(varargin) < 3 || isempty(varargin{3})
73+
quietMode = false;
74+
else
75+
quietMode = varargin{3};
76+
end
6577

66-
Screen('Flip', cfg.screen.win);
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};
91+
end
92+
93+
end
94+
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
67109

68110
end
69111

0 commit comments

Comments
 (0)