Difference between revisions of "ButtonBoxes"
| Line 70: | Line 70: | ||
<nowiki> | <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> | </nowiki> | ||
Revision as of 09:23, 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