Paul Staron / Mbed 2 deprecated ESP8266-WEB-Mbed-Controller

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 
00004 // LPC1768 ESP8266 works up to 460800 baud
00005 
00006 //Serial ports to be used
00007 Serial pc(USBTX,USBRX);//TO BE used for debug info
00008 Serial esp(p13,p14);//TX,RX TO BE CONNECTED TO ESP
00009 Serial esp2(p13,p14);//TX,RX TO BE CONNECTED TO ESP
00010 int espbaud = 115200;
00011 DigitalOut espreset(p25,1);
00012 //Connections to relay
00013 //relay works at logic LOW
00014 DigitalOut digital_out_1(LED1,1);// High on initialization
00015 DigitalOut digital_out_2(LED2,1);// High on initialization
00016 DigitalOut digital_out_3(LED3,1);// High on initialization
00017 DigitalOut digital_out_4(LED4,1);// High on initialization
00018 //digital inputs, connected to push buttons
00019 DigitalIn digital_in_1(p21);
00020 DigitalIn digital_in_2(p22);
00021 DigitalIn digital_in_3(p23);
00022 DigitalIn digital_in_4(p24);
00023 //Analog output
00024 PwmOut analog_out_1(p26);
00025 //Analog Input
00026 AnalogIn tempSensor(p20);
00027 
00028 //F401  ESP8266 works up to 460800 baud
00029 /*
00030 //Serial ports to be used
00031 Serial pc(USBTX,USBRX);//TO BE used for debug info
00032 Serial esp(D8,D2);//TX,RX TO BE CONNECTED TO ESP
00033 Serial esp2(D8,D2);//TX,RX TO BE CONNECTED TO ESP
00034 int espbaud = 115200;
00035 //Connections to relay
00036 //relay works at logic LOW
00037 DigitalOut digital_out_1(D3,1);// High on initialization
00038 DigitalOut digital_out_2(D4,1);// High on initialization
00039 DigitalOut digital_out_3(D5,1);// High on initialization
00040 DigitalOut digital_out_4(D6,1);// High on initialization
00041 //digital inputs, connected to push buttons
00042 DigitalIn digital_in_1(A1);
00043 DigitalIn digital_in_2(A2);
00044 DigitalIn digital_in_3(A3);
00045 DigitalIn digital_in_4(A4);
00046 //Analog output
00047 PwmOut analog_out_1(D15);
00048 //Analog Input
00049 AnalogIn tempSensor(A0);
00050 */
00051 
00052 char ssid[32] = "ssid";   // enter your router ssid inside the quotes
00053 char pwd[32] = "password"; // enter your router password inside the quotes
00054 
00055 #define BUFFER_SIZE 3000
00056 #define REQ_LINE_BUFF_SIZE 100
00057 #define UNKNOWN 0
00058 #define OK 1
00059 #define ERROR 2
00060 #define FAIL 3
00061 #define READY 4
00062 #define READY_TO_WRITE_TCP 5
00063 
00064 
00065 const char get_analog_outputs_status[]="/analog_outputs";
00066 const char get_Toggle_Output[]="/digital_outputs/toggle";
00067 const char get_analog_inputs_status[]="/analog_inputs";
00068 const char get_analog_output_update[]="/analog_outputs/update";
00069 const char get_digital_output_status[]="/digital_outputs";
00070 const char get_digital_inputs_html[]="/dinputs.html";
00071 const char get_digital_input_status[]="/digital_inputs";
00072 const char get_index_html[]="/index.html";
00073 const char get_analog_outputs[]="/anoutputs.html";
00074 const char get_analog_inputs_html[]="/aninputs.html";
00075 
00076 
00077 const char jsonHeader[]="HTTP/1.1 200 OK\n"
00078                         "Content-type: application/json\r\n\r\n";
00079 
00080 const char textPlainHeader[]="HTTP/1.1 200 OK\n"
00081                         "Content-type: text/plain\r\n\r\n";
00082 
00083 const char index_html[]="HTTP/1.1 200 OK\n"
00084                         "Content-type: text/html\r\n\r\n"
00085                         "<!DOCTYPE html>\n<html>\n<head>\n<title>esp</title>\n<link rel=stylesheet type=text/css href=css/style.css>\n<script src=https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js></script>\n<script>$(document).ready(function(){setInterval(\"get_digital_output_status()\",2000)});function get_digital_output_status(){var a=\"/digital_outputs\";$.ajax({url:a,dataType:\"json\",success:function(b){if(b.digital_outputs.dout1==1){$(\"#dout1\").html(\"HIGH\")}else{$(\"#dout1\").html(\"LOW\")}if(b.digital_outputs.dout2==1){$(\"#dout2\").html(\"HIGH\")}else{$(\"#dout2\").html(\"LOW\")}if(b.digital_outputs.dout3==1){$(\"#dout3\").html(\"HIGH\")}else{$(\"#dout3\").html(\"LOW\")}if(b.digital_outputs.dout4==1){$(\"#dout4\").html(\"HIGH\")}else{$(\"#dout4\").html(\"LOW\")}},timeout:2000})}function digital_output_toggle(a){var b=\"/digital_outputs/toggle?pin=\"+a;$.ajax({url:b,dataType:\"text\",success:function(c){if(c==\"1\"){$(\"#\"+a).html(\"HIGH\")}else{if(c==\"0\"){$(\"#\"+a).html(\"LOW\")}else{alert(\"failed to toggle digital output\")}}},timeout:2000})};</script>\n</head>\n<body>\n<header>\n<img src=images/logo.jpg>\n<h1>ESP8266 BASED WEBSERVER</h1>\n</header>\n<nav>\n<ul>\n<li><a class=active href=index.html>Digital Outputs</a></li>\n<li><a href=dinputs.html>Digital inputs</a></li>\n<li><a href=anoutputs.html>Analog Outputs</a></li>\n<li><a href=aninputs.html>Analog Inputs</a></li>\n</ul>\n</nav>\n<section>\n<table>\n<tr>\n<th>Digital Ouput</th>\n<th>Status</th>\n<th>Option</th>\n</tr>\n<tr>\n<td>DOut1</td>\n<td id=dout1>waiting..</td>\n<td><button class=button onclick=\"digital_output_toggle('dout1')\">Toggle</button>\n</td>\n</tr>\n<tr>\n<td>DOut2</td>\n<td id=dout2>waiting..</td>\n<td><button class=button onclick=\"digital_output_toggle('dout2')\">Toggle</button>\n</tr>\n<tr>\n<td>DOut3</td>\n<td id=dout3>waiting..</td>\n<td><button class=button onclick=\"digital_output_toggle('dout3')\">Toggle</button>\n</tr>\n<tr>\n<td>DOut4</td>\n<td id=dout4>waiting..</td>\n<td><button class=button onclick=\"digital_output_toggle('dout4')\">Toggle</button>\n</tr>\n</table>\n</section>\n</body>\n</html>";
00086 
00087 const char digitalInputs_html[]="HTTP/1.1 200 OK\n"
00088                         "Content-type: text/html\r\n\r\n"
00089                         "<!DOCTYPE html>\n<html>\n<head>\n<title>esp</title>\n<link rel=stylesheet type=text/css href=css/style.css>\n<script src=https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js></script>\n<script>$(document).ready(function(){setInterval(\"get_digital_input_status()\",2000)});function get_digital_input_status(){var a=\"/digital_inputs\";$.ajax({url:a,dataType:\"json\",success:function(b){if(b.digital_inputs.din1==1){$(\"#din1\").html(\"HIGH\")}else{$(\"#din1\").html(\"LOW\")}if(b.digital_inputs.din2==1){$(\"#din2\").html(\"HIGH\")}else{$(\"#din2\").html(\"LOW\")}if(b.digital_inputs.din3==1){$(\"#din3\").html(\"HIGH\")}else{$(\"#din3\").html(\"LOW\")}if(b.digital_inputs.din4==1){$(\"#din4\").html(\"HIGH\")}else{$(\"#din4\").html(\"LOW\")}},timeout:2000})};</script>\n</head>\n<body>\n<header>\n<img src=images/logo.jpg>\n<h1>ESP8266 BASED WEBSERVER</h1>\n</header>\n<nav>\n<ul>\n<li><a href=index.html>Digital Outputs</a></li>\n<li><a class=active href=dinputs.html>Digital inputs</a></li>\n<li><a href=anoutputs.html>Analog Outputs</a></li>\n<li><a href=aninputs.html>Analog Inputs</a></li>\n</ul>\n</nav>\n<section>\n<table id=inputsTable>\n<tr>\n<th>Digital Input</th>\n<th>Status</th>\n</tr>\n<tr>\n<td>DIn1</td>\n<td id=din1>waiting..</td>\n</td>\n</tr>\n<tr>\n<td>DIn2</td>\n<td id=din2>waiting..</td>\n</tr>\n<tr>\n<td>DIn3</td>\n<td id=din3>waiting..</td>\n</tr>\n<tr>\n<td>DIn4</td>\n<td id=din4>waiting..</td>\n</tr>\n</table>\n</section>\n</body>\n</html>";
00090 
00091 const char analog_outputs_html[]="HTTP/1.1 200 OK\n"
00092                         "Content-type: text/html\r\n\r\n"
00093                         "<!DOCTYPE html>\n<html>\n<head>\n<title>esp</title>\n<link rel=stylesheet type=text/css href=css/style.css>\n<script src=https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js></script>\n<script type=text/javascript src=https://www.gstatic.com/charts/loader.js></script>\n<script>$(document).ready(function(){setInterval(\"getAnalogOutputStatus()\",2000);displayVoltageLevel()});var voltage_level=0;function getAnalogOutputStatus(){var a=\"/analog_outputs\";$.ajax({url:a,dataType:\"text\",success:function(b){voltage_level=parseFloat(b)},timeout:2000})}function setNewVoltageLevel(a){var b=\"/analog_outputs/update?value=\"+a;$.ajax({url:b,dataType:\"text\",success:function(c){voltage_level=parseFloat(c)},timeout:2000})}function displayVoltageLevel(){google.charts.load(\"current\",{packages:[\"gauge\"]});google.charts.setOnLoadCallback(a);function a(){var d=google.visualization.arrayToDataTable([[\"Label\",\"Value\"],[\"Volts\",0],]);var b={width:300,height:250,redFrom:8,redTo:12,yellowFrom:4,yellowTo:8,greenFrom:0,greenTo:4,min:0,max:12,minorTicks:5};var c=new google.visualization.Gauge(document.getElementById(\"chart_div\"));c.draw(d,b);setInterval(function(){d.setValue(0,1,voltage_level);c.draw(d,b)},500)}};</script>\n</head>\n<body>\n<header>\n<img src=images/logo.jpg>\n<h1>ESP8266 BASED WEBSERVER</h1>\n</header>\n<nav>\n<ul>\n<li><a href=index.html>Digital Outputs</a>\n</li>\n<li><a href=dinputs.html>Digital inputs</a>\n</li>\n<li><a class=active href=anoutputs.html>Analog Outputs</a>\n</li>\n<li><a href=aninputs.html>Analog Inputs</a>\n</li>\n</ul>\n</nav>\n<section>\n<h3>Enter new voltage value and press Update btton</h3>\n<input type=text id=volts maxlength=5 placeholder=Voltage..(0.00-12.00)>\n<button class=button onclick=\"setNewVoltageLevel(document.getElementById('volts').value)\">Update</button>\n<div id=chart_div style=width:300px;height:250px></div>\n<h1 style=color:blue;margin-left:50px>Voltage Level</h1>\n</section>\n</body>\n</html>";
00094 
00095 const char analog_inputs_html[]="HTTP/1.1 200 OK\n"
00096                         "Content-type: text/html\r\n\r\n"
00097                         "<!DOCTYPE html>\n<html>\n<head>\n<title>esp</title>\n<link rel=stylesheet type=text/css href=css/style.css>\n<script src=https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js></script>\n<script>$(document).ready(function(){setInterval(\"getTemperature()\",2000)});function getTemperature(){var a=\"/analog_inputs\";$.ajax({url:a,dataType:\"text\",success:function(b){$(\"#temp\").html(b+\"&#8451;\")},timeout:2000})};</script>\n</head>\n<body>\n<header>\n<img src=images/logo.jpg>\n<h1>ESP8266 BASED WEBSERVER</h1>\n</header>\n<nav>\n<ul>\n<li><a href=index.html>Digital Outputs</a>\n</li>\n<li><a href=dinputs.html>Digital inputs</a>\n</li>\n<li><a href=anoutputs.html>Analog Outputs</a>\n</li>\n<li><a class=active href=aninputs.html>Analog Inputs</a>\n</li>\n</ul>\n</nav>\n<section>\n<h1 id=temp style=border-style:solid;border-width:6px;border-color:red;border-radius:20px;background-color:#aeb5b7;width:100px;margin-top:20px;margin-left:40px;padding:20px>Waiting..</h1>\n<h2 style=margin-left:25px;color:blue>Temperature Value</h2>\n<br><br><h2>Temperature history</h2>\n<iframe width=450 height=260 style=\"border:1px solid #ccc\" src=\"https://thingspeak.com/channels/243141/charts/1?bgcolor=%23ffffff&color=%23d62020&dynamic=true&results=100&type=line\"></iframe>\n</section>\n</body>\n</html>";
00098 
00099 const char style_css[]="HTTP/1.1 200 OK\n"
00100                         "Content-type: text/css\r\n\r\n"
00101                         "*{padding:0;margin:0}header{background-color:#27ace5}body{font-family:calibri}header h1{text-align:center;font-size:4em;color:#fff;padding:10px}header img{width:110px;margin-top:10px;float:left}ul{list-style-type:none;margin:0;padding:0;overflow:hidden;background-color:#333}li{float:left}li a{display:block;color:#fff;text-align:center;padding:14px 16px;text-decoration:none}li a:hover:not(.active){background-color:#111}.active{background-color:#4CAF50}table{border-collapse:collapse;width:100%}table#inputsTable{border-collapse:collapse;width:70%}th,td{text-align:left;padding:8px}tr:nth-child(even){background-color:#f2f2f2}th{background-color:#4CAF50;color:#fff}section{width:60%;margin:10px}.button{display:inline-block;padding:10px 15px;font-size:15px;cursor:pointer;text-align:center;text-decoration:none;outline:none;color:#fff;background-color:#4CAF50;border:none;border-radius:15px;box-shadow:0 9px #999}.button:hover{background-color:#3e8e41}.button:active{background-color:#3e8e41;box-shadow:0 5px #666;transform:translateY(4px)}input[type=text],select{width:25%;padding:12px 20px;margin:8px 0;display:inline-block;border:1px solid #ccc;border-radius:4px;box-sizing:border-box}";
00102 
00103 const char not_found_text[]="HTTP/1.1 404 Not Found\n"
00104                             "Content-type: text/plain\r\n\r\n"
00105                             "page not found";
00106 
00107 //HTTP/1.1 200 OK
00108 //Content-type:image/jpeg
00109 const char logo_jpg[]={0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x31, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x6A, 0x70, 0x65, 0x67, 0x0D,0x0A,0x0D, 0x0A, 
00110                         0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x3A, 0x43, 0x52, 0x45, 0x41, 0x54, 0x4F, 0x52, 0x3A, 0x20, 0x67, 0x64, 0x2D, 0x6A, 0x70, 0x65, 0x67, 0x20, 0x76, 0x31, 0x2E, 0x30, 0x20, 0x28, 0x75, 0x73, 0x69, 0x6E, 0x67, 0x20, 0x49, 0x4A, 0x47, 0x20, 0x4A, 0x50, 0x45, 0x47, 0x20, 0x76, 0x38, 0x30, 0x29, 0x2C, 0x20, 0x71, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x20, 0x3D, 0x20, 0x35, 0x0A, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0xA0, 0x6E, 0x78, 0x8C, 0x78, 0x64, 0xA0, 0x8C, 0x82, 0x8C, 0xB4, 0xAA, 0xA0, 0xBE, 0xF0, 0xFF, 0xFF, 0xF0, 0xDC, 0xDC, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0xAA, 0xB4, 0xB4, 0xF0, 0xD2, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0x71, 0x00, 0x96, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, 0x1F, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0x9A, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x29, 0x8D, 0x20, 0x07, 0x8E, 0x68, 0x01, 0xF4, 0x50, 0x08, 0x23, 0x22, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x29, 0x19, 0x82, 0x8E, 0x69, 0xAC, 0xFC, 0x1D, 0xB5, 0x18, 0x04, 0xF2, 0xC7, 0x02, 0x80, 0x14, 0xB3, 0x39, 0xC0, 0xA5, 0x55, 0x03, 0xDC, 0xFE, 0x82, 0x91, 0x8E, 0xDE, 0x00, 0xE3, 0xF9, 0xD2, 0xE4, 0x10, 0x31, 0xFF, 0x00, 0x7C, 0x8A, 0x00, 0x5C, 0x9C, 0xE5, 0x7F, 0x13, 0xD8, 0xD3, 0xC1, 0x04, 0x54, 0x7D, 0xFD, 0x4F, 0xA7, 0x61, 0x40, 0xEE, 0xC0, 0xF3, 0xDF, 0xD2, 0x80, 0x25, 0xA2, 0x91, 0x58, 0x30, 0xE2, 0x96, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA6, 0x34, 0x98, 0xE1, 0x68, 0x01, 0xCC, 0xC1, 0x7A, 0xD4, 0x4E, 0xE4, 0x9C, 0x74, 0xF6, 0xA6, 0xEE, 0x39, 0xCE, 0x79, 0xA4, 0xCD, 0x30, 0x14, 0x1E, 0xC7, 0x9A, 0x56, 0xE7, 0xBE, 0x4F, 0xE9, 0x4D, 0xA5, 0x07, 0xB8, 0xE2, 0x80, 0x14, 0x1C, 0x0C, 0x1E, 0x56, 0x8E, 0x50, 0xE4, 0x72, 0x29, 0xD1, 0xE1, 0xB8, 0x27, 0xF0, 0xA5, 0x60, 0x17, 0xFD, 0xD3, 0xD4, 0x7F, 0x51, 0x48, 0x04, 0x1F, 0x32, 0xE7, 0x1C, 0x7A, 0x0F, 0xEB, 0x48, 0x48, 0x1F, 0x7B, 0xFE, 0xF9, 0x1F, 0xD6, 0x99, 0x9C, 0x1E, 0x0D, 0x25, 0x3B, 0x01, 0x22, 0xB6, 0x79, 0x1C, 0x37, 0xF3, 0xA9, 0x55, 0xB7, 0x7D, 0x7D, 0x2A, 0xBD, 0x3D, 0x4B, 0x31, 0x18, 0xEB, 0x45, 0x84, 0x4D, 0x45, 0x14, 0x52, 0x18, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x52, 0x33, 0x05, 0x1C, 0xD2, 0xD4, 0x0E, 0x08, 0x6E, 0x68, 0x01, 0x59, 0xCB, 0x7B, 0x0A, 0x6E, 0x3A, 0x67, 0xBD, 0x07, 0x00, 0x0E, 0x0D, 0x04, 0x82, 0x29, 0x88, 0x52, 0xA0, 0x00, 0x73, 0xD7, 0xF4, 0xA6, 0xD3, 0xB2, 0x06, 0x7B, 0xFB, 0xD3, 0x4F, 0xB7, 0x4A, 0x06, 0x25, 0x2E, 0x38, 0xE7, 0x8A, 0x00, 0xFC, 0xFD, 0x69, 0x3A, 0xD2, 0x01, 0xCA, 0x07, 0x5C, 0xF4, 0xA5, 0x2D, 0xEA, 0x39, 0xF7, 0xA6, 0xD3, 0xBE, 0xF7, 0xD7, 0xDC, 0xD0, 0x03, 0x48, 0xA4, 0xA7, 0x63, 0x9C, 0x54, 0x89, 0x1E, 0x39, 0x34, 0xC4, 0x35, 0x10, 0xB7, 0xD2, 0xA5, 0x00, 0x01, 0xC5, 0x2D, 0x14, 0x86, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0xD9, 0x00, 0x2A, 0x73, 0x4E, 0xA0, 0xF3, 0x40, 0x10, 0x12, 0x4E, 0x01, 0x3C, 0x1A, 0x1B, 0xEF, 0x64, 0x0F, 0xC2, 0x95, 0xD7, 0x61, 0xF5, 0x06, 0x9A, 0x38, 0x39, 0xCF, 0xD2, 0x80, 0x0C, 0xE4, 0xF2, 0x3A, 0x76, 0xA4, 0xEE, 0x45, 0x28, 0x04, 0xE4, 0x8E, 0xD4, 0x29, 0x18, 0x20, 0xF7, 0xA6, 0x21, 0x41, 0x04, 0x6D, 0x38, 0x03, 0xBF, 0xBD, 0x23, 0x03, 0xD7, 0x9C, 0x9E, 0x07, 0xD2, 0x92, 0x9E, 0x1B, 0x23, 0xA6, 0x5B, 0xDE, 0x80, 0x23, 0x3C, 0x53, 0x91, 0x0B, 0x1F, 0x6A, 0x91, 0x62, 0xEE, 0xD5, 0x27, 0x4A, 0x43, 0x11, 0x54, 0x2F, 0x4A, 0x5A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x04, 0x23, 0x27, 0xDA, 0xA1, 0x61, 0xB7, 0x38, 0x1F, 0x2D, 0x4F, 0x48, 0x47, 0x06, 0x80, 0x21, 0x04, 0xA8, 0xE3, 0xA5, 0x36, 0x9E, 0x54, 0x83, 0xC0, 0xC8, 0x34, 0xA2, 0x3C, 0x1E, 0x69, 0xDC, 0x06, 0xAA, 0x16, 0xA9, 0x95, 0x42, 0xD2, 0x81, 0x8A, 0x29, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x84, 0x70, 0x29, 0x68, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x3F, 0xFF, 0xD9};
00111 
00112 // HTTP/1.1 200 OK
00113 //Content-type:image/x-icon
00114 const char favicon_ico[]={0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x31, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x78, 0x2D, 0x69, 0x63, 0x6F, 0x6E,0x0D, 0x0A,0x0D, 0x0A, 
00115     0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x68, 0x03, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xED, 0xED, 0xED, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF6, 0xF6, 0xF6, 0xAD, 0xB4, 0xB3, 0xD9, 0xE0, 0xDF, 0xFA, 0xFA, 0xFA, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF5, 0xF5, 0xF5, 0xC8, 0xC8, 0xC8, 0x82, 0x5E, 0x64, 0x79, 0x56, 0x5C, 0xDF, 0xDF, 0xDF, 0xF7, 0xF7, 0xF7, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF7, 0xF7, 0xF7, 0xE4, 0xE4, 0xE4, 0x6F, 0x6F, 0x6F, 0xA6, 0x66, 0x66, 0x7C, 0x3A, 0x37, 0x64, 0x5B, 0x4F, 0xE1, 0xDC, 0xD5, 0xF8, 0xF8, 0xF8, 0xF6, 0xF6, 0xF6, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF9, 0xF9, 0xF9, 0x9B, 0x9B, 0x9B, 0x5B, 0x5B, 0x5B, 0x74, 0x5A, 0x3A, 0x7F, 0x62, 0x3E, 0x7A, 0x5F, 0x3A, 0x8B, 0x7D, 0x6A, 0xBC, 0xBC, 0xBC, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF6, 0xF6, 0xF6, 0x87, 0x86, 0x84, 0x67, 0x64, 0x61, 0x79, 0x5E, 0x41, 0x69, 0x4B, 0x2A, 0x97, 0x7F, 0x5E, 0x50, 0x41, 0x34, 0x2F, 0x2F, 0x2F, 0xBE, 0xBC, 0xBA, 0xF9, 0xF8, 0xF5, 0xF8, 0xF8, 0xF7, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xC6, 0xC6, 0xC6, 0x6C, 0x5B, 0x46, 0x7C, 0x60, 0x3D, 0x8C, 0x62, 0x64, 0x5E, 0x3A, 0x3F, 0x42, 0x42, 0x41, 0x39, 0x39, 0x39, 0x5B, 0x5B, 0x5B, 0x77, 0x61, 0x46, 0xC0, 0xAC, 0x8B, 0xF8, 0xF8, 0xF7, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF4, 0xF4, 0xF4, 0xA3, 0x93, 0x7E, 0x7C, 0x5F, 0x3A, 0x95, 0x6D, 0x6F, 0x5F, 0x3B, 0x41, 0x35, 0x35, 0x35, 0x47, 0x47, 0x47, 0x71, 0x71, 0x71, 0x69, 0x53, 0x37, 0x57, 0x3C, 0x19, 0xA0, 0xA0, 0x9F, 0xF3, 0xF3, 0xF3, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF6, 0xF2, 0xAD, 0xA7, 0x9F, 0x66, 0x3E, 0x44, 0x61, 0x37, 0x3E, 0x5D, 0x3A, 0x3F, 0x60, 0x4D, 0x50, 0xB8, 0xB8, 0xB8, 0x81, 0x42, 0x46, 0x7A, 0x26, 0x2A, 0x89, 0x46, 0x31, 0xD7, 0xB1, 0xA2, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF6, 0xF6, 0xF6, 0xD2, 0xB6, 0xBD, 0x7A, 0x4E, 0x55, 0x7C, 0x50, 0x57, 0x7F, 0x67, 0x6B, 0x7B, 0x7B, 0x7B, 0x82, 0x6C, 0x6F, 0x7B, 0x5D, 0x5F, 0x85, 0x75, 0x4F, 0xE6, 0xDC, 0xC5, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xF6, 0xF9, 0xD2, 0xC1, 0xC4, 0x8C, 0x77, 0x7A, 0x83, 0x78, 0x7A, 0x68, 0x68, 0x68, 0x94, 0x9A, 0x99, 0x8A, 0x92, 0x90, 0xBB, 0xC8, 0xB4, 0xF2, 0xF9, 0xEE, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF7, 0xF7, 0xF7, 0xCC, 0xCC, 0xCC, 0x70, 0x70, 0x70, 0x9C, 0x9C, 0x9C, 0x9A, 0x9A, 0x9A, 0xAA, 0xAA, 0xAA, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xDC, 0xDC, 0xDC, 0x79, 0x79, 0x79, 0xA8, 0xA8, 0xA8, 0xEE, 0xEE, 0xEE, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xEA, 0xEA, 0xEA, 0xEB, 0xEB, 0xEB, 0xF7, 0xF7, 0xF7, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
00116 
00117 char rxBuff[BUFFER_SIZE];//array to store data received from esp
00118 char reqLineBuff[REQ_LINE_BUFF_SIZE];
00119 unsigned char reqLinBuffIndex=0;
00120 unsigned int bufferWritingIndex=0;//write pointer
00121 unsigned int bufferReadingIndex_IpdSearch=0;//read pointer
00122 unsigned int bufferReadingIndex_espRespSearch=0;//read pointer
00123 char serverIp[16];
00124 
00125 Timer t;
00126 
00127 void espRxInterrupt();
00128 char readEspResponse();
00129 void handleHttpRequests();
00130 void processReqLine(char *stringToProcess);
00131 void sendMemArrayToEsp(const char*str,unsigned int len);
00132 void sendRequestedPageToClient(char id, const char* page,unsigned int len);
00133 void extractQueryFieldValue(char* someUrl,char* field, char* value);
00134 char toggleOutput(char* pinName);
00135 
00136 int main(){
00137     //configure Pull down on all digital inputs
00138     digital_in_1.mode(PullDown);
00139     digital_in_2.mode(PullDown);
00140     digital_in_3.mode(PullDown);
00141     digital_in_4.mode(PullDown);
00142 
00143     //configure baud rate for UART
00144     pc.baud(115200);
00145     esp.baud(espbaud);
00146 
00147     esp2.attach(&espRxInterrupt,Serial::RxIrq);
00148     
00149     pc.printf("\033[0m\033[2J\033[HInitialise!\r\n\n\n");
00150 
00151     esp.printf("AT+RST\r\n");
00152     while(readEspResponse()!=READY);
00153     pc.printf("Reset success\n");    
00154     esp.printf("ATE0\r\n");//disable ECHO
00155     while(readEspResponse()!=OK);
00156     esp.printf("AT+CWMODE=1\r\n");//enable station mode
00157     while(readEspResponse()!=OK);
00158     esp.printf("AT+CIPMUX=1\r\n");// enable multiple connections
00159     while(readEspResponse()!=OK);
00160     esp.printf("AT+CIPSERVER=1,80\r\n");//start server at port 80
00161     while(readEspResponse()!=OK);    
00162     esp.printf("AT+CIPSTO=5\r\n");//Server timeout=5 seconds
00163     while(readEspResponse()!=OK);    
00164 
00165     pc.printf("Connecting to WiFi..");    
00166     char cmdbuff[60];
00167     strcpy(cmdbuff, "AT+CWJAP_CUR=\"");
00168     strcat(cmdbuff, ssid);
00169     strcat(cmdbuff, "\",\"");
00170     strcat(cmdbuff, pwd);
00171     strcat(cmdbuff, "\"\r\n");    
00172     esp.printf(cmdbuff);
00173     char responseFromEsp;
00174     
00175     while(1)
00176     {
00177         responseFromEsp=readEspResponse();
00178         wait_us(100000);
00179         pc.putc('.');
00180         if(responseFromEsp==OK || responseFromEsp==FAIL)
00181             break;
00182     }
00183     pc.putc('\n');
00184     if(responseFromEsp==OK)
00185     {
00186         pc.printf("Connected to Wifi\n");
00187         __disable_irq();
00188         esp.printf("AT+CIFSR\r\n");//check obtained IP
00189         esp.scanf("+CIFSR:STAIP,\"%15[^\"]",serverIp);
00190         __enable_irq();
00191         while(readEspResponse()!=OK);       
00192     }
00193      if(responseFromEsp==FAIL){
00194          pc.printf("Can't connect to Wifi\n");
00195          while(1);
00196          }
00197     
00198     pc.printf("Server IP is %s\n",serverIp);
00199         
00200     t.start();//start timer
00201     while(1){           
00202         handleHttpRequests();
00203     }
00204 }
00205 
00206 void espRxInterrupt(){
00207     if(esp2.readable())
00208     {
00209         rxBuff[bufferWritingIndex++]=esp2.getc();
00210         if(bufferWritingIndex>=BUFFER_SIZE)
00211             bufferWritingIndex=0;
00212     }
00213 }
00214 
00215 char readEspResponse(){
00216     char rxByte;
00217     char espResponse=UNKNOWN;
00218     static char state=0;
00219 
00220     while(bufferReadingIndex_espRespSearch!=bufferWritingIndex)
00221     {
00222         rxByte=rxBuff[bufferReadingIndex_espRespSearch++];
00223         //pc.putc(rxByte);
00224         if(bufferReadingIndex_espRespSearch>=BUFFER_SIZE)
00225             bufferReadingIndex_espRespSearch=0;
00226 
00227         switch(state)
00228         {
00229             case 0:
00230             if(rxByte=='O')//it may be OK response
00231                 state=1;
00232             else if(rxByte=='E')//it may be ERROR response
00233                 state=4;
00234             else if(rxByte=='F')//it may be FAIL response
00235                 state=10;
00236             else if(rxByte=='r')//it may be 'ready' response
00237                 state=15;
00238             else if(rxByte=='>')//it may be Ready To Write TCP '>' response
00239                 state=21;
00240             break;
00241 
00242             case 1:
00243             if(rxByte=='K')
00244                 state=2;
00245             else state=0;
00246             break;
00247 
00248             case 2:
00249             if(rxByte==0x0d)
00250                 state=3;
00251             else state=0;
00252             break;
00253 
00254             case 3:
00255             if(rxByte==0x0A)
00256                 espResponse=OK;
00257             state=0;
00258             break;
00259 
00260             case 4://ERROR
00261             if(rxByte=='R')
00262                 state=5;
00263             else state=0;
00264             break;
00265 
00266             case 5:
00267             if(rxByte=='R')
00268                 state=6;
00269             else state=0;
00270             break;
00271 
00272             case 6:
00273             if(rxByte=='O')
00274                 state=7;
00275             else state=0;
00276             break;
00277 
00278 
00279             case 7:
00280             if(rxByte=='R')
00281                 state=8;
00282             else state=0;
00283             break;
00284 
00285             case 8:
00286             if(rxByte==0x0d)
00287                 state=9;
00288             else state=0;
00289             break;
00290 
00291             case 9:
00292             if(rxByte==0x0A)
00293                 espResponse=ERROR;
00294             state=0;
00295             break;
00296 
00297 
00298             case 10://fail
00299             if(rxByte=='A')
00300                 state=11;
00301             else state=0;
00302             break;
00303 
00304 
00305             case 11:
00306             if(rxByte=='I')
00307                 state=12;
00308             else state=0;
00309             break;
00310 
00311 
00312             case 12:
00313             if(rxByte=='L')
00314                 state=13;
00315             else state=0;
00316             
00317             break;
00318 
00319             case 13:
00320             if(rxByte==0x0d)
00321                 state=14;
00322             else state=0;
00323             break;
00324 
00325             case 14:
00326             if(rxByte==0x0A)
00327                 espResponse=FAIL;
00328             state=0;
00329             break;
00330 
00331 
00332             case 15://READY
00333             if(rxByte=='e')
00334                 state=16;
00335             else state=0;
00336             break;
00337 
00338 
00339             case 16:
00340             if(rxByte=='a')
00341                 state=17;
00342             else state=0;
00343             break;
00344 
00345             case 17:
00346             if(rxByte=='d')
00347                 state=18;
00348             else state=0;
00349             break;
00350 
00351             case 18:
00352             if(rxByte=='y')
00353                 state=19;
00354             else  state=0;
00355             break;
00356 
00357             case 19:
00358             if(rxByte==0x0d)
00359                 state=20;
00360             else state=0;
00361             break;
00362 
00363             case 20:
00364             if(rxByte==0x0A)
00365                 espResponse=READY;
00366             state=0;
00367             break;         
00368 
00369             case 21:
00370             if(rxByte==0x20)
00371                 espResponse=READY_TO_WRITE_TCP;
00372             state=0;
00373 
00374             default:
00375             state=0;
00376             break;
00377         }
00378     }
00379     return espResponse;
00380 }
00381 
00382 
00383 
00384 void handleHttpRequests(){
00385     char rxByte;    
00386     static char state=0;
00387 
00388     while(bufferReadingIndex_IpdSearch!=bufferWritingIndex)
00389     {
00390         rxByte=rxBuff[bufferReadingIndex_IpdSearch++];
00391         //pc.putc(rxByte);
00392         if(bufferReadingIndex_IpdSearch>=BUFFER_SIZE)
00393             bufferReadingIndex_IpdSearch=0;
00394         switch(state)
00395         {
00396             case 0:
00397             if(rxByte=='+')
00398                 state=1;
00399             break;
00400 
00401             case 1:
00402             if(rxByte=='I')
00403                 state=2;
00404             else state=0;
00405             break;
00406 
00407             case 2:
00408             if(rxByte=='P')
00409                 state=3;
00410             else state=0;
00411             break;
00412 
00413             case 3:
00414             if(rxByte=='D')
00415                 state=4;
00416             else state=0;
00417             break;
00418 
00419             case 4:
00420             if(rxByte==',')
00421                 state=5;
00422             else state=0;
00423             break;
00424 
00425             case 5:
00426             if(rxByte!=0x0d)
00427             {
00428                 reqLineBuff[reqLinBuffIndex++]=rxByte;
00429             }
00430             else
00431             {
00432                 reqLineBuff[reqLinBuffIndex]=0x00;
00433                 bufferReadingIndex_espRespSearch=bufferReadingIndex_IpdSearch;
00434                 processReqLine(reqLineBuff);
00435                 state=0;
00436                 reqLinBuffIndex=0;
00437             }
00438         }
00439     }
00440 }
00441 
00442 void processReqLine(char *stringToProcess)
00443 {
00444 //0,416:GET /?led=ON HTTP/1.1
00445     char requestType[6];
00446     char request[50];
00447     char linkId;
00448     int ipdLen;
00449     sscanf(stringToProcess,"%c,%d:%s %s",&linkId,&ipdLen,requestType,request);
00450     pc.printf("%s\n",request);
00451     if(request!=NULL)
00452     {
00453         if(strcmp(request,"/")==0 || strcmp(request,get_index_html)==0)
00454         {
00455             //send index.html
00456             sendRequestedPageToClient(linkId,index_html,sizeof(index_html)-1);
00457         }
00458         else if(strcmp(request,get_digital_inputs_html)==0)
00459         {
00460             sendRequestedPageToClient(linkId,digitalInputs_html,sizeof(digitalInputs_html)-1);
00461         }
00462         else if(strcmp(request,get_analog_inputs_html)==0)
00463         {
00464             sendRequestedPageToClient(linkId,analog_inputs_html,sizeof(analog_inputs_html)-1);
00465 
00466         }
00467         else if(strcmp(request,get_analog_outputs)==0)
00468         {
00469             sendRequestedPageToClient(linkId,analog_outputs_html,sizeof(analog_outputs_html)-1);
00470         }
00471 
00472         else if(strcmp(request,"/images/logo.jpg")==0)
00473         {
00474             sendRequestedPageToClient(linkId,logo_jpg,sizeof(logo_jpg));
00475         }
00476         else if(strcmp(request,"/favicon.ico")==0)
00477         {
00478             sendRequestedPageToClient(linkId,favicon_ico,sizeof(favicon_ico));
00479         }
00480         else if(strcmp(request,"/css/style.css")==0)
00481         {
00482             sendRequestedPageToClient(linkId,style_css,sizeof(style_css)-1);
00483         }
00484         else if(strncmp(request,get_Toggle_Output,strlen(get_Toggle_Output))==0)
00485         {
00486             //check query field and value, and toggle appropriate Output
00487             char field[10],value[10];
00488             extractQueryFieldValue(request,field,value);
00489             if(value!=NULL)
00490             {
00491                 char newPinState=toggleOutput(value);
00492                 char responsePacket[100];
00493                 sprintf(responsePacket,"%s%c",textPlainHeader,newPinState+48);
00494                 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
00495             }
00496         }
00497         else if(strcmp(request,get_digital_output_status)==0)
00498         {
00499             //"{\"digital_outputs\":{\"dout1\":1,\"dout2\":0,\"dout3\":1,\"dout4\":1}}"
00500             char responsePacket[200];
00501             sprintf(responsePacket,"%s{\"digital_outputs\":{\"dout1\":%c,\
00502                             \"dout2\":%c,\"dout3\":%c,\"dout4\":%c}}",jsonHeader,(!digital_out_1)+48,
00503                             (!digital_out_2)+48,(!digital_out_3)+48,(!digital_out_4)+48);
00504             sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
00505         }
00506         else if(strcmp(request,get_digital_input_status)==0)
00507         {
00508             char responsePacket[200];
00509             sprintf(responsePacket,"%s{\"digital_inputs\":{\"din1\":%c,\
00510                             \"din2\":%c,\"din3\":%c,\"din4\":%c}}",jsonHeader,(digital_in_1)+48,
00511                             (digital_in_2)+48,(digital_in_3)+48,(digital_in_4)+48);
00512             sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
00513 
00514         }
00515         else if(strncmp(request,get_analog_output_update,strlen(get_analog_output_update))==0)
00516         {
00517             char field[10],value[10];
00518             extractQueryFieldValue(request,field,value);
00519             if(value!=NULL)
00520             {
00521                 analog_out_1=atof(value)/12.0;
00522                 char responsePacket[100];
00523                 sprintf(responsePacket,"%s%.2f",textPlainHeader,analog_out_1.read()*12.0f);
00524                 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
00525             }
00526         }
00527         else if(strcmp(request,get_analog_outputs_status)==0)
00528         {           
00529             char responsePacket[100];
00530             sprintf(responsePacket,"%s%.2f",textPlainHeader,analog_out_1.read()*12.0f);
00531             sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
00532         }
00533         else if(strcmp(request,get_analog_inputs_status)==0)
00534         {
00535             char responsePacket[100];           
00536             sprintf(responsePacket,"%s%.2f",textPlainHeader,((tempSensor*3.3f)-0.500f)*100.0f);
00537             sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
00538         }
00539         else 
00540         {
00541             sendRequestedPageToClient(linkId,not_found_text,sizeof(not_found_text)-1);
00542             //send page not found message
00543         }
00544     }
00545 }
00546 
00547 
00548 void sendRequestedPageToClient(char id, const char* page,unsigned int len)
00549 {
00550     char atCommandArray[50];
00551     unsigned int lenOfPacketToTx;
00552     unsigned int pageToSendAddress=0;
00553     char tempEspStatus;
00554     while(len>0)
00555     {
00556         if(len>2048){
00557             len-=2048;        
00558             lenOfPacketToTx=2048;
00559         }
00560         else{
00561             lenOfPacketToTx=len;
00562             len=0;
00563         }
00564         
00565         sprintf(atCommandArray,"AT+CIPSEND=%c,%d\r\n",id,lenOfPacketToTx);  
00566         bufferReadingIndex_espRespSearch=bufferWritingIndex;
00567         esp.printf(atCommandArray);
00568      
00569         while(1)
00570         {
00571             tempEspStatus=readEspResponse();  
00572             if(tempEspStatus==READY_TO_WRITE_TCP||tempEspStatus==ERROR ||tempEspStatus==FAIL)
00573                 break;
00574         }    
00575         //now send page
00576         if(tempEspStatus==READY_TO_WRITE_TCP)
00577         {
00578             sendMemArrayToEsp(page+pageToSendAddress,lenOfPacketToTx);
00579             do{
00580                 tempEspStatus=readEspResponse();
00581             }
00582             while(tempEspStatus==UNKNOWN);
00583             if(tempEspStatus!=OK)//link broken, don't send more data to this link.
00584                 break;
00585 
00586             pageToSendAddress+=lenOfPacketToTx;
00587         }
00588         else
00589             break;
00590     }
00591     if(tempEspStatus==OK)
00592     {
00593         sprintf(atCommandArray,"AT+CIPCLOSE=%c\r\n",id);
00594         esp.printf(atCommandArray);
00595         while(readEspResponse()==UNKNOWN);
00596     }
00597 }
00598 
00599 void sendMemArrayToEsp(const char*str,unsigned int len)
00600 {
00601     while(len--)
00602         esp.putc(*str++);
00603 }
00604 
00605 void extractQueryFieldValue(char* someUrl,char* field, char* value)
00606 {   
00607     sscanf(someUrl,"%*[^?]%*c%[^=]%*c%s",field,value);
00608 }
00609 
00610 char toggleOutput(char* pinName)
00611 {
00612     if(strcmp(pinName,"dout1")==0)
00613     {
00614         digital_out_1=!digital_out_1;
00615         return !digital_out_1;
00616     }
00617     else if(strcmp(pinName,"dout2")==0)
00618     {
00619         digital_out_2=!digital_out_2;
00620         return !digital_out_2;
00621     }
00622     else if(strcmp(pinName,"dout3")==0)
00623     {
00624         digital_out_3=!digital_out_3;
00625         return !digital_out_3;
00626     }
00627     else if(strcmp(pinName,"dout4")==0)
00628     {
00629         digital_out_4=!digital_out_4;
00630         return !digital_out_4;
00631     }
00632     else return 2;//error
00633 
00634 }
00635  
00636