Difference between revisions of "ButtonBoxes"

From TSG Doc
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 10: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

Inquisit Settings

E-Prime