ButtonBox: Difference between revisions

Jump to navigation Jump to search
No edit summary
No edit summary
Line 328: Line 328:


<syntaxhighlight lang="matlab" line style="height:50em; overflow:auto;">
<syntaxhighlight lang="matlab" line style="height:50em; overflow:auto;">
function handle = buttonbox(cmd,varargin)
function ret = buttonbox(cmd,varargin)
% to initialize connection:
% to initialize connection: (omit 2nd argument if defaults apply)
%    define settings as structure with fields:
%    define settings as structure with fields:
%      bb.Device    = 'COM2';
%      bb.Device    = 'COM2';
Line 338: Line 338:
% handle = buttonbox('open',bb)
% handle = buttonbox('open',bb)
%
%
% to run:
% to run: (receiving incoming data, check code for own purposes)
% buttonbox('run',handle);
% buttonbox('run',handle);
%
% or
%
% to send a marker: (marker: a numeric value)
% buttonbox(marker)
%
% or
%
% to wait for a buttonpress:
% key = buttonbox('wait_keypress')
%
%
% to close the connection:
% to close the connection:
Line 354: Line 364:


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)
        bb.(flds{n}) = varargin{1}.(flds{n});
      bb.(flds{n}) = varargin{1}.(flds{n});
    end
  end
end
if nargin==1 && isnumeric(cmd)
  marker = cmd;
  cmd = 'marker';
end
end




switch cmd
switch cmd
    case 'open'
  case 'marker'
        % get handle to serial device
      if isempty(old_hdl)
        handle = open_buttonbox(bb);
        help serial_buttonbox_common
        return
        error('Buttonbox not yet initialized');
    case 'close'
      end
        if nargin > 0
      handle = old_hdl;
            handle = varargin{1};
      ret = IOPort('Write', handle, uint8(marker), 1); % last argument: blocking
        else
      java.lang.Thread.sleep(10);
            handle = old_hdl;
      IOPort('Write', handle, uint8(0), 0); % last argument: blocking
        end
      if ret < 1
        fclose(handle);
        disp('Marker might not have been written to button box, please verify setup....?');
        return
      end     
    case 'run'
      return
        % read incoming data
  case 'open'
        if isempty(old_hdl)
      % get handle to serial device
            help serial_buttonbox_common
      handle = open_buttonbox(bb);
            error('Buttonbox not yet initialized');
      ret = handle;
        end
      return
        handle = old_hdl;
  case 'close'
    otherwise
      if nargin > 0
        fprintf('Unknown option %s\n',cmd);
        handle = varargin{1};
        return
      else
        handle = old_hdl;
      end
      fclose(handle);
      ret = handle;
      return
  case 'run'
      % read incoming data
      if isempty(old_hdl)
        help serial_buttonbox_common
        error('Buttonbox not yet initialized');
      end
      handle = old_hdl;
      % code proceeds below ....
  case 'wait_keypress'
      % read incoming data
      if isempty(old_hdl)
        help serial_buttonbox_common
        error('Buttonbox not yet initialized');
      end
      handle = old_hdl;
      while 1
        % start polling for characters (indicating start of scan)
        navailable = handle.BytesAvailable;
        if navailable
            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
            ret = data;
            return
        end
      end %while 1
  otherwise
      fprintf('Unknown option %s\n',cmd);
      ret = [];
      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(' ',[]);
while 1
while 1
    % Exit if user closed output figure
  % Exit if user closed output figure
    if ~ishandle(win)
  if ~ishandle(win)
        return
      return
    end
  end
    % start polling for characters (indicating start of scan)
  % start polling for characters (indicating start of scan)
    navailable = handle.BytesAvailable;
  navailable = handle.BytesAvailable;
    if navailable
  if navailable
        data = [];
      data = [];
        while navailable
      while navailable
            % read incoming data
        % read incoming data
            [newdata, cnt] = fread(handle, navailable);
        [newdata, cnt] = fread(handle, navailable);
            % concatenate possible new data  
        % concatenate possible new data
            if cnt
        if cnt
                data = [data newdata(:)];
            data = [data newdata(:)];
            end
        end
            % check if any more data left
        % check if any more data left
            navailable = handle.BytesAvailable;
        navailable = handle.BytesAvailable;
        end
      end
        % output info about which button was pressed  
      % output info about which button was pressed
        for n = 1 : numel(data)
      for n = 1 : numel(data)
            line = sprintf('incoming: %03d  %s',data(n),char(data(n)));
        line = sprintf('incoming: %03d  %s',data(n),char(data(n)));
            list_output(line,win);
        list_output(line,win);
        end
      end
    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)
        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);
            fopen(hdl);
        fopen(hdl);
        catch
      catch
            if ~isempty(old_hdl)
        if ~isempty(old_hdl)
                fclose(old_hdl);
            fclose(old_hdl);
                delete(old_hdl);
            delete(old_hdl);
            end
        end
            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);
            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
        while hdl.BytesAvailable && toc<10
      while hdl.BytesAvailable && toc<10
            navailable = bbox.BytesAvailable;
        navailable = bbox.BytesAvailable;
            % wait for welcome message device
        % wait for welcome message device
            fread(hdl, navailable);
        fread(hdl, navailable);
        end
      end
        pause(0.5);
      pause(0.5);
    end
     
 
      % while ~IOPort('BytesAvailable', hdl) && toc<10
    function win = list_output(line,win)
      % % wait for welcome message device
        persistent ptr
      % end
        persistent lines
      % pause(0.5);
        persistent edt
     
        Maxlines = 40;  
      % clear buffer
       
      %IOPort('flush', hdl);
        if isempty(win)
      IOPort('purge', hdl);
            % initialize listbox output figure
     
            lines = cell(1,Maxlines);
  end
            [lines(1:end)]=deal({''});
            ptr=Maxlines;
            lines(ptr) = {'Buttonbox output:'};
            idxs = mod(ptr:ptr+Maxlines-1,Maxlines)+1;


            win = figure();
  function win = list_output(line,win)
            % initialize figure to hold output text
      persistent ptr
            edt = uicontrol('Parent',win,'Style','ListBox','HorizontalAlignment','left', ...
      persistent lines
      persistent edt
      Maxlines = 40;
     
      if isempty(win)
        % initialize listbox output figure
        lines = cell(1,Maxlines);
        [lines(1:end)]=deal({''});
        ptr=Maxlines;
        lines(ptr) = {'Buttonbox output:'};
        idxs = mod(ptr:ptr+Maxlines-1,Maxlines)+1;
       
        win = figure();
        % initialize figure to hold output text
        edt = uicontrol('Parent',win,'Style','ListBox','HorizontalAlignment','left', ...
             'Max',Maxlines,'BackgroundColor',[1 1 1],'Visible','on','String',lines(idxs), ...
             'Max',Maxlines,'BackgroundColor',[1 1 1],'Visible','on','String',lines(idxs), ...
             'FontSize',12,'Value',Maxlines);
             'FontSize',12,'Value',Maxlines);
            pos = get(win,'Position');
        pos = get(win,'Position');
            set(edt,'Position',[1 1 pos(3) pos(4)]);
        set(edt,'Position',[1 1 pos(3) pos(4)]);
        end
      end
        ptr = mod(ptr,Maxlines)+1; % start  
      ptr = mod(ptr,Maxlines)+1; % start
        lines{ptr} = line;
      lines{ptr} = line;
        idxs = mod(ptr:ptr+Maxlines-1,Maxlines)+1;
      idxs = mod(ptr:ptr+Maxlines-1,Maxlines)+1;
        set(edt,'String',lines(idxs),'Value',Maxlines);
      set(edt,'String',lines(idxs),'Value',Maxlines);
        drawnow;  
      drawnow;
    end
  end
 
end</syntaxhighlight>
end
</syntaxhighlight>