#include <mechButton.h>
#include <timeObj.h>

mechButton  btnA(2);
int         varA;
// Button A: Needs to count up a variable each time it's pressed.


mechButton  btnB(3);
int         varB;
timeObj     btnBTimer(3000,false);
// Button B: Needs to count up a variable each time it's pressed and
// count the same variable down if it's held for more than 3 seconds.
// (Only one increment/decrement per press)


#define START_PERIOD_MS 2000
#define DELTA_PERIOD_MS 100
#define MIN_PERIOD_MS   200

mechButton  btnC(4);
int         varC;
bool        btnCDn;
float       periodC;
timeObj     btnCTimer(START_PERIOD_MS,false);
// Button C: Counts a variable up while it's held. Starts slowly and
// then gets faster the longer it's held.


#define LED_D_PIN   7

mechButton  btnD(5);
bool        ledDState;
// Button D: Toggle LED. Press button: LED on. Press again: LED off.
// Press again: LED on and so on.


#define DBL_CLIK_MS   250

mechButton  btnE(6);
int         varE;
bool        timingE;
timeObj     btnETimer(DBL_CLIK_MS,false);
// Button E: Counts variable up if it's pressed. Counts variable down
// if it's pressed quickly twice.


void setup() {
  
  Serial.begin(115200);
  
  varA = 0;
  btnA.setCallback(btnAClk);
  
  varB = 0;
  btnB.setCallback(btnBClk);

  varC = 0;
  btnCDn = false;
  periodC = START_PERIOD_MS;
  btnC.setCallback(btnCClk);
  
  ledDState = false;
  pinMode(LED_D_PIN,OUTPUT);
  digitalWrite(LED_D_PIN,false);
  btnD.setCallback(btnDClk);

  varE = 0;
  timingE = false;
  btnE.setCallback(btnEClk);
}


void btnAClk(void) {
  if (!btnA.getState()) {
    varA++;
    Serial.print("varA :");
    Serial.println(varA);
  }
}


void btnBClk(void) {
  
  if (!btnB.getState()) {
    btnBTimer.start();
  } else {
    if (btnBTimer.ding()) {
      varB--;
    } else {
      varB++;
    }
    btnBTimer.reset();
    Serial.print("\tvarB :");
    Serial.println(varB);
  }
}


void btnCClk(void) {

  if (!btnC.getState()) {
    btnCTimer.start();
    btnCDn = true;
  } else {
    btnCTimer.reset();
    btnCDn = false;
    periodC = START_PERIOD_MS;
    varC = 0;
  }
}


void btnDClk(void) {
  
  if (!btnD.getState()) {
    ledDState = !ledDState;
    digitalWrite(LED_D_PIN,ledDState);
  }
}


void btnEClk(void) {

  if (!btnE.getState()) {
    if (timingE) {
      varE--;
      btnETimer.reset();
      timingE = false;
      showVarE();
    } else {
      btnETimer.start();
      timingE = true;
    }
  }
}


void showVarE(void) {

  Serial.print("\t\t\tvarE :");
  Serial.println(varE);
}


void loop() {

  idle();
  if (btnCDn) {
    if (btnCTimer.ding()) {
      varC++;
      Serial.print("\t\tvarC :");
      Serial.println(varC);
      periodC = periodC - DELTA_PERIOD_MS;
      if (periodC<MIN_PERIOD_MS) {
        periodC = MIN_PERIOD_MS;
      }
      btnCTimer.setTime(periodC,true);
    }
  }
  if (timingE) {
    if (btnETimer.ding()) {
      varE++;
      btnETimer.reset();
      timingE = false;
      showVarE();
    }
  }
}