Close GUI menu after discrete time period or user keystroke

13 ビュー (過去 30 日間)
Robert
Robert 2011 年 8 月 22 日
I'm making an n-back test using MATLAB 7.10.0, and I need to acquire either or both keystrokes 'A' and 'S' from the user within 2.5s. If 2.5s passes without any keystrokes pressed, then the program will set the response to 0.
Simple algorithm: 1) Ask user for data 2) Start timer, t = 0s 3) Acquire keystrokes from the user and store ASCII equivalent as answer. 4) End timer, t = 2.5s 5) If no keystrokes, then answer = 0.
I've looked online and through the Product Documentation, but nothing is coming up -- although I'm sure it's possible.
Thanks in advance.
EDIT: In the same vein, rather than keystrokes as the input, I'd actually like to use the menu function, with three buttons: 'A', 'S', and 'A+S'. But the problem is closing the menu after a discrete time period.
WHAT I REALLY NEED TO KNOW: 1) Time the input period 2) Acquire specific keystroke 3) Close the menu using code -- 'close' fn doesn't work with menu.

回答 (2 件)

Oleg Komarov
Oleg Komarov 2011 年 8 月 22 日
EDITED
% Create timer object that stops after 2.5 seconds
f = 'h = findobj(0,''Name'',''GETKEY''); if h; uiresume(h); end';
t = timer('StartDelay',2.5,'TasksToExecute',1,'TimerFcn',f);
% Accepted keys are 'A'or 'a' for rist position and 'S' or 's' for second position
keys = false(1,2);
vec = {'A' 'S'};
% Start timer
start(t)
% Run till timer executes
while strcmp(get(t,'Running'),'on')
% Acquire keystroke
key = getkey;
% Check if already pressed
keys = keys | strcmpi(key,vec);
% If both pressed before the timer stops exit the loop
if all(keys)
break
end
end
disp(keys)
Link to getkey. You may want to make it invisible.
  14 件のコメント
Robert
Robert 2011 年 8 月 23 日
Thank you, friend. That works great!
Oleg Komarov
Oleg Komarov 2011 年 8 月 23 日
If yout hink my answer solved your problem please accept it.

サインインしてコメントする。


Robert
Robert 2011 年 8 月 22 日
I solved the problem by making a function getkey2, which combines Oleg's suggestion, my code, and the getkey function. Here it is if anyone is interested.
function ch = getkey2(m)
if nargin == 1,
if strcmp(lower(m),'non-ascii'),
callstr = ['set(gcbf,''Userdata'',get(gcbf,''Currentkey'')) ; uiresume '] ;
else
error('Argument should be the string ''non-ascii''') ;
end
else
callstr = ['set(gcbf,''Userdata'',double(get(gcbf,''Currentcharacter''))) ; uiresume '] ;
end
% Set up the figure
% May be the position property should be individually tweaked to avoid visibility
fh = figure('keypressfcn',callstr, ...
'windowstyle','modal',...
'position',[0 0 1 1],...
'Name','GETKEY', ...
'userdata','timeout') ;
try
% Create timer object that stops after 2.5 seconds
t = timer('StartDelay',0.5,'TasksToExecute',1,'TimerFcn','stop(t)');
% Accepted keys are 'ASas' ASCII values [65 83 97 115]
keys = zeros(1,2);
% Start timer
start(t)
% Run till timer executes
vec = [65 83];
while strcmp(get(t,'Running'),'on')
ch = get(fh,'Userdata') ;
end
if isempty(ch),
ch = NaN ;
end
catch
% Something went wrong, return and empty matrix.
ch = [] ;
end
delete(fh) ;
  6 件のコメント
Oleg Komarov
Oleg Komarov 2011 年 8 月 22 日
Fixing one last thing, if you have typed both A and S it exits the loop and when the timer stops later it calls uiresume but at that point no getkey figure exists thus it creates and empty one.
Oleg Komarov
Oleg Komarov 2011 年 8 月 22 日
Ok now it should work properly.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeLoops and Conditional Statements についてさらに検索

製品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by