ButtonBox: Difference between revisions

Jump to navigation Jump to search
No edit summary
No edit summary
Line 339: Line 339:
%
%
% to run: (receiving incoming data, check code for own purposes)
% to run: (receiving incoming data, check code for own purposes)
% buttonbox('run',handle);
% buttonbox('run');
%
%
% or
% or
Line 353: Line 353:
%
%
% to close the connection:
% to close the connection:
% buttonbox('close',handle);
% buttonbox('close');  
 
persistent old_hdl  % keep handle to COM object persistent


persistent old_hdl  % keep handle to COM object persistent
% set defaults
% set defaults
bb.Device    = 'COM2';
bb.Device    = 'COM2';
Line 362: Line 361:
bb.DataBits  = 8;
bb.DataBits  = 8;
bb.StopBits  = 1;
bb.StopBits  = 1;
bb.Parity    = 'none';
bb.Parity    = 'none';  
 
if nargin < 1
if nargin < 1
   cmd = 'open';
   cmd = 'open';
Line 379: Line 377:
end
end


if ~any(strcmp(cmd,{'open','close'}))
  if isempty(old_hdl)
      help serial_buttonbox_common
      error('Buttonbox not yet initialized');
  end
  handle = old_hdl;
end


switch cmd
switch cmd
   case 'marker'
   case 'marker'
       if isempty(old_hdl)
       fwrite(handle, uint8(marker));%IOPort('Write', handle, uint8(marker), 1); % last argument: blocking
        help serial_buttonbox_common
       WaitSecs(0.002);
        error('Buttonbox not yet initialized');
       fwrite(handle, uint8(0));%IOPort('Write', handle, uint8(0), 0); % last argument: blocking
      end
      handle = old_hdl;
      ret = IOPort('Write', handle, uint8(marker), 1); % last argument: blocking
       java.lang.Thread.sleep(10);
       IOPort('Write', handle, uint8(0), 0); % last argument: blocking
      if ret < 1
        disp('Marker might not have been written to button box, please verify setup....?');
      end     
       return
       return
   case 'clear'
   case 'clear'
       if isempty(old_hdl)
       while(handle.BytesAvailable)
         help serial_buttonbox_common
         fread(handle, 1);
        error('Buttonbox not yet initialized');
       end    
       end
      handle = old_hdl;
      IOPort('purge', handle);
       ret = []; % meaningless
       ret = []; % meaningless
       return
       return
Line 409: Line 403:
       return
       return
   case 'close'
   case 'close'
       if nargin > 0
       if nargin > 1
         handle = varargin{1};
         handle = varargin{1};
       else
       else
Line 415: Line 409:
       end
       end
       fclose(handle);
       fclose(handle);
       ret = handle;
      delete(handle);
       ret = [];
       return
       return
   case 'run'
   case 'run'
       % read incoming data
       % read incoming data
      if isempty(old_hdl)
        help serial_buttonbox_common
        error('Buttonbox not yet initialized');
      end
      handle = old_hdl;
       % code proceeds below ....
       % code proceeds below ....
   case 'wait_keypress'
   case 'wait_keypress'
       % read incoming data
       % start polling for characters (indicating start of scan)
      if isempty(old_hdl)
      while(1)
        help serial_buttonbox_common
         data = [];
        error('Buttonbox not yet initialized');
        while handle.BytesAvailable
      end
            navailable = handle.BytesAvailable;
      handle = old_hdl;
             % read incoming data
      while 1
            [newdata, cnt] = fread(handle, navailable);
        % start polling for characters (indicating start of scan)
            % concatenate possible new data
         navailable = handle.BytesAvailable;
            if cnt
        if navailable
              data = [data newdata(:)];
            data = [];
             while navailable
              % read incoming data
              [newdata, cnt] = fread(handle, navailable);
              % concatenate possible new data
              if cnt
                  data = [data newdata(:)];
              end
              % check if any more data left
              navailable = handle.BytesAvailable;
             end
             end
        end
        if ~isempty(data)
             ret = data;
             ret = data;
             return
             return
         end
         end
       end %while 1
       end
   otherwise
   otherwise
       fprintf('Unknown option %s\n',cmd);
       fprintf('Unknown option %s\n',cmd);
       ret = [];
       ret = [];
       return
       return          
     
end  
     
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% only gets here when cmd = 'run' %
% only gets here when cmd = 'run' %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 
% Initialize output figure
% Initialize output figure
win = list_output(' ',[]);
win = list_output(' ',[]);
Line 491: Line 470:
   end
   end
   pause(0.01);
   pause(0.01);
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)     WaitSecs(0.002); % just to load mex-file into memory
       try
       try
         hdl = serial(device.Device, 'Baudrate', device.BaudRate, 'DataBits', device.DataBits, 'StopBits', device.StopBits, 'Parity', device.Parity);
         hdl = serial(device.Device, 'Baudrate', device.BaudRate, 'DataBits', device.DataBits, 'StopBits', device.StopBits, 'Parity', device.Parity);
Line 506: Line 487:
         fopen(hdl);
         fopen(hdl);
       end
       end
       old_hdl = hdl;
       old_hdl = hdl;    
     
       fprintf('Wait for device buttonbox....\n');
       fprintf('Wait for device buttonbox....\n');
       tic
       tic
Line 515: Line 495:
         fread(hdl, navailable);
         fread(hdl, navailable);
       end
       end
       pause(0.5);
       pause(0.5);    
     
   end  
      % while ~IOPort('BytesAvailable', hdl) && toc<10
      % % wait for welcome message device
      % end
      % pause(0.5);
     
      % clear buffer
      %IOPort('flush', hdl);
      IOPort('purge', hdl);
     
   end


   function win = list_output(line,win)
   function win = list_output(line,win)
Line 532: Line 502:
       persistent lines
       persistent lines
       persistent edt
       persistent edt
       Maxlines = 40;
       Maxlines = 40;    
     
       if isempty(win)
       if isempty(win)
         % initialize listbox output figure
         % initialize listbox output figure
Line 540: Line 509:
         ptr=Maxlines;
         ptr=Maxlines;
         lines(ptr) = {'Buttonbox output:'};
         lines(ptr) = {'Buttonbox output:'};
         idxs = mod(ptr:ptr+Maxlines-1,Maxlines)+1;
         idxs = mod(ptr:ptr+Maxlines-1,Maxlines)+1;        
       
         win = figure();
         win = figure();
         % initialize figure to hold output text
         % initialize figure to hold output text
Line 555: Line 523:
       set(edt,'String',lines(idxs),'Value',Maxlines);
       set(edt,'String',lines(idxs),'Value',Maxlines);
       drawnow;
       drawnow;
   end
   end  
 
end
end</syntaxhighlight>
end</syntaxhighlight>