Clear Filters
Clear Filters

How to put a timeout to ginput.

8 views (last 30 days)
Akshat
Akshat on 24 Jun 2024
Edited: Akshat on 27 Jun 2024 at 12:45
I want to show user a figure, and ask them to click somewhere within a stipulated time limit, like 2 seconds.
I am using ginput as follows, but it seems to be pausing the execution before a button is pressed. I went to check in the ginput function and indeed it was using waitforbuttonpress. I tried some hands in getting a workaround but wasn't much succesfull to interrup ginput (specifically it's wfbp function).
I am attaching a sample code what i need.
I am okay in getting to know some work-arounds, even if they don't use ginput, but i'd still love to know what exactly could ba a solution if I were to use ginput.
Thanks in advanced
x = linspace(0,4*pi,2000);
y=sin(x);
plot(x,y);
timeout=2;
tic;
[xt,yt]=ginput(1);
if toc>2
xt=NaN;
yt=NaN;
end

Accepted Answer

Sudarsanan A K
Sudarsanan A K on 25 Jun 2024
Hi Akshat,
I understand that your goal is to show a figure and ask the user to click somewhere within a stipulated time limit (e.g., 2 seconds). The following approach would enable you achieve this:
  1. Plot the Figure: Plot the figure you wish to show the customer.
  2. Initialize Coordinates: Initialize "xt" and "yt" to "NaN".
  3. Create Click Flag: Create a flag "clicked" to check if the user has clicked.
  4. Create Timer: Create a timer object "t" with a "StartDelay" of "timeout" seconds. Set the "TimerFcn" to "uiresume(gcbf)", which resumes the figure's execution when the timer elapses.
  5. Start Timer: Start the timer with "start(t)".
  6. Set Mouse Click Callback: Set the "WindowButtonDownFcn" to "mouseClickFcn", which sets the "clicked" flag to "true" and resumes the figure's execution when the user clicks.
  7. Wait for User Input or Timeout: Use the "uiwait(gcf, timeout)" function to wait for the figure to be resumed by either the timer or the mouse click.
  8. Clean Up Timer: Stop and delete the timer object with "stop(t)" and "delete(t)".
  9. Check Click Flag: Check if the "clicked" flag is "true" to determine if the user clicked within the timeout period.
  10. Display Coordinates: Print the clicked coordinates to the console.
Here is an example:
timed_example();
function timed_example()
x = linspace(0, 4*pi, 2000);
y = sin(x);
plot(x, y);
timeout = 2;
[xt, yt] = deal(NaN); % Initialize the coordinates
% Create a flag to check if the user has clicked
clicked = false;
% Create a timer object to interrupt the execution after the timeout
t = timer('StartDelay', timeout, 'TimerFcn', @(~,~) uiresume(gcbf));
start(t);
% Set the WindowButtonDownFcn to capture the click and resume the figure
set(gcf, 'WindowButtonDownFcn', @mouseClickFcn);
% Wait for the figure to be resumed by either the timer or the mouse click
uiwait(gcf, timeout);
% Clean up the timer object
stop(t);
delete(t);
% Display the clicked coordinates if clicked within the timeout
if clicked
fprintf('Clicked coordinates: (%f, %f)\n', xt, yt);
else
fprintf('No click detected within the timeout period.\n');
end
function mouseClickFcn(~, ~)
% Capture the coordinates of the click
coords = get(gca, 'CurrentPoint');
xt = coords(1, 1);
yt = coords(1, 2);
clicked = true;
uiresume(gcbf);
end
end
The following resources are useful for further explorations:
I hope this helps!
  1 Comment
Akshat
Akshat on 27 Jun 2024 at 12:44
Edited: Akshat on 27 Jun 2024 at 12:45
It worked, though i was looking for a one line solution like ginput only, this will do for now I guess. thanks.

Sign in to comment.

More Answers (0)

Categories

Find more on Graphics Object Programming in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!