#include <blinker.h>
#include <autoPOT.h>
#include <mechButton.h>



//***********************************************
// Custom pwmBlinker class.
//***********************************************


class pwmBlinker : public blinker {

  public:
            pwmBlinker(int inPin);
    virtual ~pwmBlinker(void);

            void  setPWM(int inPWM);
    virtual void  pulseOn(void);
    virtual void  pulseOff(void);

  protected:
            int PWM;

};

pwmBlinker::pwmBlinker(int inPin)
  : blinker(inPin) { PWM = 125; }


pwmBlinker::~pwmBlinker(void) {  }


void pwmBlinker::setPWM(int inPWM) {

  if (inPWM<0) PWM = 0;
  else if (inPWM>255) PWM = 255;
  else PWM = inPWM;
  if (pulseHiLow()) pulseOn();
}


void pwmBlinker::pulseOn(void) { analogWrite(pin,PWM); }


void pwmBlinker::pulseOff(void) { analogWrite(pin,0); }

//***********************************************
// The program
//***********************************************

pwmBlinker  greenLED(3);
pwmBlinker  redLED(5);
pwmBlinker  yellowLED(6);
autoPOT     ourPOT(A0);
mechButton  ourBtn(13);

enum states {
  allLEDsOff,
  greenLEDOn,
  redLEDOn,
  yellowLEDOn,
  greenNRedFlash
};

states ourState;

void setup() {
  
  yellowLED.setPeriod(1);
  yellowLED.setPulse(1);
  ourState = allLEDsOff;
  ourPOT.setCallback(changePOT);
  ourBtn.setCallback(btnClick);
}


void changePOT(int value) {

  int mappedVal;

  mappedVal = map(value,0,1024,1,255);
  greenLED.setPWM(mappedVal);
  redLED.setPWM(mappedVal);
  yellowLED.setPWM(mappedVal);
}


void btnClick(void) {

  if (!ourBtn.getState()) {
    switch(ourState) {
      case allLEDsOff       :
        greenLED.setPeriod(1);
        greenLED.setPercent(100);
        greenLED.setOnOff(true);
        ourState = greenLEDOn;
      break;
      case greenLEDOn       :
        redLED.setPeriod(1);
        redLED.setPercent(100);
        redLED.setOnOff(true);
        ourState = redLEDOn;
      break;
      case redLEDOn         :
        yellowLED.setOnOff(true);
        ourState = yellowLEDOn;
      break;
      case yellowLEDOn      :
        greenLED.setPeriod(1500);
        greenLED.setPulse(500);
        redLED.setPeriod(1000);
        redLED.setPulse(750);
        ourState = greenNRedFlash;
      break;
      case greenNRedFlash   :
        greenLED.setOnOff(false);
        redLED.setOnOff(false);
        yellowLED.setOnOff(false);
        ourState = allLEDsOff;
      break;
    }
  }
}

void loop() { idle(); }