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

New to MATLAB?

return value from timer callback function

Asked by go9kata

go9kata

on 19 Sep 2013
Accepted Answer by go9kata

go9kata

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

go9kata

Products

No products are associated with this question.

1 Answer

Answer by go9kata

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

go9kata

Contact us