/*
Nesa agregat 
uredjaji:
Kontakt on/off - za agregat
gornji ventil za gorivo on off
donji ventil za gorivo on off
servo motor sauh
kontaktor izlazni kad ima 220 sa agregata
start za anlaser

ulazi:
start prekidac
nivo gornjeg rezervoara on off
nivo donjeg rezervoara on off
napon akumulatora
napon agregata 220 detekcija

temperatura motora
temperatura ambijenta 
*/

/*
KAD DOBIJE JEDINICU NA START ULAZ POKRECE RAD AGREGATA

KAD IZGUBI JEDINICU NA START ULAZU POKRECE TAJMER ZA GASENJE AGREGATA (10min)
AKO U MEDJUVREMENU DOBIJE JEDINICU NA START ULAZ RESETUJE TAJMER ZA GASENJE I RADI DALJE

POSTUPAK PALENJA:
1.-PROVERAVA STANJE GORIVA U OBA REZERVOARA
 AKO IMA GORIVA IDE NA TACKU 2
 AKO NEMA GORIVA AKTIVIRA UPOZORENJE I ZAUSTAVLJA PROCEDURU PALENJA
2.-PROVERAVA NAPON AKUMULATORA
 AKO JE NAPON AKUMULATORA VECI OD 11.5V IDE NA TACKU 3
 AKO JE NAPON AKUMULATORA MANJI OD 11.5V AKTIVIRA UPOZORENJE I ZAUSTAVLJA PROCEDURU PALENJA
3.-UKLJUCUJE KONTAKT
4.-PROVERAVA TEMPERATURU MOTORA
5.-PROVERAVA TEMPERATURU AMBIJENTA
6.-PODESAVA COK PREMA TEMPERATURAMA (RAZRADITI PROCEDURU)
7.-OTVARA DONJI VENTIL
8.-POSTAVLJA VREME STARTOVANJA (t-START) NA 2 SEKUNDE
9.-STARTUJE ANLASER U TRAJANJU (t-START)
10.-PAUZIRA 2 SEKUNDE (OKVIRNO)
11.-PROVERAVA NAPON 220V
AKO IMA 220V:
 UKLJUCUJE SKLOPKU POSLE 10 SEKUNDI
 REGULISE COK PO ALGORITMU
 PRATI STANJE U DONJEM REZERVOARU I PO POTREBI GA DOPUNJUJE (OTVARA GORNJI VENTIL)
 AKO U RADU AGREGATA NESTANE GORIVO U GORNJEM REZERVOARU:
  PALI UPOZORENJE (GORIVO NA REZERVI)
  STARTUJE TAJMER REZERVE GORIVA (2 SATA)
  AKO SE DOPUNI GORIVO:
   GASI UPOZORENJE (GORIVO NA REZERVI)
   RESETUJE TAJMER REZERVE GORIVA
  AKO SE NE DOPUNI GORIVO U TOM ROKU:
   ZATVARA OBA VENTILA
   GASI KONTAKT
   GASI UPOZORENJE (GORIVO NA REZERVI)
   PALI UPOZORENJE (NEMA GORIVA)
   
AKO NEMA 220V:
 UVECAVA VREME STARTOVANJA (t-START) ZA 1 SEKUNDU
 AKO JE t-START MANJE OD 6 IDE NA TACKU 9
 AKO JE t-START VECE OD 5:
  ZATVARA OBA VENTILA
  GASI KONTAKT
  PALI UPOZORENJE (NEUSPELO PALENJE)

POSTUPAK GASENJA:
 ZATVARA OBA VENTILA
 GASI KONTAKT
 */
 //Varijabla za izbor koraka u case meniju

//ULAZI:
const int ISTART = 2;
const int INGR = 3;
const int INDR = 4;
const int INA = 5;
const int I220V = 6;
const float ITMOTOR = A0;
const float ITAMBIJENT = A1;

bool START;
bool NGR;
bool NDR;
bool NA;
bool V220;
float TMOTOR;
float TAMBIJENT;

//IZLAZI:
const int KONTAKT = 7;
const int GVG = 8;
const int DVG = 9;
const int SAUH = 10;
const int O220V = 11;
const int ANLASER = 12;

//Varijabla za case
byte state;


class Timer {
  private:
    unsigned long startTime;
    unsigned long duration;
    bool running;
    bool completed;

  public:
    Timer(unsigned long durationInSeconds) {
        duration = durationInSeconds * 1000; // Konverzija u milisekunde
        running = false;
        completed = false;
    }

    void start() {
        startTime = millis(); // Pocinje brojanje vremena
        running = true;
        completed = false;
    }

    void stop() {
        running = false; // Zaustavlja brojac
        completed = false;
    }

    void reset() {
        start(); // Ponovo pocinje brojanje
    }

    bool isRunning() {
        return running; // Vraca da li je brojac u radu
    }

    bool isCompleted() {
        if (running && (millis() - startTime >= duration)) {
            running = false; // Zavrsava brojanje ako je vreme isteklo
            completed = true;
        }
        return completed; // Vraca da li je brojanje zavrseno
    }

    unsigned long getRemainingTime() {
        if (running) {
            unsigned long elapsedTime = millis() - startTime;
            if (elapsedTime >= duration) {
                return 0; // Brojanje zavrseno
            } else {
                return (duration - elapsedTime) / 1000; // Vraca preostalo vreme u sekundama
            }
        } else {
            return duration / 1000; // Ako nije pokrenut, vraca celu dužinu trajanja
        }
    }
};

// Kreiranje razlicitih instanci timer-a sa razlicitim trajanjem
Timer timer1(20); // 20 sekundi
Timer timer2(30); // 30 sekundi
Timer timer3(20); // 20 sekundi
Timer timer4(30); // 30 sekundi
Timer timer5(20); // 20 sekundi
Timer timer6(30); // 30 sekundi

void setup() {

   Serial.begin(9600);
   Serial.println("1");
//SETOVANJE ULAZA SA INTEGRISANIM PULLUP OTPORINKOM
   pinMode(ISTART, INPUT_PULLUP);
   pinMode(INGR,   INPUT_PULLUP);
   pinMode(INDR,   INPUT_PULLUP);
   pinMode(INA,    INPUT_PULLUP);
   pinMode(I220V,  INPUT_PULLUP);

//SETOVANJE IZLAZA
   pinMode(KONTAKT, OUTPUT);
   pinMode(GVG, OUTPUT);
   pinMode(DVG, OUTPUT);
   pinMode(SAUH, OUTPUT);
   pinMode(O220V, OUTPUT);
   pinMode(ANLASER, OUTPUT); 
}

void loop() {

// Povezivanje ulaza sa varijablama u programu
START     = digitalRead(ISTART);
NGR       = digitalRead(INGR);
NDR       = digitalRead(INDR);
NA        = digitalRead(INA);
V220      = digitalRead(I220V);
TMOTOR    = digitalRead(ITMOTOR);
TAMBIJENT = digitalRead(ITAMBIJENT);


/*
if (START){
  state = 1;
  timer1.stop();
}
else{
  timer1.start();
} 
*/
  switch (state){    

    case 1:

    break;

    case 2:

    break;

    case 3:

    break;

    case 4:

    break;

    case 5:

    break;

    case 6:

    break;

    case 7:

    break;

    case 8:

    break;

    case 9:

    break;

    case 10:

    break;

    case 11:

    break;




  }

 if (Serial.available()) {
        char input = Serial.read();
        switch (input) {
            case 'a':
                timer1.start(); // Startuje timer1
                break;
            case 'b':
                timer2.start(); // Startuje timer2
                break;
            case 'x':
                timer1.stop(); // Zaustavlja timer1
                break;
            case 'y':
                timer2.stop(); // Zaustavlja timer2
                break;
            case 'r':
                timer1.reset(); // Resetuje timer1
                break;
            case 's':
                timer2.reset(); // Resetuje timer2
                break;
        }
    }

    if (timer1.isCompleted()) {
        Serial.println("Timer 1 is completed.");
    }

    if (timer2.isCompleted()) {
        Serial.println("Timer 2 is completed.");
    }
    // Ispisuje preostalo vreme na serijskom monitoru
    if (timer1.isRunning()) {
        Serial.print("Preostalo vreme za Timer 1: ");
        Serial.println(timer1.getRemainingTime());
    }
     Serial.println(timer1.getRemainingTime());
    delay(1000);
}