Mercurial > hg > ishara
diff sched/msched.m @ 0:672052bd81f8
Initial partial import.
author | samer |
---|---|
date | Wed, 19 Dec 2012 22:38:28 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sched/msched.m Wed Dec 19 22:38:28 2012 +0000 @@ -0,0 +1,62 @@ +function Timer=msched(e0) +% msched - Schedule events where each event returns the next event. +% +% msched :: +% cell { +% double ~'time of event', +% event ~'first event action' +% } +% -> action timer ~'timer being used'. +% +% event ::= +% ( double ~'scheduled time', +% double ~'actual time' +% -> action ( +% event ~'the next event action', +% double ~'time for next action', +% double ~'execution time of current event' +% ) +% ). + +% this is most like a Routine or Task in Supercollider, except +% that instead of coroutining via yield, each action explicitly +% returns the continuation action. + + persistent ERROR + + ERROR=[]; + warning('off','MATLAB:TIMER:STARTDELAYPRECISION'); + + [t0,a0]=cdeal(e0); + + Timer=timer; + set(Timer,'TimerFcn',@(o,e)timercb(o,e,t0,a0),'StopFcn',@chain); + set(Timer,'StartDelay',max(0,t0-nows)); % there will be some small error here.. + start(Timer); + + function timercb(o,e,t,a) + [a1,t1,tt]=a(t,e.Data.time); + set(o,'UserData',{a1,t1}); + ERROR=vertcat(ERROR,tt-t); + end + + function chain(o,e) + [a1,t1]=cdeal(get(o,'UserData')); + correction=mean(ERROR); + while ~isempty(t1) + tnow=nows; + delay=t1-correction-tnow; + if delay>=0, + set(o,'TimerFcn',@(oo,ee)timercb(oo,ee,t1,a1)); + set(o,'StartDelay',delay); + start(o); + return; + end + [a1,t1,tt]=a1(t1,tnow); + end + + fprintf('\n| stopping\n'); + set(o,'UserData',ERROR); + timer_release(o); + end +end