/**************************************************************************************************
*
*  PulseCountAsync
*
*   Version:      1.0.0 - September 2009
*   Author:       Etienne Ribeiro    / tutorial assistant caad      /  eribeiro[at]ethz.ch
*   Supervisor:   Christoph Wartmann / chair for caad - ETH Zürich  /  wartmann[at].arch.ethz.ch
*
*   Desc:         Counts pulses on a digital pin over a given period asynchronously.
*
*   Functions:    int PulseCounstAsync (int digitalPin, int delayIntervall)
*                    The function need to be called constantly in loop and returns a value, when
*                    delayIntervall time is over.
*                    int digitalPin: pin to listen to.
*                    int delayIntervall: intervall in ms to listen.
*                    returns -1 if no new value is available or the pulse.
*
***************************************************************************************************/



// var
long modPulse_millisStart = -2;
boolean modPulse_lastState = false;
int modPulse_HzCounter = 0;




int PulseCounstAsync (int digitalPin, int delayIntervall) {

        // Pinmode (only at first call of this function)
        if (modPulse_millisStart == -2) {
                pinMode(digitalPin, INPUT);
                modPulse_millisStart = -1;
        }


        // Start
        if (modPulse_millisStart > millis ())
        modPulse_millisStart = -1;
        if (modPulse_millisStart == -1)
        modPulse_millisStart = millis ();


        // Count Hz Intervall
        int val = digitalRead (digitalPin);
        if (val == HIGH && modPulse_lastState == false) {
                modPulse_lastState = true;
                modPulse_HzCounter += 1;
        }
        if (val == LOW && modPulse_lastState == true)
        modPulse_lastState = false;


        // Return ?
        if (modPulse_millisStart + delayIntervall < millis()) {

                // Reset Values
                int tmpmodPulse_HzCounter = modPulse_HzCounter;
                modPulse_HzCounter = 0;
                modPulse_millisStart = -1;


                // Calculate Hz
                int Hz = tmpmodPulse_HzCounter * (1000 / delayIntervall);


                // ret
                return Hz;

        } else
        return -1;

}