Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

To resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

return value from timer callback function

Asked by go9kata on 19 Sep 2013

I want to update a matrix on each call of the timer function in a timer object. I read in the news group that the return variable should be assigned in the base MatLab workspace. So even after that I get a strange result. Here is the code:

% define constants
total_time = 12;
swap_count = 3;
swap_period = floor(total_time/swap_count);
% assign output variable from callback function
assignin('base','X','AB');
% crete a timer object and set properties
t_obj = timer;
set(t_obj, 'StartDelay', swap_period);
set(t_obj, 'Period', swap_period);
set(t_obj, 'TasksToExecute', swap_count);
set(t_obj, 'ExecutionMode', 'fixedRate');
set(t_obj, 'UserData', 'X');
set(t_obj, 'StartFcn',{@swap_fcn, X});
set(t_obj, 'TimerFcn',{@swap_fcn, X});
set(t_obj, 'StopFcn',{@swap_fcn, X});
% start timer loop
start(t_obj);
pause(total_time+1);
stop(t_obj);
delete(t_obj);
% callback function
function [X] = swap_fcn(obj, event, X)
      % event properties
      event_type = event.Type;
      event_time = datestr(event.Data.time,'HH:MM:SS, dd mmm YYYY');
      % get times executed
      exec_count = get(obj, 'TasksExecuted');
      % write step and write to file
      switch event_type
          case 'StartFcn'
              fprintf('start experiment: %s\n',event_time);
              disp(X);
          case 'TimerFcn'
              fprintf('swap%02d: %s\n',exec_count, event_time);
              X = fliplr(X);
              disp(X);
          case 'StopFcn'
              fprintf('stop experiment: %s\n',event_time);
              disp(X);
      end
end

so after running that i got the following result

start experiment: 13:53:18, 19 Sep 2013
AB
swap01: 13:53:22, 19 Sep 2013
BA
swap02: 13:53:26, 19 Sep 2013
BA
swap03: 13:53:30, 19 Sep 2013
BA
stop experiment: 13:53:30, 19 Sep 2013
AB

I would expect something like that:

start experiment: 13:53:18, 19 Sep 2013
AB
swap01: 13:53:22, 19 Sep 2013
BA
swap02: 13:53:26, 19 Sep 2013
AB
swap03: 13:53:30, 19 Sep 2013
BA
stop experiment: 13:53:30, 19 Sep 2013
BA

It seems like I never return the updated version of X in the next TimerFcn call.

0 Comments

go9kata

Products

No products are associated with this question.

1 Answer

Answer by go9kata on 19 Sep 2013
Accepted answer

I found the answer, one should use the timer object UserData property to handle input output in timer: here is the change in the code:

% define constants
total_time = 12;
swap_count = 3;
swap_period = floor(total_time/swap_count);
% assign output variable from callback function
X = 'AB';
% crete a timer object and set properties
t_obj = timer;
set(t_obj, 'StartDelay', swap_period);
set(t_obj, 'Period', swap_period);
set(t_obj, 'TasksToExecute', swap_count);
set(t_obj, 'ExecutionMode', 'fixedRate');
set(t_obj, 'UserData', X);
set(t_obj, 'StartFcn',{@swap_fcn});
set(t_obj, 'TimerFcn',{@swap_fcn});
set(t_obj, 'StopFcn',{@swap_fcn});
% start timer loop
start(t_obj);
pause(total_time+1);
stop(t_obj);
delete(t_obj);
% callback function
function [X] = swap_fcn(obj, event)
      % event properties
      event_type = event.Type;
      event_time = datestr(event.Data.time,'HH:MM:SS, dd mmm YYYY');
      % get times executed
      exec_count = get(obj, 'TasksExecuted');
% get current user data
X = get(obj, 'UserData');
        % write step and write to file
        switch event_type
            case 'StartFcn'
                fprintf('start experiment: %s\n',event_time);
                disp(X);
            case 'TimerFcn'
                fprintf('swap%02d: %s\n',exec_count, event_time);
                X = fliplr(X);
                disp(X);
            case 'StopFcn'
                fprintf('stop experiment: %s\n',event_time);
                disp(X);
        end
% update any changes
set(obj,'UserData',X);
end

0 Comments

go9kata

Contact us