#include <timeObj.h>
#include <idlers.h>

//*********************************************
// timedCallback class. Give it a time, then
// give it a function to call. This'll call
// that function for you whenever the time
// expires.
//
//*********************************************


//****************
// The .h stuff..
//****************

class timedCallback : public timeObj,
                      public idler {

  public:
            timedCallback(float inMs=10,bool startNow=true);
    virtual ~timedCallback(void);

    virtual void  idle(void);
            void  setCallback(void(*funct)(void));

            void  (*callback)(void);
};



//****************
// The .cpp stuff..
//****************

timedCallback::timedCallback(float inMs,bool startNow)
  :  timeObj(inMs,startNow),
  idler() { callback = NULL; }


timedCallback::~timedCallback(void) {  }


void timedCallback::idle(void) {

  if (ding()) {
    if (callback) {
      callback();
    }
    stepTime();
  }
}


void timedCallback::setCallback(void(*funct)(void)) {

  callback = funct;
  hookup();
}



//*********************************************
// The Demo .ino
//*********************************************


timedCallback starter(3000);
int           callbackNum = 1;

void setup() {
  
  Serial.begin(115200);
  Serial.println("Setting up to call the callback & blink the LED.");
  pinMode(13,OUTPUT);
  starter.setCallback(activateMachine);
}

void activateMachine(void) {
  
  Serial.print("callback called #");
  Serial.println(callbackNum++);
}


void loop() { 
  
  idle();
  digitalWrite(13,HIGH);
  sleep(250);
  digitalWrite(13,LOW);
  sleep(750);
}