#include <mechButton.h>
#include <neoPixel.h>
#include <squareWave.h>

// ********** trigger class **********


class trigger : public mechButton {

  public:
          trigger(int btnPin,int inLEDNum);
          ~trigger(void);

          void  begin(neoPixel* inTheLEDs);
          void  tripSwitch(void);
          void  resetSwitch(void);
  virtual void  takeAction(void);

          bool      tripped;
          neoPixel* theLEDs;
          int       LEDNum;
};



trigger::trigger(int btnPin,int inLEDNum)
  :mechButton(btnPin) { 
  
  theLEDs = NULL;
  LEDNum = inLEDNum;
  tripped = false;
}


trigger::~trigger(void) {  }


void trigger::begin(neoPixel* inTheLEDs) {

  theLEDs = inTheLEDs;
  theLEDs->setPixelColor(LEDNum,&green);
  theLEDs->show();
  hookup();
}


void trigger::tripSwitch(void) {

  theLEDs->setPixelColor(LEDNum,&red);
  theLEDs->show();
  tripped = true;
}


void trigger::resetSwitch(void) {
  
  theLEDs->setPixelColor(LEDNum,&green);
  theLEDs->show();
  tripped = false;
}


void trigger::takeAction(void) { if (!getState()) tripSwitch(); }



// ********** alarm class **********

class alarm : public squareWave {

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

    virtual void    pulseOn(void);
    virtual void    pulseOff(void);

            int     pin;
};


alarm::alarm(int inPin)
  :squareWave(1000,500) { pin = inPin; }

alarm::~alarm(void) { }


void alarm::pulseOn(void) { tone(pin,500); }


void alarm::pulseOff(void){ noTone(pin); }


// ********** The main sketch **********

trigger     button[5] {{2,0},{3,1},{4,2},{5,3},{6,4}};
mechButton  clearButton(12);
neoPixel    theLEDs(5,7);
alarm       theAlarm(9);

void setup() {

  theLEDs.begin();
  for (int i=0;i<5;i++) button[i].begin(&theLEDs);
}

void loop() {
  
  int count;

  idle();
  if (!clearButton.getState()) {
    for (int i=0;i<5;i++) button[i].resetSwitch();
    theAlarm.setOnOff(false);
  }
  count = 0;
  if (!theAlarm.running()) {
    for (int i=0;i<5;i++) {
      if (button[i].tripped) count++;
    }
    if (count==5) theAlarm.setOnOff(true);
  }
}