Subversion Repositories Applications.papyrus

Rev

Blame | Last modification | View Log | RSS feed

if(!dojo._hasResource["dojox.timing.Streamer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dojox.timing.Streamer"] = true;
dojo.provide("dojox.timing.Streamer");

dojo.require("dojox.timing._base");

dojox.timing.Streamer = function(
        /* function */input, 
        /* function */output, 
        /* int */interval, 
        /* int */minimum,
        /* array */initialData
){
        //      summary
        //      Streamer will take an input function that pushes N datapoints into a
        //              queue, and will pass the next point in that queue out to an
        //              output function at the passed interval; this way you can emulate
        //              a constant buffered stream of data.
        //      input: the function executed when the internal queue reaches minimumSize
        //      output: the function executed on internal tick
        //      interval: the interval in ms at which the output function is fired.
        //      minimum: the minimum number of elements in the internal queue.

        var self = this;
        var queue = [];

        //      public properties
        this.interval = interval || 1000;
        this.minimumSize = minimum || 10;       //      latency usually == interval * minimumSize
        this.inputFunction = input || function(q){ };
        this.outputFunction = output || function(point){ };

        //      more setup
        var timer = new dojox.timing.Timer(this.interval);
        var tick = function(){
                self.onTick(self);

                if(queue.length < self.minimumSize){
                        self.inputFunction(queue);
                }

                var obj = queue.shift();
                while(typeof(obj) == "undefined" && queue.length > 0){
                        obj = queue.shift();
                }
                
                //      check to see if the input function needs to be fired
                //      stop before firing the output function
                //      TODO: relegate this to the output function?
                if(typeof(obj) == "undefined"){
                        self.stop();
                        return;
                }

                //      call the output function.
                self.outputFunction(obj);
        };

        this.setInterval = function(/* int */ms){
                //      summary
                //      sets the interval in milliseconds of the internal timer
                this.interval = ms;
                timer.setInterval(ms);
        };

        this.onTick = function(/* dojox.timing.Streamer */obj){ };
        // wrap the timer functions so that we can connect to them if needed.
        this.start = function(){
                //      summary
                //      starts the Streamer
                if(typeof(this.inputFunction) == "function" && typeof(this.outputFunction) == "function"){
                        timer.start();
                        return;
                }
                throw new Error("You cannot start a Streamer without an input and an output function.");
        };
        this.onStart = function(){ };
        this.stop = function(){
                //      summary
                //      stops the Streamer
                timer.stop();
        };
        this.onStop = function(){ };

        //      finish initialization
        timer.onTick = this.tick;
        timer.onStart = this.onStart;
        timer.onStop = this.onStop;
        if(initialData){
                queue.concat(initialData);
        }
};

}