Difference between revisions of "ButtonBoxes"
Jump to navigation
Jump to search
| Line 68: | Line 68: | ||
== Matlab Settings == | == Matlab Settings == | ||
| + | |||
| + | <nowiki> | ||
| + | =================================================================================================== | ||
| + | function handle = serial_buttonbox_common(cmd,varargin) | ||
| + | % to initialize connection: | ||
| + | % handle = serial_buttonbox('open',se) | ||
| + | % settings (se): | ||
| + | % define settings as a structure, i.e.: | ||
| + | % se.Device = 'COM1'; | ||
| + | % se.BaudRate = 115200; | ||
| + | % se.DataBits = 8; | ||
| + | % se.StopBits = 1; | ||
| + | % se.Parity = 0; | ||
| + | % se.PTBPath = 'c:\MyToolboxes\PsychToolbox' | ||
| + | % | ||
| + | % to close the connection: | ||
| + | % serial_buttonbox('close',handle); | ||
| + | |||
| + | persistent old_hdl | ||
| + | |||
| + | % set defaults | ||
| + | se.Device = 'COM1'; | ||
| + | se.BaudRate = 115200; | ||
| + | se.DataBits = 8; | ||
| + | se.StopBits = 1; | ||
| + | se.Parity = 0; | ||
| + | se.PTBPath = 'c:\Pgrogram Files\PsychToolbox'; | ||
| + | |||
| + | if nargin < 1 | ||
| + | cmd = 'open'; | ||
| + | end | ||
| + | if nargin > 1 | ||
| + | % user overwrites default settings | ||
| + | flds = fields(varargin{1}); | ||
| + | for n = 1 : numel(flds) | ||
| + | se.(flds{n}) = varargin{1}.(flds{n}); | ||
| + | end | ||
| + | end | ||
| + | |||
| + | |||
| + | switch cmd | ||
| + | case 'open' | ||
| + | addpath(genpath(se.PTBPath)); | ||
| + | % get handle to serial device | ||
| + | handle = open_buttonbox(se.Device); | ||
| + | return | ||
| + | case 'close' | ||
| + | handle = varargin{1}; | ||
| + | IOPort('close',handle); | ||
| + | return | ||
| + | case 'run' | ||
| + | % read incoming data | ||
| + | if isempty(old_hdl) | ||
| + | help serial_buttonbox_common | ||
| + | error('Buttonbox not yet initialized'); | ||
| + | end | ||
| + | handle = old_hdl; | ||
| + | otherwise | ||
| + | fprintf('Unknown option %s\n',cmd); | ||
| + | return | ||
| + | end | ||
| + | |||
| + | % only gets here when cmd = 'run' | ||
| + | while 1 | ||
| + | % start polling for characters (indicating start of scan) | ||
| + | navailable = IOPort('BytesAvailable', handle); | ||
| + | if navailable | ||
| + | data = []; | ||
| + | while navailable | ||
| + | % read incoming data | ||
| + | [newdata, ~, err] = IOPort('Read', handle, 0, navailable); | ||
| + | if ~isempty(err), disp(err); end | ||
| + | data = [data newdata]; | ||
| + | %pause(0.001); % if possible just add a small pause to not claim entire core | ||
| + | navailable = IOPort('BytesAvailable', handle); | ||
| + | end | ||
| + | if numel(data)>1 | ||
| + | fprintf('\nReceived characters: %d\n',numel(data)); | ||
| + | end | ||
| + | for n = 1 : numel(data) | ||
| + | % disp(char(data(n))); | ||
| + | fprintf('incoming: %d\t%s\n',data(n),char(data(n))); | ||
| + | end | ||
| + | end | ||
| + | |||
| + | |||
| + | end %while 1 | ||
| + | |||
| + | function hdl = open_buttonbox(device) | ||
| + | % open handle to serial device (mini buttonbox) | ||
| + | try | ||
| + | hdl = IOPort('OpenSerialPort',device,['BaudRate=' num2str(se.BaudRate)]); | ||
| + | catch | ||
| + | if ~isempty(old_hdl) | ||
| + | IOPort('close',old_hdl); | ||
| + | end | ||
| + | hdl = IOPort('OpenSerialPort',device,['BaudRate=' num2str(se.BaudRate)]); | ||
| + | end | ||
| + | old_hdl = hdl; | ||
| + | |||
| + | fprintf('Wait for device buttonbox....\n'); | ||
| + | tic | ||
| + | while ~IOPort('BytesAvailable', hdl) && toc<10 | ||
| + | % wait for welcome message device | ||
| + | end | ||
| + | pause(0.5); | ||
| + | |||
| + | % clear buffer | ||
| + | %IOPort('flush', hdl); | ||
| + | IOPort('purge', hdl); | ||
| + | end | ||
| + | |||
| + | end</nowiki> | ||
== Inquisit Settings == | == Inquisit Settings == | ||
== E-Prime == | == E-Prime == | ||
Revision as of 09:28, 24 March 2014
General
Hardware
E-Prime "Serial Response Box"
Revisions
Revision 1
Revision 3
Revision 4
Presentation Settings
| File:Buttonbox1.png |
Psychopy Settings
#!/usr/bin/env python
from psychopy import core, visual, event from rusocsci import buttonbox import logging, time
##Setup Section
#logging.getLogger().setLevel(logging.DEBUG) # use this for debug info
win = visual.Window([400,300], monitor="testMonitor") bb = buttonbox.Buttonbox()
##Experiment Section
b = bb.waitButtons(maxWait = 10.0, buttonList=['A']) print("b: {}".format(b))
##Cleanup Section
core.quit() The following script lights the LEDs under the buttons pressed.
#!/usr/bin/env python
#from __future__ import print_function
import logging, time, sys from rusocsci import buttonbox
##Setup Section
led = [False]*8
##Experiment Section
bb = buttonbox.Buttonbox() while True:
buttons = bb.getButtons()
if len(buttons):
for c in buttons:
if ord(c) >= ord('a') and ord(c) < ord('a')+8:
led[ord(c) - ord('a')] = False
elif ord(c) >= ord('A') and ord(c) < ord('A')+8:
led[ord(c) - ord('A')] = True
bb.setLeds(led)
#print("buttons ({:3d}): {}{}".format(len(buttons), buttons, " "*50), end="\r")
#sys.stdout.flush()
Matlab Settings
===================================================================================================
function handle = serial_buttonbox_common(cmd,varargin)
% to initialize connection:
% handle = serial_buttonbox('open',se)
% settings (se):
% define settings as a structure, i.e.:
% se.Device = 'COM1';
% se.BaudRate = 115200;
% se.DataBits = 8;
% se.StopBits = 1;
% se.Parity = 0;
% se.PTBPath = 'c:\MyToolboxes\PsychToolbox'
%
% to close the connection:
% serial_buttonbox('close',handle);
persistent old_hdl
% set defaults
se.Device = 'COM1';
se.BaudRate = 115200;
se.DataBits = 8;
se.StopBits = 1;
se.Parity = 0;
se.PTBPath = 'c:\Pgrogram Files\PsychToolbox';
if nargin < 1
cmd = 'open';
end
if nargin > 1
% user overwrites default settings
flds = fields(varargin{1});
for n = 1 : numel(flds)
se.(flds{n}) = varargin{1}.(flds{n});
end
end
switch cmd
case 'open'
addpath(genpath(se.PTBPath));
% get handle to serial device
handle = open_buttonbox(se.Device);
return
case 'close'
handle = varargin{1};
IOPort('close',handle);
return
case 'run'
% read incoming data
if isempty(old_hdl)
help serial_buttonbox_common
error('Buttonbox not yet initialized');
end
handle = old_hdl;
otherwise
fprintf('Unknown option %s\n',cmd);
return
end
% only gets here when cmd = 'run'
while 1
% start polling for characters (indicating start of scan)
navailable = IOPort('BytesAvailable', handle);
if navailable
data = [];
while navailable
% read incoming data
[newdata, ~, err] = IOPort('Read', handle, 0, navailable);
if ~isempty(err), disp(err); end
data = [data newdata];
%pause(0.001); % if possible just add a small pause to not claim entire core
navailable = IOPort('BytesAvailable', handle);
end
if numel(data)>1
fprintf('\nReceived characters: %d\n',numel(data));
end
for n = 1 : numel(data)
% disp(char(data(n)));
fprintf('incoming: %d\t%s\n',data(n),char(data(n)));
end
end
end %while 1
function hdl = open_buttonbox(device)
% open handle to serial device (mini buttonbox)
try
hdl = IOPort('OpenSerialPort',device,['BaudRate=' num2str(se.BaudRate)]);
catch
if ~isempty(old_hdl)
IOPort('close',old_hdl);
end
hdl = IOPort('OpenSerialPort',device,['BaudRate=' num2str(se.BaudRate)]);
end
old_hdl = hdl;
fprintf('Wait for device buttonbox....\n');
tic
while ~IOPort('BytesAvailable', hdl) && toc<10
% wait for welcome message device
end
pause(0.5);
% clear buffer
%IOPort('flush', hdl);
IOPort('purge', hdl);
end
end