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> |