How to make a countdown timer in MATLAB GUIDE?

1.2k Views Asked by At

I'm trying to make a timer that counts down from 20 to 0 (seconds) in GUIDE. In the meantime the user will perform a simple action (clicking a radio button in a group button) and at the end of that 20 seconds a message will appear (depending on which button the user clicked). I looked around but it seems that there isn't a timer object for GUIDE (why don't they make one since it's so useful??). However I tried to make one and below there's the result, it doesn't work. I initialised setappdata in MyGUI_OpeningFcn:

% Initialize setappdata
timeout = 20;
setappdata(handles.figure1,'timeout', timeout);

Next_calculation is radio button and timerBox is a static text.

function Next_calculation_Callback(hObject, eventdata, handles)
[..]
timeout = getappdata(handles.figure1,'timeout');
t = timer('Period', 1.0,... % 1 second
          'StartFcn', set(handles.timerBox,'String',num2str(timeout)), ... 
          'ExecutionMode', 'fixedRate', ... % Starts immediately after the timer callback function is added to the MATLAB execution queue
          'TasksToExecute', timeout, ... % Indicates the number of times the timer object is to execute the TimerFcn callback
          'TimerFcn', @my_timer  ... % callback to function
         );
start(t)

Once the timer begins, it calls TimerFcn that calls my_timer. I should pass a handle to my_timer, but I don't know exactly how.

function my_timer(hObject, eventdata)
% I think I'm supposed to pass (hObject, eventdata) to my_timer

% handles should be getting the current figure from hObject
handles = guidata( ancestor(hObject, 'figure1') );

timeout = getappdata(handles.figure1,'timeout');
t_left = timeout - 1.0;
% show the updated time 
set(handles.timerBox,'String',num2str(t_left));
% update 'timeout'
setappdata(handles.figure1,'timeout',t_left)
1

There are 1 best solutions below

0
On BEST ANSWER

You need to use a custom anonymous function for the TimerFcn to pass the necessary data to your timer callback

set(t, 'TimerFcn', @(s,e)my_timer(hObject, handles))

You can then define your my_timer callback as

function my_timer(hObject, handles)
    % Do stuff with handles
end