// Helperfunctie om indrukknoppen te debouncen.
// Goede uitleg te vinden op https://www.youtube.com/watch?v=v8KXa5uRavg
// Deze functie past de state van een button pas aan naar INGEDRUKT
// wanneer er een voldoende stabiel signaal is voor de duur van
// de vooraf ingestelde tijd.
// Set states voor debouncen van de knoppen
#define BTN_SETUP 0       // mogelijks dingen instellen
#define BTN_READ 1        // we lezen de waarde van de pinbutton
#define BTN_START_TIMER 2 // we starten een timer
#define BTN_WACHT 3       // bij slecht signaal (onstabiel) gaan we terug naar SETUP - 
// bij goed signaal (stabiel LOW voor de intervaltijd) gaan we naar INGEDRUKT
#define BTN_INGEDRUKT 4   // Zoalang signaal LOW blijft gebeurt er niets
// wordt het HIGH dan gaan we naar LOSGELATEN
#define BTN_LOSGELATEN 5  // We gaan terug naar SETUP
#define INTERVAL 10       // aantal millis nodig om de bounce weg te werken
#define PIN_LED 2
#define PIN_BUTTON 3
byte oldBtnState = 0;
typedef struct {
  byte State;
  byte pin;
  unsigned long timer;
  bool toggle;
} button;
// Maak een variable myButton van het type Button
// analoog: "byte pinNummer;" maak een variabele pinNummer van het type byte.
// Alleen is het type Button een beetje speciaal
button myButton  = {BTN_SETUP, PIN_BUTTON, 0, HIGH};
void setup() {
  Serial.begin(115200);
  pinMode(PIN_BUTTON, INPUT);
  pinMode(PIN_LED, OUTPUT);
  Serial.println("---- In setup -----------");
  Serial.print("ButtonState = ");
  Serial.println(myButton.State);
  Serial.print("ButtonPin = ");
  Serial.println(myButton.pin);
  Serial.print("ButtonTimer = ");
  Serial.println(myButton.timer);
  Serial.print("ButtonToggle = ");
  Serial.println(myButton.toggle);
  Serial.println("---- Uit setup -----------");
}
void loop() {
  // --------------------------------------
  // ACTIES AFHANKELIJK VAN STATE VD BUTTON
  // --------------------------------------
  if (myButton.State != oldBtnState) {
    Serial.print("button.state = ");
    Serial.println(myButton.State);
    if (myButton.State == BTN_INGEDRUKT) {
      Serial.println("ingedrukt");
      digitalWrite(PIN_LED,myButton.toggle);
    }
    if (myButton.State == BTN_LOSGELATEN) {
      Serial.println("Losgelaten");
    }
    oldBtnState = myButton.State;
  }
  // ------------------------------------------------------------------
  // STATE VD BUTTON AANPASSEN AAN DE ACTUELE TOESTAND of VOLGENS LOGICA
  // ------------------------------------------------------------------
  switch (myButton.State) {
    case BTN_SETUP: // 0
      myButton.State = BTN_READ;
      break;
    case BTN_READ:  // 1
      if (digitalRead(PIN_BUTTON) == LOW) {
        myButton.State = BTN_START_TIMER;
      }
      break;
    case BTN_START_TIMER:  // 2
      myButton.timer = millis();
      myButton.State = BTN_WACHT;
      break;
    case BTN_WACHT:  // 3
      if (digitalRead(PIN_BUTTON) == HIGH) {
        myButton.State = BTN_SETUP;
      }
      if (millis() - myButton.timer < INTERVAL) {
        myButton.State = BTN_INGEDRUKT;
      }
      break;
    case BTN_INGEDRUKT:  // 4
        if (digitalRead(PIN_BUTTON) == HIGH) {
        myButton.State = BTN_LOSGELATEN;
        myButton.toggle = !myButton.toggle;
        }
      break;
    case BTN_LOSGELATEN:  // 5
     myButton.State = BTN_SETUP;
      break;
    default:
      Serial.println(" button messd up, or coder");
  }
}