Changes
Jump to navigation
Jump to search
Line 411:
Line 411:
− +
− +
+
Line 426:
Line 427:
− +
− +
− +
Line 455:
Line 456:
− +
Line 463:
Line 464:
− +
− +
− +
− +
− +
− +
− +
− +
Line 478:
Line 479:
− +
− +
− +
− +
− +
− +
− cmd = 'open';+
− % user overwrites default settings+
− flds = fields(varargin{1});+
− for n = 1 : numel(flds)+
− se.(flds{n}) = varargin{1}.(flds{n});+
− end+
− 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+
− +
− % 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)+
− +
− fprintf('incoming: %d\t%s\n',data(n),char(data(n)));+
− end+
− end+
− +
− +
− 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
−
nowiki -> source
== Buttonbox in Python and PsychoPy ==
== Buttonbox in Python and PsychoPy ==
Example using the buttonbox in Python:
<nowiki>
Example using the buttonbox in Python:
<source lang="python>
#!/usr/bin/env python
#!/usr/bin/env python
# print the button pressed
# print the button pressed
print("b: {}".format(b))
print("b: {}".format(b))
</nowiki>
</source>
Using the Buttonbox in PsychoPy
Using the Buttonbox in PsychoPy:
<nowiki>
<source lang="python>
#!/usr/bin/env python
#!/usr/bin/env python
##Cleanup Section
##Cleanup Section
core.quit()
core.quit()
</source>
== Matlab Settings ==
== Matlab Settings ==
% 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:
% 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';
end
end
if nargin > 1
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
end
switch cmd
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
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)
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)));
% disp(char(data(n)));
fprintf('incoming: %d\t%s\n',data(n),char(data(n)));
end
end
end %while 1
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>
end</nowiki>