Digital I/O Demo 1 – Recording digital input from a RESPONSEPixx

This demo prints how many digital IOs you have access to. Since it interacts with a RESPONSEPixx, it changes five IOs to outputs. Lines 30-32 show how this is done. The value 0x1F0000 means that digital IOs 3 to 7 are digital outs. This comes from the binary representation of 0x1F0000, which is 0b0001 1111 0000 0000 0000 0000 (which represents IOs 0 to 23).

This demo also uses markers. Markers are used for measuring the time seperating two specific events. As a first step, you must do your first marker, Datapixx('SetMarker');, then you must decide when that marker should occur. In this example, let us use the video sync: Datapixx('RegWrRdVideoSync');. You cannot get a value of the device time on that marker: stimulusOnsetTime = Datapixx('GetMarker');.

After this, we set up our button box: Datapixx('EnableDinDebounce');, this allows us to ignore the values that oscillate when a button is pushed. Datapixx('SetDinLog'); tells the device that we are going to log all the RESPONSEPixx presses. Like a schedule, you must then start the logging operation Datapixx('StartDinLog');.

Once the experiement is started, you can get the reactions/buttons presses and their timestamps using [data tt] = Datapixx('ReadDinLog');. You can also get a response time with the difference between the timestamps and the marker.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
function DatapixxDinBasicDemo()
% DatapixxDinBasicDemo()
%
% Demonstrates the basic functions of the DATAPixx TTL digital inputs.
% Prints the number of TTL inputs in the system,
% then logs button presses until user hits a key.
%
% Also see: DatapixxSimonGame
%
% History:
%
% Oct 1, 2009  paa     Written
% Oct 29, 2014 dml     Revised 

AssertOpenGL;   % We use PTB-3

% Open Datapixx, and stop any schedules which might already be running
Datapixx('Open');
Datapixx('StopAllSchedules');
Datapixx('RegWrRd');    % Synchronize DATAPixx registers to local register cache

% Show how many TTL input bits are in the Datapixx
nBits = Datapixx('GetDinNumBits');
fprintf('\nDATAPixx has %d TTL input bits\n', nBits);

% RESPONSEPixx has 5 illuminated buttons.
% We drive those button lights by turning around 5 DIN bits to outputs.
% Test paradigms could illuminate only the buttons which are valid in context.
% (eg: 1 button when waiting for subject to initiate a trial,
% 2 other buttons when waiting for 2-alternative forced-choice response).
Datapixx('SetDinDataDirection', hex2dec('1F0000'));
Datapixx('SetDinDataOut', hex2dec('1F0000'));
Datapixx('SetDinDataOutStrength', 1);   % Set brightness of buttons

% We'll say that we want to calculate response times
% from a stimulus appearing at the next vertical sync.
Datapixx('SetMarker');
Datapixx('RegWrRdVideoSync');
stimulusOnsetTime = Datapixx('GetMarker');

% Fire up the logger
Datapixx('EnableDinDebounce');      % Filter out button bounce
%Datapixx('DisableDinDebounce');    % Uncomment this line to log gruesome details of button bounce
Datapixx('SetDinLog');              % Configure logging with default values
Datapixx('StartDinLog');
Datapixx('RegWrRd');

% Show initial state of all the digital input bits
fprintf('Initial digital input states = ');
initialValues = Datapixx('GetDinValues');
for bit = nBits-1:-1:0               % Easier to understand if we show in binary
    if (bitand(initialValues, 2^bit) > 0)
        fprintf('1');
    else
        fprintf('0');
    end
end
fprintf('\n');

% Report logged button activity until keyboard is pressed
fprintf('\nPlug button box into Digital IN db-25\n');
fprintf('Press buttons to see new log entries\n');
fprintf('Hit any key to stop...\n');
if (exist('OCTAVE_VERSION'))
    fflush(stdout);
end
while ~KbCheck
    Datapixx('RegWrRd');
    status = Datapixx('GetDinStatus');
    if (status.newLogFrames > 0)
        [data tt] = Datapixx('ReadDinLog');
        for i = 1:status.newLogFrames
            fprintf('responseTime = %f', tt(i)-stimulusOnsetTime);
            fprintf(', button states = ');
            for bit = 15:-1:0               % Easier to understand if we show in binary
                if (bitand(data(i), 2^bit) > 0)
                    fprintf('1');
                else
                    fprintf('0');
                end
            end
            fprintf('\n');
        end
        if (exist('OCTAVE_VERSION'))
            fflush(stdout);
        end
    end
end

% Show final status of digital input logger
fprintf('\nStatus information for digital input logger:\n');
disp(Datapixx('GetDinStatus'));

% Job done
Datapixx('StopDinLog');
Datapixx('RegWrRd');
Datapixx('Close');
fprintf('\n\nDemo completed\n\n');