/*

 */

/* Create a WiFi access point and provide a web server on it. */

#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <ESP8266WebServer.h>

class Timer
{
  private:
    unsigned long timeZero = 0;
    unsigned long timeout = 0;
  public:
    Timer(){
      Reset();
      };
    void Reset(){
      timeZero = millis();
    };
    bool Timeout(){         // True ak skoncil cas
      return timeout <= millis();
      };
    unsigned long Stav(){
      return millis()-timeZero;
    };
    void SetTimeout (unsigned long time){
      timeout = millis() + time;
      };
};


/* Set these to your desired credentials. */
const char *ssid = "MajakAP";
const char *password = "";
String webPage = "";

int ledW = 0;
int ledR = 2;
const int led = LED_BUILTIN;
unsigned long time1;
unsigned long time2;
Timer timerImpulse;
Timer timerImpulseH;
Timer timerSignal;
Timer timerSignalH;
ESP8266WebServer server(80);
bool ie = false;
bool red = false;
unsigned int timeImpulse = 1000;
unsigned int timeImpulseH = 500;
unsigned int timeSignal = 10000;
unsigned int timeSignalH = 10000;

/* Just a little test message.  Go to http://192.168.4.1 in a web browser
 * connected to this access point to see it.
 */
void stav(){
  char temp[100];
  snprintf ( temp, 100,"%d;%d;%d;%d;%d",timeImpulse, timeImpulseH, timeSignal, timeSignalH,red);
  server.send ( 200, "text/html", temp );
}
void handleRoot() {
  digitalWrite ( led, 1 );
  if (ie){
  char temp[3000];
  int sec = millis() / 1000;
  int min = sec / 60;
  int hr = min / 60;

  snprintf ( temp, 3000,

"<html>\
  <head>\
    <title>Majak 2</title>\
    <style>\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
    <h1>Majak 2</h1>\
    <p><a href='red'><button>RED%d</button></a><a href='off'><button>Off</button></a></p>\
    <p>Perioda impulzu: <a href='m1000ti'><button>-1000</button></a>&nbsp;<a href='m100ti'><button>-100</button></a>&nbsp;<a href='m10ti'><button>-10</button></a>&nbsp;<a href='m1ti'><button>-1&nbsp;</button></a>&nbsp;\
     %5d <a href='p1000ti'><button>+1000</button></a>&nbsp;<a href='p100ti'><button>+100</button></a>&nbsp;<a href='p10ti'><button>+10</button></a>&nbsp;<a href='p1ti'><button>+1&nbsp;</button></a>&nbsp;</p>\
    <p>Sirka impulzu H: <a href='m1000tih'><button>-1000</button></a>&nbsp;<a href='m100tih'><button>-100</button></a>&nbsp;<a href='m10tih'><button>-10</button></a>&nbsp;<a href='m1tih'><button>-1&nbsp;</button></a>&nbsp;\
     %5d <a href='p1000tih'><button>+1000</button></a>&nbsp;<a href='p100tih'><button>+100</button></a>&nbsp;<a href='p10tih'><button>+10</button></a>&nbsp;<a href='p1tih'><button>+1&nbsp;</button></a>&nbsp;</p>\
     <p>Perioda signalu: <a href='m1000ts'><button>-1000</button></a>&nbsp;<a href='m100ts'><button>-100</button></a>&nbsp;<a href='m10ts'><button>-10</button></a>&nbsp;<a href='m1ts'><button>-1&nbsp;</button></a>&nbsp;\
     %5d <a href='p1000ts'><button>+1000</button></a>&nbsp;<a href='p100ts'><button>+100</button></a>&nbsp;<a href='p10ts'><button>+10</button></a>&nbsp;<a href='p1ts'><button>+1&nbsp;</button></a>&nbsp;</p>\
    <p>Sirka signalu H: <a href='m1000tsh'><button>-1000</button></a>&nbsp;<a href='m100tsh'><button>-100</button></a>&nbsp;<a href='m10tsh'><button>-10</button></a>&nbsp;<a href='m1tsh'><button>-1&nbsp;</button></a>&nbsp;\
     %5d <a href='p1000tsh'><button>+1000</button></a>&nbsp;<a href='p100tsh'><button>+100</button></a>&nbsp;<a href='p10tsh'><button>+10</button></a>&nbsp;<a href='p1tsh'><button>+1&nbsp;</button></a>&nbsp;</p>\
     <p><a href='s1'><button>S1-staly</button></a><a href='s2'><button>S2-F</button></a><a href='s3'><button>S3-quickF</button></a><a href='s4'><button>S4-verry quickF</button></a>\<p><a href='s5'><button>S5-interupted quickF</button></a><a href='s6'><button>S6-Isophase</button></a><a href='s7'><button>S7-Occulting</button></a><a href='s4'><button>S8-Alternating</button><p><a href='s9'><button>S9-Morzeovka</button></a><a href='s10'><button>S10-Long-Flashing</button></a></a>\
     </p>\
     <img src=\"/test.svg\" />\
  </body>\
</html>",

    red,timeImpulse, timeImpulseH, timeSignal, timeSignalH
  );
  server.send ( 200, "text/html", temp );
  }else{
    stav();
    }
  digitalWrite ( led, 0 );
}

void setup() {
  // preparing GPIOs
  pinMode(ledW, OUTPUT);
  digitalWrite(ledW, LOW);
  pinMode(ledR, OUTPUT);
  digitalWrite(ledR, LOW);
  pinMode ( led, OUTPUT );
  digitalWrite ( led, 0 );
  
	delay(1000);
	Serial.begin(115200);
	Serial.println();
	Serial.print("Configuring access point...");
	/* You can remove the password parameter if you want the AP to be open. */
	WiFi.softAP(ssid, password,7,0);

	IPAddress myIP = WiFi.softAPIP();
	Serial.print("AP IP address: ");
	Serial.println(myIP);
	server.on("/", handleRoot);
 server.on("/stav", stav);
// minus timeImpulse
 server.on("/m1000ti", [](){
    timeImpulse-=1000;
    handleRoot();
  });
 server.on("/m100ti", [](){
    timeImpulse-=100;
    handleRoot();
  });
 server.on("/m10ti", [](){
    timeImpulse-=10;
    handleRoot();
  });
 server.on("/m1ti", [](){
    timeImpulse-=1;
    handleRoot();
  });
  // plus timeImpulse
server.on("/p1000ti", [](){
    timeImpulse+=1000;
    handleRoot();
  });
server.on("/p100ti", [](){
    timeImpulse+=100;
    handleRoot();
  });
server.on("/p10ti", [](){
    timeImpulse+=10;
    handleRoot();
  });
server.on("/p1ti", [](){
    timeImpulse+=1;
    handleRoot();
  });
  //tih
// minus timeImpulseH
 server.on("/m1000tih", [](){
    timeImpulseH-=1000;
    handleRoot();
  });
 server.on("/m100tih", [](){
    timeImpulseH-=100;
    handleRoot();
  });
 server.on("/m10tih", [](){
    timeImpulseH-=10;
    handleRoot();
  });
 server.on("/m1tih", [](){
    timeImpulseH-=1;
    handleRoot();
  });
  // plus timeImpulse
server.on("/p1000tih", [](){
    timeImpulseH+=1000;
    handleRoot();
  });
server.on("/p100tih", [](){
    timeImpulseH+=100;
    handleRoot();
  });
server.on("/p10tih", [](){
    timeImpulseH+=10;
    handleRoot();
  });
server.on("/p1tih", [](){
    timeImpulseH+=1;
    handleRoot();
  });
// minus timeSignal
 server.on("/m1000ts", [](){
    timeSignal-=1000;
    handleRoot();
  });
 server.on("/m100ts", [](){
    timeSignal-=100;
    handleRoot();
  });
 server.on("/m10ts", [](){
    timeSignal-=10;
    handleRoot();
  });
 server.on("/m1ts", [](){
    timeSignal-=1;
    handleRoot();
  });
  // plus timeSignal
server.on("/p1000ts", [](){
    timeSignal+=1000;
    handleRoot();
  });
server.on("/p100ts", [](){
    timeSignal+=100;
    handleRoot();
  });
server.on("/p10ts", [](){
    timeSignal+=10;
    handleRoot();
  });
server.on("/p1ts", [](){
    timeSignal+=1;
    handleRoot();
  });
  //tih
// minus timeSignalH
 server.on("/m1000tsh", [](){
    timeSignalH-=1000;
    handleRoot();
  });
 server.on("/m100tsh", [](){
    timeSignalH-=100;
    handleRoot();
  });
 server.on("/m10tsh", [](){
    timeSignalH-=10;
    handleRoot();
  });
 server.on("/m1tsh", [](){
    timeSignalH-=1;
    handleRoot();
  });
  // plus timeSignalH
server.on("/p1000tsh", [](){
    timeSignalH+=1000;
    handleRoot();
  });
server.on("/p100tsh", [](){
    timeSignalH+=100;
    handleRoot();
  });
server.on("/p10tsh", [](){
    timeSignalH+=10;
    handleRoot();
  });
server.on("/p1tsh", [](){
    timeSignalH+=1;
    handleRoot();
  });
server.on("/red", [](){
    red = not red;
    handleRoot();
  });

server.on("/off", [](){
    timeSignalH=0;
    handleRoot();
  });  
server.on("/s1", [](){   //staly signal   
    timeImpulse = 1000;
    timeImpulseH = 1000;
    timeSignal = 10000;
    timeSignalH = 10000;
    red = false;
    handleRoot();
  });  
  server.on("/s2", [](){   //flashing frekvencia maximalne 0.5hz maximalne 30 krat/min 
    timeImpulse = 2200;
    timeImpulseH = 800;
    timeSignal = 10000;
    timeSignalH = 10000;
    red = false;
    handleRoot();
  });  
   server.on("/s3", [](){   //quick flashing min. 60 /min
    timeImpulse = 900;
    timeImpulseH = 300;
    timeSignal = 10000;
    timeSignalH = 10000;
    red = false;
    handleRoot();
  });
   server.on("/s4", [](){   //verry quick flashing frekvencia minimalne100 krat/min
    timeImpulse = 500;
    timeImpulseH = 160 ;
    timeSignal = 10000;
    timeSignalH = 10000;
    red = false;
    handleRoot();
  });    
    server.on("/s5", [](){   //Interrupted quick flashing 
    timeImpulse = 900;
    timeImpulseH = 300;
    timeSignal = 10000;
    timeSignalH = 7000;
    red = false;
    handleRoot();
  });  
    server.on("/s6", [](){   //isophase H=L
    timeImpulse = 2000;
    timeImpulseH =1000 ;
    timeSignal = 10000;
    timeSignalH = 10000;
    red = false;
    handleRoot();
  });  
    server.on("/s7", [](){   //occulting max 30/min. H>L
    timeImpulse = 2200;
    timeImpulseH =1400;
    timeSignal = 10000;
    timeSignalH = 10000;
    red = false;
    handleRoot();
  });
    server.on("/s8", [](){   //Alternating-blikanie dvoch farieb
    timeImpulse = 2000;
    timeImpulseH =1000;
    timeSignal = 10000;
    timeSignalH = 10000;
    red = true;
    handleRoot();
  });    
    server.on("/s9", [](){   //Morse S
    timeImpulse = 500;
    timeImpulseH =160 ;
    timeSignal = 10000;
    timeSignalH = 10000;
    red = false;
    handleRoot();
  });
     server.on("/s10", [](){   //
    timeImpulse = 500;
    timeImpulseH =160 ;
    timeSignal = 10000;
    timeSignalH = 10000;
    red = false;
    handleRoot();
  });
  
    
  
	server.begin();
	Serial.println("HTTP server started");
  timerImpulse.Reset();
  timerImpulseH.Reset();
  timerSignal.Reset();
  timerSignal.Reset();
}

void loop() {
  	server.handleClient();
    //digitalWrite(ledW, LOW);


 
 if (timerImpulse.Timeout()){
    if (timerSignal.Timeout()){
      timerSignal.SetTimeout(timeSignal);
      timerSignalH.SetTimeout(timeSignalH);
    }
    timerImpulse.SetTimeout(timeImpulse);
    timerImpulseH.SetTimeout(timeImpulseH);
    if (timerSignalH.Timeout()){
       digitalWrite(ledW, LOW);
       digitalWrite(ledR, LOW);  
    }else{
       digitalWrite(ledW, HIGH);
      if (red) {
        digitalWrite(ledR, LOW);
      };
    }
  }
  
 if (timerImpulseH.Timeout()){
  digitalWrite(ledW, LOW);
  if (red and not timerSignalH.Timeout()) {
    digitalWrite(ledR, HIGH);
    }else{
      digitalWrite(ledR, LOW);
 };
  
 }
 
}
