Skip to content

Commit d400c66

Browse files
authored
Merge pull request #27 from Remi-Gau/remi-REF_getResponses
Refactor getResponses
2 parents 169c53a + c6b988b commit d400c66

21 files changed

+710
-276
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@
66
# exclude content of logfiles folders
77
*.tsv
88
*.mat
9+
check_my_code_report.txt

.travis.yml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Travis CI (https://travis-ci.org/)
2+
3+
language: c
4+
dist: bionic
5+
cache:
6+
apt: true # only works with Pro version
7+
8+
env:
9+
global:
10+
- OCTFLAGS="--no-gui --no-window-system --silent"
11+
12+
before_install:
13+
- travis_retry sudo apt-get -y -qq update
14+
- travis_retry sudo apt-get -y install octave
15+
- travis_retry sudo apt-get -y install liboctave-dev
16+
17+
install:
18+
- octave $OCTFLAGS --eval "addpath (pwd); savepath ();"
19+
20+
before_script:
21+
# Change current directory
22+
- cd tests
23+
24+
script:
25+
- octave $OCTFLAGS --eval "results = runtests; assert(all(~[results.Failed]))"

CPP_getResponseDemo.m

Lines changed: 0 additions & 118 deletions
This file was deleted.

README.md

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,30 @@ You can then use the [matlab package manager](https://github.com/mobeets/mpm), t
7070
end
7171
```
7272

73+
## Setting up keyboards
74+
75+
To select a specific keyboard to be used by the experimenter or the participant, you need to know
76+
the value assigned by PTB to each keyboard device.
77+
78+
To know this copy-paste this on the command window:
79+
80+
``` matlab
81+
[keyboardNumbers, keyboardNames] = GetKeyboardIndices;
82+
83+
disp(keyboardNumbers);
84+
disp(keyboardNames);
85+
```
86+
87+
You can then assign a specific device number to the main keyboard or the response box in the `cfg` structure
88+
89+
- `cfg.keyboard.responseBox` would be the device number of the device used by the participant to give his/her
90+
response: like the button box in the scanner or a separate keyboard for a behavioral experiment
91+
- `cfg.keyboard.keyboard` would be the device number of the keyboard on which the experimenter will type or
92+
press the keys necessary to start or abort the experiment.
93+
94+
`cfg.keyboard.responseBox` and `cfg.keyboard.keyboard` can be different or the same.
95+
96+
Using empty vectors (ie `[]`) or a negative value for those means that you will let PTB find and use the default device.
7397

7498
## Structure and function details
7599

@@ -106,23 +130,27 @@ It is wrapper function to use `KbQueue` which is definitely what you should used
106130

107131
You can easily collect responses while running some other code at the same time.
108132

109-
It will only take responses from the `response box` which can simply be the "main keyboard" or
110-
another keyboard connected to the computer or the response box that the participant is using.
133+
It will only take responses from one device which can simply be the "main keyboard"
134+
(the default device that PTB will find) or another keyboard connected to the computer
135+
or the response box that the participant is using.
111136

112137
You can use it in a way so that it only takes responses from certain keys and ignore others (like
113138
the triggers from an MRI scanner).
114139

115140
If you want to know more on how to use it check its help section and the `CPP_getResponseDemo.m`.
116141

117-
To select a specific keyboard to be used by the experimenter or the participant, you need to know
118-
the value assigned by PTB to each keyboard device.
142+
In brief, there are several actions you can execute with this function.
119143

120-
To know this copy-paste this on the command window:
144+
- init: initialize the buffer for key presses on a given device (you can also specify the keys of interest that should be listened to).
145+
- start: start listening to the key presses (carefully insert into your script - where do you want to start buffering the responses).
146+
- check: till that point, it will check the buffer for all key presses.
147+
- It only reports presses on the keys of interest mentioned at initialization.
148+
- It **can** also check for presses on the escape key and abort if the escape key is part of the keys of interest.
149+
- flush: Empties the buffer of key presses in case you want to discard any previous key presses.
150+
- stop: Stops buffering key presses. You can still restart by calling "start" again.
151+
- release: Closes the buffer for good.
121152

122-
[keyboardNumbers, keyboardNames] = GetKeyboardIndices;
123153

124-
keyboardNumbers
125-
keyboardNames
126154

127155
### deg2Pix
128156

checkAbort.m

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
function checkAbort(cfg, deviceNumber)
2+
% Check for experiment abortion from operator
3+
% When no deviceNumber is set then it will check the default device
4+
% When an abort key s detected this will set a global variable and throw a
5+
% specific error that can then be catched.
6+
%
7+
% Maint script
8+
% try
9+
% % Your awesome experiment
10+
% catch ME % when something goes wrong
11+
% switch ME.identifier
12+
% case 'checkAbort:abortRequested'
13+
% % stuff to do when an abort is requested (save data...)
14+
% otherwise
15+
% % stuff to do otherwise
16+
% rethrow(ME) % display the error
17+
% end
18+
% end
19+
20+
if nargin < 1 || isempty(cfg)
21+
error('I need at least one input.')
22+
end
23+
24+
if nargin < 2 || isempty(deviceNumber)
25+
deviceNumber = -1;
26+
end
27+
28+
[keyIsDown, ~, keyCode] = KbCheck(deviceNumber);
29+
30+
if keyIsDown && keyCode(KbName(cfg.keyboard.escapeKey))
31+
32+
errorAbort();
33+
34+
end
35+
36+
end

demos/CPP_checkAbortDemo.m

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
% add parent directory to the path (to make sure we can access the CPP_PTB
2+
% functions)
3+
addpath(fullfile(pwd, '..'))
4+
5+
% set up
6+
cfg.keyboard.escapeKey = 'ESCAPE';
7+
8+
% beginning of demo
9+
KbName('UnifyKeyNames');
10+
11+
12+
try
13+
14+
% stay in the loop until the escape key is pressed
15+
while GetSecs < Inf
16+
17+
checkAbort(cfg)
18+
19+
end
20+
21+
catch ME
22+
23+
switch ME.identifier
24+
case 'checkAbort:abortRequested'
25+
warning('You pressed the escape key: will try to fail gracefully.')
26+
fprintf('\nWe did catch your abort signal.\n')
27+
otherwise
28+
rethrow(ME) % display other errors
29+
end
30+
31+
end

0 commit comments

Comments
 (0)