ButtonBox: Difference between revisions

From TSG Doc
Jump to navigation Jump to search
No edit summary
No edit summary
Line 70: Line 70:


<nowiki>
<nowiki>
===================================================================================================
===================================================================================================
function handle = serial_buttonbox_common(cmd,varargin)
function handle = serial_buttonbox_common(cmd,varargin)
% to initialize connection:
% to initialize connection:
% handle = serial_buttonbox('open',se)
% handle = serial_buttonbox('open',se)
%    settings (se):
%    settings (se):
%      define settings as a structure, i.e.:
%      define settings as a structure, i.e.:
%      se.Device    = 'COM1';
%      se.Device    = 'COM1';
%      se.BaudRate  = 115200;
%      se.BaudRate  = 115200;
%      se.DataBits  = 8;
%      se.DataBits  = 8;
%      se.StopBits  = 1;
%      se.StopBits  = 1;
%      se.Parity    = 0;
%      se.Parity    = 0;
%      se.PTBPath  = 'c:\MyToolboxes\PsychToolbox'
%      se.PTBPath  = 'c:\MyToolboxes\PsychToolbox'
%
%
% to close the connection:
% to close the connection:
% serial_buttonbox('close',handle);
% serial_buttonbox('close',handle);
   
   
persistent old_hdl
persistent old_hdl
   
   
% set defaults
% set defaults
se.Device    = 'COM1';
se.Device    = 'COM1';
se.BaudRate  = 115200;
se.BaudRate  = 115200;
se.DataBits  = 8;
se.DataBits  = 8;
se.StopBits  = 1;
se.StopBits  = 1;
se.Parity    = 0;
se.Parity    = 0;
se.PTBPath  = 'c:\Pgrogram Files\PsychToolbox';
se.PTBPath  = 'c:\Pgrogram Files\PsychToolbox';
   
   
if nargin < 1
if nargin < 1
    cmd = 'open';
  cmd = 'open';
end
end
if nargin > 1
if nargin > 1
    % user overwrites default settings
  % user overwrites default settings
    flds = fields(varargin{1});
  flds = fields(varargin{1});
    for n = 1 : numel(flds)
  for n = 1 : numel(flds)
      se.(flds{n}) = varargin{1}.(flds{n});
      se.(flds{n}) = varargin{1}.(flds{n});
    end
  end
end
end
   
   
   
   
switch cmd
switch cmd
    case 'open'
  case 'open'
      addpath(genpath(se.PTBPath));
      addpath(genpath(se.PTBPath));
      % get handle to serial device
      % get handle to serial device
      handle = open_buttonbox(se.Device);
      handle = open_buttonbox(se.Device);
      return
      return
    case 'close'
  case 'close'
      handle = varargin{1};
      handle = varargin{1};
      IOPort('close',handle);
      IOPort('close',handle);
      return
      return
    case 'run'
  case 'run'
      % read incoming data
      % read incoming data
      if isempty(old_hdl)
      if isempty(old_hdl)
          help serial_buttonbox_common
        help serial_buttonbox_common
          error('Buttonbox not yet initialized');
        error('Buttonbox not yet initialized');
      end
      end
      handle = old_hdl;
      handle = old_hdl;
    otherwise
  otherwise
      fprintf('Unknown option %s\n',cmd);
      fprintf('Unknown option %s\n',cmd);
      return
      return
end
end
   
   
% only gets here when cmd = 'run'
% only gets here when cmd = 'run'
while 1   
while 1   
    % start polling for characters (indicating start of scan)
  % start polling for characters (indicating start of scan)
    navailable = IOPort('BytesAvailable', handle);
  navailable = IOPort('BytesAvailable', handle);
    if navailable
  if navailable
      data = [];
      data = [];
      while navailable
      while navailable
          % read incoming data
        % read incoming data
          [newdata, ~, err] = IOPort('Read', handle, 0, navailable);
        [newdata, ~, err] = IOPort('Read', handle, 0, navailable);
          if ~isempty(err), disp(err); end
        if ~isempty(err), disp(err); end
          data = [data newdata];
        data = [data newdata];
          %pause(0.001); % if possible just add a small pause to not claim entire core
        %pause(0.001); % if possible just add a small pause to not claim entire core
          navailable = IOPort('BytesAvailable', handle);
        navailable = IOPort('BytesAvailable', handle);
      end
      end
      if numel(data)>1
      if numel(data)>1
          fprintf('\nReceived characters: %d\n',numel(data));
        fprintf('\nReceived characters: %d\n',numel(data));
      end
      end
      for n = 1 : numel(data)
      for n = 1 : numel(data)
%        disp(char(data(n)));
%        disp(char(data(n)));
          fprintf('incoming: %d\t%s\n',data(n),char(data(n)));
        fprintf('incoming: %d\t%s\n',data(n),char(data(n)));
      end
      end
    end
  end
    
    
    
    
end %while 1
end %while 1
   
   
    function hdl = open_buttonbox(device)
  function hdl = open_buttonbox(device)
      % open handle to serial device (mini buttonbox)
      % open handle to serial device (mini buttonbox)
      try
      try
          hdl = IOPort('OpenSerialPort',device,['BaudRate=' num2str(se.BaudRate)]);
        hdl = IOPort('OpenSerialPort',device,['BaudRate=' num2str(se.BaudRate)]);
      catch
      catch
          if ~isempty(old_hdl)
        if ~isempty(old_hdl)
            IOPort('close',old_hdl);
            IOPort('close',old_hdl);
          end
        end
          hdl = IOPort('OpenSerialPort',device,['BaudRate=' num2str(se.BaudRate)]);
        hdl = IOPort('OpenSerialPort',device,['BaudRate=' num2str(se.BaudRate)]);
      end
      end
      old_hdl = hdl;
      old_hdl = hdl;
        
        
      fprintf('Wait for device buttonbox....\n');
      fprintf('Wait for device buttonbox....\n');
      tic
      tic
      while ~IOPort('BytesAvailable', hdl) && toc<10
      while ~IOPort('BytesAvailable', hdl) && toc<10
          % wait for welcome message device
        % wait for welcome message device
      end
      end
      pause(0.5);
      pause(0.5);
   
   
      % clear buffer
      % clear buffer
      %IOPort('flush', hdl);
      %IOPort('flush', hdl);
      IOPort('purge', hdl);
      IOPort('purge', hdl);
    end
  end
   
   
end
end
</nowiki>
</nowiki>



Revision as of 08: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

Inquisit Settings

E-Prime