#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //Indirizzo fisico della scheda Ethernet
byte ip[] = { 192,168,1, 89 }; //indirizzo IP della scheda Ethernet
EthernetServer server(80); //Porta 80 per il traffico in  HTML
String query;
byte i;

//*******************************QUI VALORI CHE POSSONO ESSERE CAMBIATI DALL'UTENTE (ENTRO QUESTI ASTERISCHI)*****************

String TITOLO = "COMANDO REMOTO ETHERNET By Fabio";
String RGB = "255, 204, 255"; //Colore di sfondo combinazione dei tre colori RGB
byte PinUtenza1 = 2; //Pin per le utenze
byte PinUtenza2 = 3;
byte PinUtenza3 = 4;
byte PinUtenza4 = 5;
byte PinUtenza5 = 6;
byte PinUtenza6 = 7;
byte PinUtenza7 = 8;
byte PinUtenza8 = 9;
byte PinUtenza9 = 48;
byte PinUtenza10 = 49;
byte PinUtenza11 = 47;
byte PinUtenza12 = 46;
byte PinUtenza13 = 45;
byte PinUtenza14 = 44;
byte PinUtenza15 = 43;
byte PinUtenza16 = 42;
byte PinUtenza17 = 41;
byte PinUtenza18 = 40;
byte PinUtenza19 = 39;
byte PinUtenza20 = 38;

String U1 = "Utenza 01"; //Nomi per le utenze
String U2 = "Utenza 02";
String U3 = "Utenza 03";
String U4 = "Utenza 04";
String U5 = "Utenza 05";
String U6 = "Utenza 06";
String U7 = "Utenza 07";
String U8 = "Utenza 08";
String U9 = "Utenza 09";
String U10 = "Utenza 10";
String U11 = "Utenza 11";
String U12 = "Utenza 12";
String U13 = "Utenza 13";
String U14 = "Utenza 14";
String U15 = "Utenza 15";
String U16 = "Utenza 16";
String U17 = "Utenza 17";
String U18 = "Utenza 18";
String U19 = "Utenza 19";
String U20 = "Utenza 20";

//******************************************************************************

String colore1 = "white";
String colore2 = "white";
String colore3 = "white";
String colore4 = "white";
String colore5 = "white";
String colore6 = "white";
String colore7 = "white";
String colore8 = "white";
String colore9 = "white";
String colore10 = "white";
String colore11 = "white";
String colore12 = "white";
String colore13 = "white";
String colore14 = "white";
String colore15 = "white";
String colore16 = "white";
String colore17 = "white";
String colore18 = "white";
String colore19 = "white";
String colore20 = "white";

void setup()
{
  query = String("");
  Ethernet.begin(mac, ip); //Inizializzazione Ethernet
  server.begin(); //Il server (Scheda Ethernet Arduino)si mette in ascolto 
  pinMode(PinUtenza1,OUTPUT);
  pinMode(PinUtenza2,OUTPUT);
  pinMode(PinUtenza3,OUTPUT);
  pinMode(PinUtenza4,OUTPUT);
  pinMode(PinUtenza5,OUTPUT);
  pinMode(PinUtenza6,OUTPUT);
  pinMode(PinUtenza7,OUTPUT);
  pinMode(PinUtenza8,OUTPUT);
  pinMode(PinUtenza9,OUTPUT);
  pinMode(PinUtenza10,OUTPUT);
  pinMode(PinUtenza11,OUTPUT);
  pinMode(PinUtenza12,OUTPUT);
  pinMode(PinUtenza13,OUTPUT);
  pinMode(PinUtenza14,OUTPUT);
  pinMode(PinUtenza15,OUTPUT);
  pinMode(PinUtenza16,OUTPUT);
  pinMode(PinUtenza17,OUTPUT);
  pinMode(PinUtenza18,OUTPUT);
  pinMode(PinUtenza19,OUTPUT);
  pinMode(PinUtenza20,OUTPUT);
}
void loop()
{
  EthernetClient client = server.available(); //server.available()restituisce "vero" se il client (browser sul nostro computer) invia messaggi, se no "falso" 
  if (client) // Se è arrivato una richesta (GET / HTTP/1.1 GET /favicon.ico HTTP/1.1)dal client l'IF esegue il suo corpo, se no torna a void loop.
  {
    while (client.connected()) //Il client rimane connesso fino a quando non è stato spedito l'ultimo carattere
    {
      if (client.available()) //client.available restituisce il numero di byte da leggere (se no da 0);
      {
        char c = client.read(); //Legge un byte alla volta
        query.concat(c); //lo concatena in query
     if (c == '\n') // Fintanto non legge il carattere /n seguita la lettura.
     {
       client.println("HTTP/1.1 200 OK"); //Se è stato letto il carattere /n, il server (Ethernet Arduino) risponde con le seguenti tre istruzioni.
       client.println("Content-Type: text/html");
       client.println();
       //Il programma salta alla riga 381 se nessun tasto è stato premuto o se c'è stata richiesta iniziale da parte del browser
//***********************************************           
       //Da qui seguenza di lettura dei tasti con toggle del pin e  cambio del colore del tasto
       if (query.indexOf("utenza1") > 0) 
       {if(colore1 == "white"
          )
          {
            digitalWrite(PinUtenza1,HIGH);
            colore1 = "red";
          }
          else
          {
            digitalWrite(PinUtenza1,LOW);
            colore1 = "white";
          }
       }
       if (query.indexOf("utenza2") > 0) 
       {
          if(colore2 == "white")
          {
             digitalWrite(PinUtenza2,HIGH);
             colore2 = "red";
          }
          else
          {
             digitalWrite(PinUtenza2,LOW);
             colore2 = "white";       
          }
        }     
        if (query.indexOf("utenza3") > 0) 
        {
          if(colore3 == "white")
          {
            digitalWrite(PinUtenza3,HIGH);
            colore3 = "red";
          }
          else
          {
            digitalWrite(PinUtenza3,LOW);
            colore3 = "white";       
          }
        } 
        if (query.indexOf("utenza4") > 0) 
       {
          if(colore4 == "white")
          {
            digitalWrite(PinUtenza4,HIGH);
            colore4 = "red";
          }
          else
          {
            digitalWrite(PinUtenza4,LOW);
            colore4 = "white";
          }
       }    
       if (query.indexOf("utenza5") > 0) 
       {
          if(colore5 == "white")
          {
            digitalWrite(PinUtenza5,HIGH);
            colore5 = "red";
          }
          else
          {
            digitalWrite(PinUtenza5,LOW);
            colore5 = "white";
          }
       } 
       if (query.indexOf("utenza6") > 0) 
       {
          if(colore6 == "white")
          {
            digitalWrite(PinUtenza6,HIGH);
            colore6 = "red";
          }
          else
          {
            digitalWrite(PinUtenza6,LOW);
            colore6 = "white";
          }
       }
       if (query.indexOf("utenza7") > 0) 
       {
          if(colore7 == "white")
          {
            digitalWrite(PinUtenza7,HIGH);
            colore7 = "red";
          }
          else
          {
            digitalWrite(PinUtenza7,LOW);
            colore7 = "white";
          }
       }
       if (query.indexOf("utenza8") > 0) 
       {
          if(colore8 == "white")
          {
            digitalWrite(PinUtenza8,HIGH);
            colore8 = "red";
          }
          else
          {
            digitalWrite(PinUtenza8,LOW);
            colore8 = "white";
          }
       }
       if (query.indexOf("utenza9") > 0) 
       {
          if(colore9 == "white")
          {
            digitalWrite(PinUtenza9,HIGH);
            colore9 = "red";
          }
          else
          {
            digitalWrite(PinUtenza9,LOW);
            colore9 = "white";
          }
       }
       if (query.indexOf("10utenza") > 0) 
       {
          if(colore10 == "white")
          {
            digitalWrite(PinUtenza10,HIGH);
            colore10 = "red";
          }
          else
          {
            digitalWrite(PinUtenza10,LOW);
            colore10 = "white";
          }
       }
       if (query.indexOf("11utenza") > 0) 
       {
          if(colore11 == "white")
          {
            digitalWrite(PinUtenza11,HIGH);
            colore11 = "red";
          }
          else
          {
            digitalWrite(PinUtenza11,LOW);
            colore11 = "white";
          }
       }
       if (query.indexOf("12utenza") > 0) 
       {
          if(colore12 == "white")
          {
            digitalWrite(PinUtenza12,HIGH);
            colore12 = "red";
          }
          else
          {
            digitalWrite(PinUtenza12,LOW);
            colore12 = "white";       
          }
        }     
        if (query.indexOf("13utenza") > 0) 
        {
          if(colore13 == "white")
          {
            digitalWrite(PinUtenza13,HIGH);
            colore13 = "red";
          }
          else
          {
            digitalWrite(PinUtenza13,LOW);
            colore13 = "white";       
          }
        } 
        if (query.indexOf("14utenza") > 0) 
       {
          if(colore14 == "white")
          {
            digitalWrite(PinUtenza14,HIGH);
            colore14 = "red";
          }
          else
          {
            digitalWrite(PinUtenza14,LOW);
            colore14 = "white";
          }
       }    
       if (query.indexOf("15utenza") > 0) 
       {
          if(colore15 == "white")
          {
            digitalWrite(PinUtenza15,HIGH);
            colore15 = "red";
          }
          else
          {
            digitalWrite(PinUtenza15,LOW);
            colore15 = "white";
          }
       } 
       if (query.indexOf("16utenza") > 0) 
       {
          if(colore16 == "white")
          {
            digitalWrite(PinUtenza16,HIGH);
            colore16 = "red";
          }
          else
          {
            digitalWrite(PinUtenza16,LOW);
            colore16 = "white";
          }
       }
       if (query.indexOf("17utenza") > 0) 
       {
          if(colore17 == "white")
          {
            digitalWrite(PinUtenza17,HIGH);
            colore17 = "red";
          }
          else
          {
            digitalWrite(PinUtenza17,LOW);
            colore17 = "white";
          }
       }
       if (query.indexOf("18utenza") > 0) 
       {
          if(colore18 == "white")
          {
            digitalWrite(PinUtenza18,HIGH);
            colore18 = "red";
          }
          else
          {
            digitalWrite(PinUtenza18,LOW);
            colore18 = "white";
          }
       }
       if (query.indexOf("19utenza") > 0) 
       {
          if(colore19 == "white")
          {
            digitalWrite(PinUtenza19,HIGH);
            colore19 = "red";
          }
          else
          {
            digitalWrite(PinUtenza19,LOW);
            colore19 = "white";
          }
       }
       if (query.indexOf("20utenza") > 0) 
       {
          if(colore20 == "white")
          {
            digitalWrite(PinUtenza20,HIGH);
            colore20 = "red";
          }
          else
          {
            digitalWrite(PinUtenza20,LOW);
            colore20 = "white";
          }
       }
          //Ivia la pagina con i tasti alla richiesta del browser, questo accade quando nella barra degli indirizzi si scrive l'IP di arduino.
          client.print("<body style='background-color: rgb(");
          client.print(RGB);
          client.print("); color: rgb(0, 0, 0);'alink='#ee0000' link='#0000ee' vlink='#551a8b'><br>");

          for(i = 0 ; i < 6 ; ++i)
            client.print("&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;");
          client.print(TITOLO);
          client.print("</br></br></br>");
          for(i = 0 ; i < 7 ; ++i)
            client.print("&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ");
            
          client.print("<a href='/utenza1'><button style='background-color:");    
          client.print(colore1);
          client.print(";'>");
          client.print(U1);
          client.print("</button></a>");  

          client.print("&nbsp; &nbsp;&nbsp; &nbsp;<a href='/11utenza'><button style='background-color:");    
          client.print(colore11);
          client.print(";'>");
          client.print(U11);
          client.print("</button></a></br></br>");

          for(i = 0 ; i < 7 ; ++i)
            client.print("&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ");
            
          client.print("<a href='/utenza2'><button style='background-color:");    
          client.print(colore2);
          client.print(";'>");
          client.print(U2);
          client.print("</button></a>");

          client.print("&nbsp; &nbsp;&nbsp; &nbsp;<a href='/12utenza'><button style='background-color:");    
          client.print(colore12);
          client.print(";'>");
          client.print(U12);
          client.print("</button></a></br></br>");

          for(i = 0 ; i < 7 ; ++i)
            client.print("&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ");
            
          client.print("<a href='/utenza3'><button style='background-color:");    
          client.print(colore3);
          client.print(";'>");
          client.print(U3);
          client.print("</button></a>");

          client.print("&nbsp; &nbsp;&nbsp; &nbsp;<a href='/13utenza'><button style='background-color:");    
          client.print(colore13);
          client.print(";'>");
          client.print(U13);
          client.print("</button></a></br></br>");

          for(i = 0 ; i < 7 ; ++i)
            client.print("&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ");

          client.print("<a href='/utenza4'><button style='background-color:");    
          client.print(colore4);
          client.print(";'>");
          client.print(U4);
          client.print("</button></a>");

          client.print("&nbsp; &nbsp;&nbsp; &nbsp;<a href='/14utenza'><button style='background-color:");    
          client.print(colore14);
          client.print(";'>");
          client.print(U14);
          client.print("</button></a></br></br>");

          for(i = 0 ; i < 7 ; ++i)
            client.print("&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ");
          
          client.print("<a href='/utenza5'><button style='background-color:");    
          client.print(colore5);
          client.print(";'>");
          client.print(U5);
          client.print("</button></a>");

          client.print("&nbsp; &nbsp;&nbsp; &nbsp;<a href='/15utenza'><button style='background-color:");    
          client.print(colore15);
          client.print(";'>");
          client.print(U15);
          client.print("</button></a></br></br>");

          for(i = 0 ; i < 7 ; ++i)
            client.print("&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ");
          
          client.print("<a href='/utenza6'><button style='background-color:");    
          client.print(colore6);
          client.print(";'>");
          client.print(U6);
          client.print("</button></a>");

          client.print("&nbsp; &nbsp;&nbsp; &nbsp;<a href='/16utenza'><button style='background-color:");    
          client.print(colore16);
          client.print(";'>");
          client.print(U16);
          client.print("</button></a></br></br>");

          for(i = 0 ; i < 7 ; ++i)
            client.print("&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ");

          client.print("<a href='/utenza7'><button style='background-color:");    
          client.print(colore7);
          client.print(";'>");
          client.print(U7);
          client.print("</button></a>");

          client.print("&nbsp; &nbsp;&nbsp; &nbsp;<a href='/17utenza'><button style='background-color:");    
          client.print(colore17);
          client.print(";'>");
          client.print(U17);
          client.print("</button></a></br></br>"); 

          for(i = 0 ; i < 7 ; ++i)
            client.print("&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ");
          
          client.print("<a href='/utenza8'><button style='background-color:");    
          client.print(colore8);
          client.print(";'>");
          client.print(U8);
          client.print("</button></a>");

          client.print("&nbsp; &nbsp;&nbsp; &nbsp;<a href='/18utenza'><button style='background-color:");    
          client.print(colore18);
          client.print(";'>");
          client.print(U18);
          client.print("</button></a></br></br>"); 

          for(i = 0 ; i < 7 ; ++i)
            client.print("&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ");
          
          client.print("<a href='/utenza9'><button style='background-color:");    
          client.print(colore9);
          client.print(";'>");
          client.print(U9);
          client.print("</button></a>");

          client.print("&nbsp; &nbsp;&nbsp; &nbsp;<a href='/19utenza'><button style='background-color:");    
          client.print(colore19);
          client.print(";'>");
          client.print(U19);
          client.print("</button></a></br></br>");

          for(i = 0 ; i < 7 ; ++i)
            client.print("&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ");
          
          client.print("<a href='/10utenza'><button style='background-color:");    
          client.print(colore10);
          client.print(";'>");
          client.print(U10);
          client.print("</button></a>");

          client.print("&nbsp; &nbsp;&nbsp; &nbsp;<a href='/20utenza'><button style='background-color:");    
          client.print(colore20);
          client.print(";'>");
          client.print(U20);
          client.print("</button></br></br>");
                   
//*******************************************************************************

          break;//Esce dal ciclo    
     }
   }
  }
    delay(1); //Quando il Server ha risposto ad Arduino e stampato la pagina HTML nel browser resetta il processo e torna ad ascoltare
    client.stop();
    query = String("");
  }
}
