ESP8266 webserver using AT commands, can work with any mbed platform, tested on STM32F407 and LPC1768. Only need to update pin configuration to make it work for respective board.

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 #define BUFFER_SIZE 3000
00004 #define REQ_LINE_BUFF_SIZE 100
00005 #define UNKNOWN 0
00006 #define OK 1
00007 #define ERROR 2
00008 #define FAIL 3
00009 #define READY 4
00010 #define READY_TO_WRITE_TCP 5
00011 
00012 
00013 const char get_analog_outputs_status[]="/analog_outputs";
00014 const char get_Toggle_Output[]="/digital_outputs/toggle";
00015 const char get_analog_inputs_status[]="/analog_inputs";
00016 const char get_analog_output_update[]="/analog_outputs/update";
00017 const char get_digital_output_status[]="/digital_outputs";
00018 const char get_digital_inputs_html[]="/dinputs.html";
00019 const char get_digital_input_status[]="/digital_inputs";
00020 const char get_index_html[]="/index.html";
00021 const char get_analog_outputs[]="/anoutputs.html";
00022 const char get_analog_inputs_html[]="/aninputs.html";
00023 
00024 
00025 const char jsonHeader[]="HTTP/1.1 200 OK\n"
00026                         "Content-type: application/json\r\n\r\n";
00027 
00028 const char textPlainHeader[]="HTTP/1.1 200 OK\n"
00029                         "Content-type: text/plain\r\n\r\n";
00030 
00031 const char index_html[]="HTTP/1.1 200 OK\n"
00032                         "Content-type: text/html\r\n\r\n"
00033                         "<!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>";
00034 
00035 const char digitalInputs_html[]="HTTP/1.1 200 OK\n"
00036                         "Content-type: text/html\r\n\r\n"
00037                         "<!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>";
00038 
00039 const char analog_outputs_html[]="HTTP/1.1 200 OK\n"
00040                         "Content-type: text/html\r\n\r\n"
00041                         "<!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>";
00042 
00043 const char analog_inputs_html[]="HTTP/1.1 200 OK\n"
00044                         "Content-type: text/html\r\n\r\n"
00045                         "<!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>";
00046 
00047 const char style_css[]="HTTP/1.1 200 OK\n"
00048                         "Content-type: text/css\r\n\r\n"
00049                         "*{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}";
00050 
00051 const char not_found_text[]="HTTP/1.1 404 Not Found\n"
00052                             "Content-type: text/plain\r\n\r\n"
00053                             "page not found";
00054 
00055 //HTTP/1.1 200 OK
00056 //Content-type:image/jpeg
00057 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, 
00058                         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};
00059 
00060 // HTTP/1.1 200 OK
00061 //Content-type:image/x-icon
00062 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, 
00063     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};
00064 
00065 char rxBuff[BUFFER_SIZE];//array to store data received from esp
00066 char reqLineBuff[REQ_LINE_BUFF_SIZE];
00067 unsigned char reqLinBuffIndex=0;
00068 unsigned int bufferWritingIndex=0;//write pointer
00069 unsigned int bufferReadingIndex_IpdSearch=0;//read pointer
00070 unsigned int bufferReadingIndex_espRespSearch=0;//read pointer
00071 char serverIp[16];
00072 
00073 /********Serial ports to be used**************/
00074 Serial debug(PB_6,PB_7);//TO BE used for debug info
00075 Serial esp(PC_6,PC_7);//TX,RX TO BE CONNECTED TO ESP
00076 Serial esp2(PC_6,PC_7);//TX,RX TO BE CONNECTED TO ESP
00077 
00078 /*******Connections to relay*******************/
00079 //relay works at logic LOW
00080 DigitalOut digital_out_1(PD_0,1);// High on initialization
00081 DigitalOut digital_out_2(PD_1,1);// High on initialization
00082 DigitalOut digital_out_3(PD_2,1);// High on initialization
00083 DigitalOut digital_out_4(PD_3,1);// High on initialization
00084 
00085 /********digital inputs, connected to push buttons***********/
00086 DigitalIn digital_in_1(PD_8);
00087 DigitalIn digital_in_2(PD_9);
00088 DigitalIn digital_in_3(PC_10);
00089 DigitalIn digital_in_4(PC_11);
00090 
00091 /**********Analog output*******************/
00092 PwmOut analog_out_1(PB_8);
00093 
00094 /**********Analog Input*************/
00095 AnalogIn tempSensor(PB_1);
00096 
00097 Timer t;
00098 
00099 void espRxInterrupt();
00100 char readEspResponse();
00101 void handleHttpRequests();
00102 void processReqLine(char *stringToProcess);
00103 void sendMemArrayToEsp(const char*str,unsigned int len);
00104 void sendRequestedPageToClient(char id, const char* page,unsigned int len);
00105 void extractQueryFieldValue(char* someUrl,char* field, char* value);
00106 char toggleOutput(char* pinName);
00107 void sendDataToThingSpeak(char* dataToSend);
00108 
00109 int main(){
00110     //configure Pull down on all digital inputs
00111     digital_in_1.mode(PullDown);
00112     digital_in_2.mode(PullDown);
00113     digital_in_3.mode(PullDown);
00114     digital_in_4.mode(PullDown);
00115 
00116     //configure baud rate for UART
00117     esp.baud(230400);
00118     debug.baud(460800);
00119     esp2.attach(&espRxInterrupt,Serial::RxIrq);
00120 
00121     debug.printf("Sysem powerd up!\n");
00122 
00123     esp.printf("AT+RST\r\n");
00124     while(readEspResponse()!=READY);
00125     debug.printf("Reset success\n");
00126     
00127     esp.printf("ATE0\r\n");//disable ECHO
00128     while(readEspResponse()!=OK);
00129 
00130     esp.printf("AT+CWMODE=1\r\n");//enable station mode
00131     while(readEspResponse()!=OK);
00132 
00133     esp.printf("AT+CIPMUX=1\r\n");// enable multiple connections
00134     while(readEspResponse()!=OK);
00135 
00136     esp.printf("AT+CIPSERVER=1,80\r\n");//start server at port 80
00137     while(readEspResponse()!=OK);
00138     
00139     esp.printf("AT+CIPSTO=5\r\n");//Server timeout=5 seconds
00140     while(readEspResponse()!=OK);
00141 
00142     
00143 
00144     debug.printf("Connecting to WiFi..");
00145     esp.printf("AT+CWJAP_CUR=\"smart\",\"myPassword$$\"\r\n");
00146     char responseFromEsp;
00147     while(1)
00148     {
00149         responseFromEsp=readEspResponse();
00150         wait_ms(100);
00151         debug.putc('.');
00152         if(responseFromEsp==OK || responseFromEsp==FAIL)
00153             break;
00154     }
00155     debug.putc('\n');
00156     if(responseFromEsp==OK)
00157     {
00158         debug.printf("Connected to Wifi\n");
00159         __disable_irq();
00160         esp.printf("AT+CIFSR\r\n");//check obtained IP
00161         esp.scanf("+CIFSR:STAIP,\"%[^\"]",&serverIp);//+CIFSR:STAIP,"192.168.8.109"
00162         __enable_irq();
00163         while(readEspResponse()!=OK);       
00164     }
00165 
00166  
00167 
00168     char someArray[150];
00169     sprintf(someArray,"GET /update?api_key=ZAFRRYPMMEMXST4P&field2=%s\r\n\r\n",serverIp);
00170     sendDataToThingSpeak(someArray);
00171     debug.printf("Server IP is %s\n",serverIp);
00172         
00173     t.start();//start timer
00174     while(1){           
00175         handleHttpRequests();
00176         if(t.read()>30)//if 30 seconds passed
00177         {
00178             t.reset();//reset timer
00179             //now send temperature value to thingspeak
00180             sprintf(someArray,"GET /update?api_key=ZAFRRYPMMEMXST4P&field1=%.2f\r\n\r\n",((tempSensor*3.3)-0.500)*100.0);
00181             sendDataToThingSpeak(someArray);            
00182             debug.printf("temperature sent to thingspeak\n");
00183         }
00184 
00185     }
00186 }
00187 
00188 void espRxInterrupt(){
00189     if(esp2.readable())
00190     {
00191         rxBuff[bufferWritingIndex++]=esp2.getc();
00192         if(bufferWritingIndex>=BUFFER_SIZE)
00193             bufferWritingIndex=0;
00194     }
00195 
00196 }
00197 
00198 char readEspResponse(){
00199     char rxByte;
00200     char espResponse=UNKNOWN;
00201     static char state=0;
00202 
00203     while(bufferReadingIndex_espRespSearch!=bufferWritingIndex)
00204     {
00205         rxByte=rxBuff[bufferReadingIndex_espRespSearch++];
00206         //debug.putc(rxByte);
00207         if(bufferReadingIndex_espRespSearch>=BUFFER_SIZE)
00208             bufferReadingIndex_espRespSearch=0;
00209 
00210         switch(state)
00211         {
00212             case 0:
00213             if(rxByte=='O')//it may be OK response
00214                 state=1;
00215             else if(rxByte=='E')//it may be ERROR response
00216                 state=4;
00217             else if(rxByte=='F')//it may be FAIL response
00218                 state=10;
00219             else if(rxByte=='r')//it may be 'ready' response
00220                 state=15;
00221             else if(rxByte=='>')//it may be Ready To Write TCP '>' response
00222                 state=21;
00223             break;
00224 
00225             case 1:
00226             if(rxByte=='K')
00227                 state=2;
00228             else state=0;
00229             break;
00230 
00231             case 2:
00232             if(rxByte==0x0d)
00233                 state=3;
00234             else state=0;
00235             break;
00236 
00237             case 3:
00238             if(rxByte==0x0A)
00239                 espResponse=OK;
00240             state=0;
00241             break;
00242 
00243             case 4://ERROR
00244             if(rxByte=='R')
00245                 state=5;
00246             else state=0;
00247             break;
00248 
00249             case 5:
00250             if(rxByte=='R')
00251                 state=6;
00252             else state=0;
00253             break;
00254 
00255             case 6:
00256             if(rxByte=='O')
00257                 state=7;
00258             else state=0;
00259             break;
00260 
00261 
00262             case 7:
00263             if(rxByte=='R')
00264                 state=8;
00265             else state=0;
00266             break;
00267 
00268             case 8:
00269             if(rxByte==0x0d)
00270                 state=9;
00271             else state=0;
00272             break;
00273 
00274             case 9:
00275             if(rxByte==0x0A)
00276                 espResponse=ERROR;
00277             state=0;
00278             break;
00279 
00280 
00281             case 10://fail
00282             if(rxByte=='A')
00283                 state=11;
00284             else state=0;
00285             break;
00286 
00287 
00288             case 11:
00289             if(rxByte=='I')
00290                 state=12;
00291             else state=0;
00292             break;
00293 
00294 
00295             case 12:
00296             if(rxByte=='L')
00297                 state=13;
00298             else state=0;
00299             
00300             break;
00301 
00302             case 13:
00303             if(rxByte==0x0d)
00304                 state=14;
00305             else state=0;
00306             break;
00307 
00308             case 14:
00309             if(rxByte==0x0A)
00310                 espResponse=FAIL;
00311             state=0;
00312             break;
00313 
00314 
00315             case 15://READY
00316             if(rxByte=='e')
00317                 state=16;
00318             else state=0;
00319             break;
00320 
00321 
00322             case 16:
00323             if(rxByte=='a')
00324                 state=17;
00325             else state=0;
00326             break;
00327 
00328             case 17:
00329             if(rxByte=='d')
00330                 state=18;
00331             else state=0;
00332             break;
00333 
00334             case 18:
00335             if(rxByte=='y')
00336                 state=19;
00337             else  state=0;
00338             break;
00339 
00340             case 19:
00341             if(rxByte==0x0d)
00342                 state=20;
00343             else state=0;
00344             break;
00345 
00346             case 20:
00347             if(rxByte==0x0A)
00348                 espResponse=READY;
00349             state=0;
00350             break;         
00351 
00352             case 21:
00353             if(rxByte==0x20)
00354                 espResponse=READY_TO_WRITE_TCP;
00355             state=0;
00356 
00357             default:
00358             state=0;
00359             break;
00360         }
00361     }
00362     return espResponse;
00363 }
00364 
00365 
00366 
00367 void handleHttpRequests(){
00368     char rxByte;    
00369     static char state=0;
00370 
00371     while(bufferReadingIndex_IpdSearch!=bufferWritingIndex)
00372     {
00373         rxByte=rxBuff[bufferReadingIndex_IpdSearch++];
00374         //debug.putc(rxByte);
00375         if(bufferReadingIndex_IpdSearch>=BUFFER_SIZE)
00376             bufferReadingIndex_IpdSearch=0;
00377         switch(state)
00378         {
00379             case 0:
00380             if(rxByte=='+')
00381                 state=1;
00382             break;
00383 
00384             case 1:
00385             if(rxByte=='I')
00386                 state=2;
00387             else state=0;
00388             break;
00389 
00390             case 2:
00391             if(rxByte=='P')
00392                 state=3;
00393             else state=0;
00394             break;
00395 
00396             case 3:
00397             if(rxByte=='D')
00398                 state=4;
00399             else state=0;
00400             break;
00401 
00402             case 4:
00403             if(rxByte==',')
00404                 state=5;
00405             else state=0;
00406             break;
00407 
00408             case 5:
00409             if(rxByte!=0x0d)
00410             {
00411                 reqLineBuff[reqLinBuffIndex++]=rxByte;
00412             }
00413             else
00414             {
00415                 reqLineBuff[reqLinBuffIndex]=0x00;
00416                 bufferReadingIndex_espRespSearch=bufferReadingIndex_IpdSearch;
00417                 processReqLine(reqLineBuff);
00418                 state=0;
00419                 reqLinBuffIndex=0;
00420             }
00421         }
00422     }
00423 }
00424 
00425 void processReqLine(char *stringToProcess)
00426 {
00427 //0,416:GET /?led=ON HTTP/1.1
00428     char requestType[6];
00429     char request[50];
00430     char linkId;
00431     int ipdLen;
00432     sscanf(stringToProcess,"%c,%d:%s %s",&linkId,&ipdLen,requestType,request);
00433     debug.printf("%s\n",request);
00434     if(request!=NULL)
00435     {
00436         if(strcmp(request,"/")==0 || strcmp(request,get_index_html)==0)
00437         {
00438             //send index.html
00439             sendRequestedPageToClient(linkId,index_html,sizeof(index_html)-1);
00440         }
00441         else if(strcmp(request,get_digital_inputs_html)==0)
00442         {
00443             sendRequestedPageToClient(linkId,digitalInputs_html,sizeof(digitalInputs_html)-1);
00444         }
00445         else if(strcmp(request,get_analog_inputs_html)==0)
00446         {
00447             sendRequestedPageToClient(linkId,analog_inputs_html,sizeof(analog_inputs_html)-1);
00448 
00449         }
00450         else if(strcmp(request,get_analog_outputs)==0)
00451         {
00452             sendRequestedPageToClient(linkId,analog_outputs_html,sizeof(analog_outputs_html)-1);
00453         }
00454 
00455         else if(strcmp(request,"/images/logo.jpg")==0)
00456         {
00457             sendRequestedPageToClient(linkId,logo_jpg,sizeof(logo_jpg));
00458         }
00459         else if(strcmp(request,"/favicon.ico")==0)
00460         {
00461             sendRequestedPageToClient(linkId,favicon_ico,sizeof(favicon_ico));
00462         }
00463         else if(strcmp(request,"/css/style.css")==0)
00464         {
00465             sendRequestedPageToClient(linkId,style_css,sizeof(style_css)-1);
00466         }
00467         else if(strncmp(request,get_Toggle_Output,strlen(get_Toggle_Output))==0)
00468         {
00469             //check query field and value, and toggle appropriate Output
00470             char field[10],value[10];
00471             extractQueryFieldValue(request,field,value);
00472             if(value!=NULL)
00473             {
00474                 char newPinState=toggleOutput(value);
00475                 char responsePacket[100];
00476                 sprintf(responsePacket,"%s%c",textPlainHeader,newPinState+48);
00477                 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
00478             }
00479         }
00480         else if(strcmp(request,get_digital_output_status)==0)
00481         {
00482             //"{\"digital_outputs\":{\"dout1\":1,\"dout2\":0,\"dout3\":1,\"dout4\":1}}"
00483             char responsePacket[200];
00484             sprintf(responsePacket,"%s{\"digital_outputs\":{\"dout1\":%c,\
00485                             \"dout2\":%c,\"dout3\":%c,\"dout4\":%c}}",jsonHeader,(!digital_out_1)+48,
00486                             (!digital_out_2)+48,(!digital_out_3)+48,(!digital_out_4)+48);
00487             sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
00488         }
00489         else if(strcmp(request,get_digital_input_status)==0)
00490         {
00491             char responsePacket[200];
00492             sprintf(responsePacket,"%s{\"digital_inputs\":{\"din1\":%c,\
00493                             \"din2\":%c,\"din3\":%c,\"din4\":%c}}",jsonHeader,(digital_in_1)+48,
00494                             (digital_in_2)+48,(digital_in_3)+48,(digital_in_4)+48);
00495             sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
00496 
00497         }
00498         else if(strncmp(request,get_analog_output_update,strlen(get_analog_output_update))==0)
00499         {
00500             char field[10],value[10];
00501             extractQueryFieldValue(request,field,value);
00502             if(value!=NULL)
00503             {
00504                 analog_out_1=atof(value)/12.0;
00505                 char responsePacket[100];
00506                 sprintf(responsePacket,"%s%.2f",textPlainHeader,analog_out_1.read()*12.0);
00507                 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
00508             }
00509         }
00510         else if(strcmp(request,get_analog_outputs_status)==0)
00511         {           
00512             char responsePacket[100];
00513             sprintf(responsePacket,"%s%.2f",textPlainHeader,analog_out_1.read()*12.0);
00514             sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
00515         }
00516         else if(strcmp(request,get_analog_inputs_status)==0)
00517         {
00518             char responsePacket[100];           
00519             sprintf(responsePacket,"%s%.2f",textPlainHeader,((tempSensor*3.3)-0.500)*100.0);
00520             sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
00521         }
00522         else 
00523         {
00524             sendRequestedPageToClient(linkId,not_found_text,sizeof(not_found_text)-1);
00525             //send page not found message
00526         }
00527     }
00528 }
00529 
00530 
00531 void sendRequestedPageToClient(char id, const char* page,unsigned int len)
00532 {
00533     char atCommandArray[50];
00534     unsigned int lenOfPacketToTx;
00535     unsigned int pageToSendAddress=0;
00536     char tempEspStatus;
00537     while(len>0)
00538     {
00539         if(len>2048){
00540             len-=2048;        
00541             lenOfPacketToTx=2048;
00542         }
00543         else{
00544             lenOfPacketToTx=len;
00545             len=0;
00546         }
00547         
00548         sprintf(atCommandArray,"AT+CIPSEND=%c,%d\r\n",id,lenOfPacketToTx);  
00549         bufferReadingIndex_espRespSearch=bufferWritingIndex;
00550         esp.printf(atCommandArray);
00551      
00552         while(1)
00553         {
00554             tempEspStatus=readEspResponse();  
00555             if(tempEspStatus==READY_TO_WRITE_TCP||tempEspStatus==ERROR ||tempEspStatus==FAIL)
00556                 break;
00557         }    
00558         //now send page
00559         if(tempEspStatus==READY_TO_WRITE_TCP)
00560         {
00561             sendMemArrayToEsp(page+pageToSendAddress,lenOfPacketToTx);
00562             do{
00563                 tempEspStatus=readEspResponse();
00564             }
00565             while(tempEspStatus==UNKNOWN);
00566             if(tempEspStatus!=OK)//link broken, don't send more data to this link.
00567                 break;
00568 
00569             pageToSendAddress+=lenOfPacketToTx;
00570         }
00571         else
00572             break;
00573     }
00574     if(tempEspStatus==OK)
00575     {
00576         sprintf(atCommandArray,"AT+CIPCLOSE=%c\r\n",id);
00577         esp.printf(atCommandArray);
00578         while(readEspResponse()==UNKNOWN);
00579     }
00580 }
00581 
00582 void sendMemArrayToEsp(const char*str,unsigned int len)
00583 {
00584     while(len--)
00585         esp.putc(*str++);
00586 }
00587 
00588 void extractQueryFieldValue(char* someUrl,char* field, char* value)
00589 {   
00590     sscanf(someUrl,"%*[^?]%*c%[^=]%*c%s",field,value);
00591 }
00592 
00593 char toggleOutput(char* pinName)
00594 {
00595     if(strcmp(pinName,"dout1")==0)
00596     {
00597         digital_out_1=!digital_out_1;
00598         return !digital_out_1;
00599     }
00600     else if(strcmp(pinName,"dout2")==0)
00601     {
00602         digital_out_2=!digital_out_2;
00603         return !digital_out_2;
00604     }
00605     else if(strcmp(pinName,"dout3")==0)
00606     {
00607         digital_out_3=!digital_out_3;
00608         return !digital_out_3;
00609     }
00610     else if(strcmp(pinName,"dout4")==0)
00611     {
00612         digital_out_4=!digital_out_4;
00613         return !digital_out_4;
00614     }
00615     else return 2;//error
00616 
00617 }
00618 
00619 
00620 
00621 void sendDataToThingSpeak(char* dataToSend)
00622 {
00623     //first stop server
00624     char responseFromEsp;
00625     esp.printf("AT+CIPSERVER=0\r\n");
00626     while(readEspResponse()!=OK);    
00627 
00628     esp.printf("AT+CIPSTART=4,\"TCP\",\"api.thingspeak.com\",80\r\n\r\n");
00629     do{
00630         responseFromEsp=readEspResponse();
00631     }while(responseFromEsp==UNKNOWN);
00632 
00633     if(responseFromEsp==OK)//connect success to thingspeak
00634     {
00635         sendRequestedPageToClient('4',dataToSend,strlen(dataToSend));       
00636     }
00637 
00638     //Restart server
00639     esp.printf("AT+CIPSERVER=1,80\r\n");//start server at port 80
00640     while(readEspResponse()!=OK);
00641 }