/*
 
  
  
  Web Server

 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield.

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)

 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe

 */

#include <SPI.h>
#include <Ethernet2.h>
#include <avr/wdt.h>
//============ Объявление глобальных переменных =======================================================
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);
String urnFromRequest="No", command="No", param="No";  // строка URN из запроса, команда и параметры, извлеченные из GET-запроса
int res;// оперативная переменная
// список команд:

String command_start="start",
		command_clear="clear",
		command_setmessage="setmes",
		command_write="write",
		command_reboot="reboot",
		command_test="test",
		command_eep="eep",
		command_changeIP="changeip",
		command_rrf="readrf",
		command_help="help";

// ========================= Текстовые константы ====================

String err_parser = "No command in GET-request";
//===================================================================
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
	wdt_enable(WDTO_8S);
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  }


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
	  urnFromRequest="";
	 // content="";
    
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
		urnFromRequest = urnFromRequest + c;
         if (c == '\n' && currentLineIsBlank) {
			 
//==================== Ответ на get-запрос ================================================	          
		  client.print(F("HTTP/1.1 200 OK \r\n Content-Type: text/html \r\n Connection: close\r\n\r\n"));          
//==================== Формирование страницы ================================================	
		client.print(F("<!DOCTYPE HTML><html><head><title>ARTONIT MPT</title></head><body>"));
		client.print(F("<h1>ARTONIT MPT</h1>"));
		client.print(F("<h4>Help</h4><b>"));
		client.print(F("<a href=start>start</a> - write welcome message and IP address.<br>"));
		client.print(F("<a href=clear>clear</a> - clear LCD<br>"));// - очистить лсд дисплей.<br>";
		client.print(F("<a href=setmes[1,2,3][mes]/00 - set message text<br>"));// -запись сообщения в буфер.";
		client.print(F("<a href=write[row][column][mes] - out mes[1-3] in row [row] from column[column] position<br>"));// -вывод сообщения на дисплей [Номер строки][Позиция на строке][Номер сообщения].<br>";
		client.print(F("<a href=changeip?ip=192.168.1.187>changeip?ip=192.168.1.187</a> - set new IP 192.168.1.187<br>"));//- изменение IP адресса на 192.168.1.187.<br>";
		client.print(F("<a href=/write123>write123</a> - example write mes 3 in col 2 on row 1<br>"));//-вывод строки 3 п позицию 2 на строке 1.<br>";
		client.print(F("<a href=reboot>reboot</a> - reboot"));// – перезагрузк.<br>";
		client.print(F("</b><br><br><br><br>"));
		
		client.println(F("<form method='GET' action='setMessage'>"));
		client.println(F("<input type='text' name='command' value='SendCommand'/>"));
		client.println(F("<input type='submit' value='Update'/>"));
		client.println(F("</form>"));

//Результат выполнения основного процесса выводится на экран.	
		client.print(main_proces(urnFromRequest));
		client.print("</body></html>");
		  
//====================================================================
          break;
        }
		//далее выборка до первого символа \n (курсор в крайнее левое
        if (c == '\r') {
          // you're starting a new line. char 0D
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line. char 0A
          currentLineIsBlank = false;
        }
      }
    } 
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
  }
  wdt_reset();
}

//================= Все остальное ====================================

String main_proces(String urnFromRequest)
{
	String content="", exec_content="";
	res=getCommand(get_text_from_request(urnFromRequest));
	/*
		  content = content + "1 " + get_text_from_request(urnFromRequest) + "<br>" 
							+ "2 res=" + res + "<br>" 
							+ "3 command=" + command + "<br>" 
							+ "4 param=" + param;
	*/		
		  exec_content="Unknow command <b>" + command +"</b>";
		  // обработка полученных команд
		  if (res == 0)
		  {
			 if(command==command_start)//Обработка команды старт контролера
				{
				   exec_content = comm_exec(command_start);
				}	
				
			if(command==command_help)//Обработка команды старт контролера
				{
				   exec_content = comm_exec(command_start);
				   exec_content = help();
				}	
			  
		  content= content + "<br>" + exec_content;
		  
		  } else {
		  content = content + "<br>" + "No command.";
		  }
	return content;
}

//заглушлка обработчика команда
String comm_exec(String comm_execute)
{
	return "<b> Execute command " + comm_execute + ".</b>";
}

//функция перезагрузки Контролера 
void(* resetFunc) (void) = 0;

// парсер GET-запроса. Команда - все, что находится до знака '?', либо вся строка
// входящий параметр intext
// выходящие:
// result - 0 - команда выделена успешно, 1 - команды нет.
// command содержит выделенную команду
// param содержит параметры команды
int getCommand(String intext)// процедура извлечения команды из входящей строки. Команда - все, что находится до знака '?', либо вся строка
{
	int result=-1; // результат работы функции (0 - успешно, 1  и прочее - неуспешно)
	int charcount=0, len=-5;
	command="qwerty2";
	param="ytrewq2";
		intext.trim();
		charcount=intext.indexOf('?');
		len=intext.length();// длина get-запроса
		if (charcount > 0 and len > 0) // мы имеем команду с параметрами.
		{
				command=intext.substring(0,charcount); // извлекли команду
				param=intext.substring(charcount); // извлекли параметры
				result=0;// извлечение прошло успешно.
			
		}
		if (charcount == -1 and len > 0) { // мы имеем команду без параметров
			command=intext.substring(0,charcount); // извлекли команду
			param=""; // извлекли параметры
			result=0;// извлечение прошло успешно.
		}
		if (charcount == -1 and len == 0) { // команды нет вообще
			command=""; // извлекли команду
			param=""; // извлекли параметры
			result=2;// извлечение прошло c ошибкой, команды нет.
		}
		
	return result;	
}


// Извлечение данных из GET-запроса
// входyst данные - строка с GET-запросом (включая GET ... HTTP
// выходные данные - строка между GET и HTTP.
String get_text_from_request(String request)
{
	String get_text_from_request = request.substring(5, request.length()-11);
	return get_text_from_request;
	
}


//процедура подготовки ответа на get-запрос
String http_ok()//процедура подготовки ответа на get-запрос
{
	String txt="HTTP/1.1 200 OK \r\n Content-Type: text/html \r\n Connection: close\r\n\r\n";
	return txt;
}

// шаблон для вывода ответа на экран.
// входные параметры: content
// выходные параметры - подготовленный текст HTML-страницы
String tmpl(String content) // шаблон для вывода ответа на экран.
{
  String txt="", ppp="", ex_ip="192.168.1.177";
    ppp = "<!DOCTYPE HTML><html><head><title>ARTONIT MPT</title></head><body>";
    ppp+= "<h1>ARTONIT MPT</h1>";
    ppp+= content;
    ppp+= "</body></html>";
    txt =  ppp;
  return txt;

}


// набор текста для вывода HELP
String help()
{
	String ppp="", ex_ip="IP";
	ppp+= "<h4>Command:</h4>";
	//ppp+= ex_ip + "/str - write welcome message and IP address.<br>";
    //ppp+= ex_ip + "/clr - clear LCD<br>";// - очистить лсд дисплей.<br>";
    //ppp+= ex_ip + "/mes[1,2,3][mes]/00 - set message text<br>";// -запись сообщения в буфер.";
    //ppp+= ex_ip + "/wrt[row][column][mes] - out mes[1-3] in row [row] from column[column] position<br>";// -вывод сообщения на дисплей [Номер строки][Позиция на строке][Номер сообщения].<br>";
    //ppp+= ex_ip + "/cip/192/168/1/187 - set new IP<br>";//- изменение IP адресса на 192.168.1.187.<br>";
    //ppp+= ex_ip + "/wrt123 - example write mes 3 in col 2 on row 1<br>";//-вывод строки 3 п позицию 2 на строке 1.<br>";
    ppp+= ex_ip + "/Reb - reboot";// – перезагрузк.<br>";
	
	return ppp;
}



