/*
Scrivere un programma che realizzi una teiera automatica tale che:
- si accenda premendo il pulsante A, alla cui pressione si mette a blinkare il led S di stato dell'acqua che così indica che la temperatura ancora non è quella giusta.
- Una pressione del pulsante A mentre il led S blinka non ha alcun effetto.
- l'acqua è a temperatura quando, dopo 10 secondi, il led S non blinka più ma è a luminosità fissa
- premere il pulsante A con il led S è fisso mette in azione la erogazione del te da un ugello, segnalata da un led E acceso
- l'erogazione termina dopo 3 secondi, passati i quali il led E si spegne.
- una pressione prolungata del pulsante A (più di 3 secondi) spegne la teiera disattivando tutti i led.
*/
#include "urutils.h"
int led_E=13;
int led_A=12;
int pulsante1=14;
int state;
DiffTimer t1, t2;

enum Stati{
  SPENTO,
  RISCALDAMENTO,
  BOLLITURA,
  EROGAZIONE
};

void blink(int led) {
  digitalWrite(led, !digitalRead(led));
}

void setup(){
  pinMode(pulsante1, INPUT);
  pinMode(led_E, OUTPUT);
  pinMode(led_A, OUTPUT);
  Serial.begin(115200);
  state = SPENTO; // inizialmente l'acqua è fredda
  t2.stop();
}

void loop(){
  if(state == SPENTO){
    Serial.println("SPENTO");
    if(digitalRead(pulsante1)==HIGH){
      waitUntilInputLow(pulsante1, 50); //fronte di discesa
      state = RISCALDAMENTO;
      Serial.println("RISCALDAMENTO");
      t1.start();
      t1.reset();
      t2.start();
      t2.reset();
    }
  }else if(state == RISCALDAMENTO){
    // eseguo il blink del led A
    if(t1.get() < 10000){
      if (t2.get() > 1000) { // polling timer blink
        t2.reset(); // riarmo timer blink
        Serial.println("blink");
        blink(led_A);
      }
    }else{
      t1.stop();
      t2.stop();
      digitalWrite(led_A, HIGH);
      state = BOLLITURA;
      Serial.println("BOLLITURA");
    }
  }else if(state == BOLLITURA){
    if(digitalRead(pulsante1)==HIGH){
      t1.start();
      t1.reset();
      waitUntilInputLow(pulsante1, 50); //fronte di discesa
      if(t1.get() > 3000){
        // spegnimento
        digitalWrite(led_E, LOW);
        digitalWrite(led_A, LOW);
        state = SPENTO;
        Serial.println("SPENTO");
      }else{
        t1.stop();
        state = EROGAZIONE;
        Serial.println("EROGAZIONE");
        t2.start();
        t2.reset();
      }
    }
  }else if(state == EROGAZIONE){
    if(t2.get() < 3000){
      digitalWrite(led_E, HIGH);
    }else{
      t2.stop();
      digitalWrite(led_E, LOW);
      state = BOLLITURA;
      Serial.println("BOLLITURA");
    }
  }
  delay(10);
}
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
led1:A
led1:C
led2:A
led2:C
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2