Difference between revisions of "ButtonBoxes"

From TSG Doc
Jump to navigation Jump to search
Line 68: Line 68:
  
 
== Matlab Settings ==
 
== Matlab Settings ==
<div><br/></div><div><div>&nbsp;===================================================================================================</div><div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;"><span style="color: rgb(4, 51, 255);">&nbsp;function</span>&nbsp;handle = serial_buttonbox_common(cmd,varargin)</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">&nbsp;% to initialize connection:</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">&nbsp;% handle = serial_buttonbox('open',se)</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">&nbsp;%&nbsp; &nbsp; settings (se):</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">&nbsp;% &nbsp; &nbsp; &nbsp; define settings as a structure, i.e.:</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">&nbsp;% &nbsp; &nbsp; &nbsp; se.Device&nbsp; &nbsp; = 'COM1';</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">&nbsp;% &nbsp; &nbsp; &nbsp; se.BaudRate&nbsp; = 115200;</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">&nbsp;% &nbsp; &nbsp; &nbsp; se.DataBits&nbsp; = 8;</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">&nbsp;% &nbsp; &nbsp; &nbsp; se.StopBits&nbsp; = 1;</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">&nbsp;% &nbsp; &nbsp; &nbsp; se.Parity&nbsp; &nbsp; = 0;</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">&nbsp;% &nbsp; &nbsp; &nbsp; se.PTBPath &nbsp; = 'c:\MyToolboxes\PsychToolbox'</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">&nbsp;%</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">&nbsp;% to close the connection:</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">&nbsp;% serial_buttonbox('close',handle);</div>
 
&nbsp;<br/>
 
<div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(4, 51, 255);">&nbsp;persistent<span style="color: rgb(0, 0, 0);">&nbsp;old_hdl</span></div>
 
&nbsp;<br/>
 
<div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">&nbsp;% set defaults</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;se.Device&nbsp; &nbsp; =&nbsp;<span style="color: rgb(178, 69, 243);">'COM1'</span>;</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;se.BaudRate&nbsp; = 115200;</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;se.DataBits&nbsp; = 8;</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;se.StopBits&nbsp; = 1;</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;se.Parity&nbsp; &nbsp; = 0;</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(178, 69, 243);"><span style="color: rgb(0, 0, 0);">&nbsp;se.PTBPath &nbsp; =&nbsp;</span>'c:\Pgrogram Files\PsychToolbox'<span style="color: rgb(0, 0, 0);">;</span></div>
 
&nbsp;<br/>
 
<div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;"><span style="color: rgb(4, 51, 255);">&nbsp;if</span>&nbsp;nargin < 1</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp;&nbsp;cmd =&nbsp;<span style="color: rgb(178, 69, 243);">'open'</span>;</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(4, 51, 255);">&nbsp;end</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;"><span style="color: rgb(4, 51, 255);">&nbsp;if</span>&nbsp;nargin > 1</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);"><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span>% user overwrites default settings</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp;&nbsp;flds = fields(varargin{1});</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">for</span>&nbsp;n = 1 : numel(flds)</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;se.(flds{n}) = varargin{1}.(flds{n});</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">end</span></div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(4, 51, 255);">&nbsp;end</div>
 
&nbsp;<br/>
 
  
&nbsp;<br/>
+
<nowiki>
<div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(4, 51, 255);">&nbsp;switch<span style="color: rgb(0, 0, 0);">&nbsp;cmd</span></div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(178, 69, 243);"><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(4, 51, 255);">case</span><span style="color: rgb(0, 0, 0);">&nbsp;</span>'open'</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;addpath(genpath(se.PTBPath));</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);"><span style="color: rgb(0, 0, 0);">&nbsp; &nbsp; &nbsp;&nbsp;</span>% get handle to serial device</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;handle = open_buttonbox(se.Device);</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">return</span></div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(178, 69, 243);"><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(4, 51, 255);">case</span><span style="color: rgb(0, 0, 0);">&nbsp;</span>'close'</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;handle = varargin{1};</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;IOPort(<span style="color: rgb(178, 69, 243);">'close'</span>,handle);</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">return</span></div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(178, 69, 243);"><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(4, 51, 255);">case</span><span style="color: rgb(0, 0, 0);">&nbsp;</span>'run'</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);"><span style="color: rgb(0, 0, 0);">&nbsp; &nbsp; &nbsp;&nbsp;</span>% read incoming data</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">if</span>&nbsp;isempty(old_hdl)</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(178, 69, 243);"><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;help&nbsp;</span>serial_buttonbox_common</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(178, 69, 243);"><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;error(</span>'Buttonbox not yet initialized'<span style="color: rgb(0, 0, 0);">);</span></div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">end</span></div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;handle = old_hdl;</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(4, 51, 255);"><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span>otherwise</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(178, 69, 243);"><span style="color: rgb(0, 0, 0);">&nbsp; &nbsp; &nbsp;&nbsp;fprintf(</span>'Unknown option %s\n'<span style="color: rgb(0, 0, 0);">,cmd);</span></div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">return</span></div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(4, 51, 255);">&nbsp;end</div>
+
===================================================================================================
&nbsp;<br/>
+
function handle = serial_buttonbox_common(cmd,varargin)
<div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">&nbsp;% only gets here when cmd = 'run'</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(4, 51, 255);">&nbsp;while<span style="color: rgb(0, 0, 0);">&nbsp;1&nbsp;&nbsp;</span></div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);"><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span>% start polling for characters (indicating start of scan)</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp;&nbsp;navailable = IOPort(<span style="color: rgb(178, 69, 243);">'BytesAvailable'</span>, handle);</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">if</span>&nbsp;navailable</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;data = [];</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">while</span>&nbsp;navailable</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);"><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span>% read incoming data</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;[newdata, ~, err] = IOPort(<span style="color: rgb(178, 69, 243);">'Read'</span>, handle, 0, navailable);</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">if</span>&nbsp;~isempty(err), disp(err);&nbsp;<span style="color: rgb(4, 51, 255);">end</span></div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;data = [data newdata];</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);"><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span>%pause(0.001); % if possible just add a small pause to not claim entire core</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;navailable = IOPort(<span style="color: rgb(178, 69, 243);">'BytesAvailable'</span>, handle);</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">end</span></div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">if</span>&nbsp;numel(data)>1</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;fprintf(<span style="color: rgb(178, 69, 243);">'\nReceived characters: %d\n'</span>,numel(data));</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">end</span></div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">for</span>&nbsp;n = 1 : numel(data)</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);">%&nbsp; &nbsp; &nbsp; &nbsp; disp(char(data(n)));</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;fprintf(<span style="color: rgb(178, 69, 243);">'incoming: %d\t%s\n'</span>,data(n),char(data(n)));</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">end</span></div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">end</span></div>
+
% to initialize connection:
&nbsp; &nbsp;<br/>
+
% handle = serial_buttonbox('open',se)
 
+
%    settings (se):
&nbsp; &nbsp;<br/>
+
%      define settings as a structure, i.e.:
<div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);"><span style="color: rgb(4, 51, 255);">&nbsp;end</span><span style="color: rgb(0, 0, 0);">&nbsp;</span>%while 1</div>
+
%      se.Device    = 'COM1';
&nbsp;<br/>
+
%      se.BaudRate  = 115200;
<div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">function</span>&nbsp;hdl = open_buttonbox(device)</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);"><span style="color: rgb(0, 0, 0);">&nbsp; &nbsp; &nbsp;&nbsp;</span>% open handle to serial device (mini buttonbox)</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">try</span></div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;hdl = IOPort(<span style="color: rgb(178, 69, 243);">'OpenSerialPort'</span>,device,[<span style="color: rgb(178, 69, 243);">'BaudRate='</span>&nbsp;num2str(se.BaudRate)]);</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">catch</span></div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">if</span>&nbsp;~isempty(old_hdl)</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;IOPort(<span style="color: rgb(178, 69, 243);">'close'</span>,old_hdl);</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">end</span></div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;hdl = IOPort(<span style="color: rgb(178, 69, 243);">'OpenSerialPort'</span>,device,[<span style="color: rgb(178, 69, 243);">'BaudRate='</span>&nbsp;num2str(se.BaudRate)]);</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">end</span></div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;old_hdl = hdl;</div>
+
%      se.DataBits  = 8;
&nbsp;&nbsp; &nbsp; &nbsp;<br/>
+
%      se.StopBits  = 1;
<div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(178, 69, 243);"><span style="color: rgb(0, 0, 0);">&nbsp; &nbsp; &nbsp;&nbsp;fprintf(</span>'Wait for device buttonbox....\n'<span style="color: rgb(0, 0, 0);">);</span></div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;tic</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">while</span>&nbsp;~IOPort(<span style="color: rgb(178, 69, 243);">'BytesAvailable'</span>, hdl) && toc<10</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);"><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span>% wait for welcome message device</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">end</span></div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;pause(0.5);</div>
+
%      se.Parity    = 0;
&nbsp;<br/>
+
%      se.PTBPath  = 'c:\MyToolboxes\PsychToolbox'
<div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);"><span style="color: rgb(0, 0, 0);">&nbsp; &nbsp; &nbsp;&nbsp;</span>% clear buffer</div><div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(37, 153, 45);"><span style="color: rgb(0, 0, 0);">&nbsp; &nbsp; &nbsp;&nbsp;</span>%IOPort('flush', hdl);</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp; &nbsp; &nbsp;&nbsp;IOPort(<span style="color: rgb(178, 69, 243);">'purge'</span>, hdl);</div><div style="color: rgb(0, 0, 0); margin: 0px; font-size: 9px; font-family: Courier;">&nbsp;&nbsp;&nbsp;<span style="color: rgb(4, 51, 255);">end</span></div>
+
%
&nbsp;<br/>
+
% to close the connection:
<div style="margin: 0px; font-size: 9px; font-family: Courier; color: rgb(4, 51, 255);">&nbsp;end</div></div></div><div><br/></div>
+
% 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:22, 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