Webserver only w/o any other functions, single thread. Running on STM32F013+W5500

Dependencies:   NTPClient W5500Interface Watchdog device_configuration eeprom_flash mbed-rpc-nucleo mbed-rtos mbed

Fork of F103-Serial-to-Ethernet by Chau Vo

Committer:
olympux
Date:
Fri Aug 19 20:17:00 2016 +0000
Revision:
47:d92d2c5b8073
Parent:
46:971bdaa3507c
forked to create a new repo for webserver on F103+W5500. No other functions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
olympux 40:c966abbe2d62 1 #include "Formatter.h"
olympux 40:c966abbe2d62 2 #include "mbed.h"
olympux 40:c966abbe2d62 3 #include "RPCObjectManager.h"
olympux 40:c966abbe2d62 4 #include "EthernetInterface.h"
olympux 40:c966abbe2d62 5
olympux 42:d0ff08711ca5 6 /*
olympux 40:c966abbe2d62 7 const char *SIMPLE_HTML_CODE = "\
olympux 40:c966abbe2d62 8 <!DOCTYPE html>\
olympux 40:c966abbe2d62 9 <html>\
olympux 40:c966abbe2d62 10 <head>\
olympux 40:c966abbe2d62 11 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\
olympux 40:c966abbe2d62 12 <title>TCP Server</title>\
olympux 40:c966abbe2d62 13 </head>\
olympux 40:c966abbe2d62 14 <body>";
olympux 40:c966abbe2d62 15
olympux 40:c966abbe2d62 16
olympux 40:c966abbe2d62 17 const char* INTERACTIVE_HTML_CODE_1 = "\
olympux 40:c966abbe2d62 18 <!DOCTYPE html> \
olympux 40:c966abbe2d62 19 <html>\
olympux 40:c966abbe2d62 20 <head>\
olympux 40:c966abbe2d62 21 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\
olympux 40:c966abbe2d62 22 <title>TCP Server</title>\
olympux 40:c966abbe2d62 23 <script type=\"text/javascript\">\
olympux 40:c966abbe2d62 24 var ip = \"%s\";\
olympux 40:c966abbe2d62 25 function submitCreateForm()\
olympux 40:c966abbe2d62 26 {\
olympux 40:c966abbe2d62 27 var list = document.getElementById(\"type\");\
olympux 40:c966abbe2d62 28 var type = list.options[list.selectedIndex].value;\
olympux 40:c966abbe2d62 29 var name = document.getElementById(\"name\").value;\
olympux 40:c966abbe2d62 30 if(name === \"\") \
olympux 40:c966abbe2d62 31 return;\
olympux 40:c966abbe2d62 32 var arg = document.getElementById(\"arg\").value;\
olympux 40:c966abbe2d62 33 var url;\
olympux 40:c966abbe2d62 34 if(arg === \"\") url = \"http://\" + ip + type + \"new?name=\" + name;\
olympux 40:c966abbe2d62 35 else url = \"http://\" + ip + type + \"new?arg=\" + arg + \"&name=\" + name;\
olympux 40:c966abbe2d62 36 location.href= url;\
olympux 40:c966abbe2d62 37 }\
olympux 40:c966abbe2d62 38 function submitCallFuncForm()\
olympux 40:c966abbe2d62 39 {\
olympux 40:c966abbe2d62 40 var command = document.getElementById(\"command\").value;\
olympux 40:c966abbe2d62 41 if(command === \"\") \
olympux 40:c966abbe2d62 42 return; \
olympux 40:c966abbe2d62 43 var tmp = command.split(\' \');\
olympux 40:c966abbe2d62 44 var url = tmp[0];\
olympux 40:c966abbe2d62 45 if(tmp.length > 1)\
olympux 40:c966abbe2d62 46 url += \"?\";\
olympux 40:c966abbe2d62 47 for(var i = 1; i < tmp.length; ++i)\
olympux 40:c966abbe2d62 48 {\
olympux 40:c966abbe2d62 49 url += \"arg\" + i + \"=\" + tmp[i];\
olympux 40:c966abbe2d62 50 if(i+1 < tmp.length)\
olympux 40:c966abbe2d62 51 url += \"&\";\
olympux 40:c966abbe2d62 52 }\
olympux 40:c966abbe2d62 53 location.href = url;\
olympux 40:c966abbe2d62 54 }\
olympux 40:c966abbe2d62 55 </script>\
olympux 40:c966abbe2d62 56 </head> \
olympux 40:c966abbe2d62 57 <body>";
olympux 40:c966abbe2d62 58
olympux 40:c966abbe2d62 59 const char* INTERACTIVE_HTML_CODE_2 = "<h3>Create Object :</h3>\
olympux 40:c966abbe2d62 60 <form>\
olympux 40:c966abbe2d62 61 Type: <select id=\"type\">\
olympux 40:c966abbe2d62 62 <option value=\"/DigitalOut/\">DigitalOut</option>\
olympux 40:c966abbe2d62 63 <option value=\"/DigitalIn/\">DigitalIn</option>\
olympux 40:c966abbe2d62 64 <option value=\"/DigitalInOut/\">DigitalInOut</option>\
olympux 40:c966abbe2d62 65 <option value=\"/AnalogIn/\">AnalogIn</option>\
olympux 40:c966abbe2d62 66 <option value=\"/PwmOut/\">PwmOut</option>\
olympux 40:c966abbe2d62 67 <option value=\"/Timer/\">Timer</option>\
olympux 40:c966abbe2d62 68 </select><br>\
olympux 40:c966abbe2d62 69 name: <input type=\"text\" id=\"name\"><br>\
olympux 40:c966abbe2d62 70 arg(optional): <input type=\"text\" id=\"arg\">\
olympux 40:c966abbe2d62 71 <p><input type=\"button\" value=\"Create\" onclick=\"javascript:submitCreateForm();\"></p>\
olympux 40:c966abbe2d62 72 </form> \
olympux 40:c966abbe2d62 73 \
olympux 40:c966abbe2d62 74 <h3>Call a function :</h3>\
olympux 40:c966abbe2d62 75 <p>Enter an RPC command.</p>\
olympux 40:c966abbe2d62 76 <form>\
olympux 40:c966abbe2d62 77 Command: <input type= \"text\" id=\"command\" maxlength=127><br>\
olympux 40:c966abbe2d62 78 <p><input type=\"button\" value=\"Send\" onclick=\"javascript:submitCallFuncForm();\"></p><br>\
olympux 40:c966abbe2d62 79 </form>\
olympux 40:c966abbe2d62 80 </body> \
olympux 40:c966abbe2d62 81 </html>";
olympux 42:d0ff08711ca5 82 */
olympux 40:c966abbe2d62 83
olympux 42:d0ff08711ca5 84
olympux 42:d0ff08711ca5 85 const char *SIMPLE_HTML_CODE = "\
olympux 42:d0ff08711ca5 86 <!DOCTYPE html>\
olympux 42:d0ff08711ca5 87 <html>\
olympux 42:d0ff08711ca5 88 <head>\
olympux 42:d0ff08711ca5 89 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\
olympux 42:d0ff08711ca5 90 <title>NNIO Server</title>\
olympux 42:d0ff08711ca5 91 </head>\
olympux 42:d0ff08711ca5 92 <body>";
olympux 42:d0ff08711ca5 93
olympux 42:d0ff08711ca5 94
olympux 42:d0ff08711ca5 95 const char* INTERACTIVE_HTML_CODE_1 = "\
olympux 42:d0ff08711ca5 96 <!DOCTYPE html> \
olympux 42:d0ff08711ca5 97 <html>\
olympux 42:d0ff08711ca5 98 <head>\
olympux 42:d0ff08711ca5 99 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\
olympux 42:d0ff08711ca5 100 <title>TCP Server</title>\
olympux 42:d0ff08711ca5 101 <script type=\"text/javascript\">\
olympux 42:d0ff08711ca5 102 var ip = \"%s\";\
olympux 42:d0ff08711ca5 103 function submitDeviceConfigurationForm()\
olympux 42:d0ff08711ca5 104 {\
olympux 42:d0ff08711ca5 105 return;\
olympux 42:d0ff08711ca5 106 }\
olympux 42:d0ff08711ca5 107 function submitCreateForm()\
olympux 42:d0ff08711ca5 108 {\
olympux 42:d0ff08711ca5 109 var list = document.getElementById(\"type\");\
olympux 42:d0ff08711ca5 110 var type = list.options[list.selectedIndex].value;\
olympux 42:d0ff08711ca5 111 var name = document.getElementById(\"name\").value;\
olympux 42:d0ff08711ca5 112 if(name === \"\") \
olympux 42:d0ff08711ca5 113 return;\
olympux 42:d0ff08711ca5 114 var arg = document.getElementById(\"arg\").value;\
olympux 42:d0ff08711ca5 115 var url;\
olympux 42:d0ff08711ca5 116 if(arg === \"\") url = \"http://\" + ip + type + \"new?name=\" + name;\
olympux 42:d0ff08711ca5 117 else url = \"http://\" + ip + type + \"new?arg=\" + arg + \"&name=\" + name;\
olympux 42:d0ff08711ca5 118 location.href= url;\
olympux 42:d0ff08711ca5 119 }\
olympux 42:d0ff08711ca5 120 function submitCallFuncForm()\
olympux 42:d0ff08711ca5 121 {\
olympux 42:d0ff08711ca5 122 var command = document.getElementById(\"command\").value;\
olympux 42:d0ff08711ca5 123 if(command === \"\") \
olympux 42:d0ff08711ca5 124 return; \
olympux 42:d0ff08711ca5 125 var tmp = command.split(\' \');\
olympux 42:d0ff08711ca5 126 var url = tmp[0];\
olympux 42:d0ff08711ca5 127 if(tmp.length > 1)\
olympux 42:d0ff08711ca5 128 url += \"?\";\
olympux 42:d0ff08711ca5 129 for(var i = 1; i < tmp.length; ++i)\
olympux 42:d0ff08711ca5 130 {\
olympux 42:d0ff08711ca5 131 url += \"arg\" + i + \"=\" + tmp[i];\
olympux 42:d0ff08711ca5 132 if(i+1 < tmp.length)\
olympux 42:d0ff08711ca5 133 url += \"&\";\
olympux 42:d0ff08711ca5 134 }\
olympux 42:d0ff08711ca5 135 location.href = url;\
olympux 42:d0ff08711ca5 136 }\
olympux 42:d0ff08711ca5 137 </script>\
olympux 42:d0ff08711ca5 138 </head> \
olympux 42:d0ff08711ca5 139 <body>";
olympux 42:d0ff08711ca5 140
olympux 45:8d18a95fcf8a 141 const char* INTERACTIVE_HTML_CODE_2 = "<h3>Device Configuration (not yet)</h3>\
olympux 42:d0ff08711ca5 142 <form>\
olympux 46:971bdaa3507c 143 IP (x.x.x.x): <input type=\"text\" id=\"ipaddr\"><br>\
olympux 42:d0ff08711ca5 144 Subnet (x.x.x.x): <input type=\"text\" id=\"subnet\"><br>\
olympux 42:d0ff08711ca5 145 Gateway (x.x.x.x): <input type=\"text\" id=\"gateway\"><br>\
olympux 42:d0ff08711ca5 146 MAC (x.x.x): <input type=\"text\" id=\"mac\">\
olympux 42:d0ff08711ca5 147 <p><input type=\"button\" value=\"Save\" onclick=\"javascript:submitDeviceConfigurationForm();\"></p>\
olympux 42:d0ff08711ca5 148 </form> \
olympux 42:d0ff08711ca5 149 \
olympux 42:d0ff08711ca5 150 <h3>Create Object</h3>\
olympux 42:d0ff08711ca5 151 <form>\
olympux 42:d0ff08711ca5 152 Type: <select id=\"type\">\
olympux 42:d0ff08711ca5 153 <option value=\"/DigitalOut/\">DigitalOut</option>\
olympux 42:d0ff08711ca5 154 <option value=\"/DigitalIn/\">DigitalIn</option>\
olympux 42:d0ff08711ca5 155 <option value=\"/DigitalInOut/\">DigitalInOut</option>\
olympux 42:d0ff08711ca5 156 <option value=\"/AnalogIn/\">AnalogIn</option>\
olympux 42:d0ff08711ca5 157 <option value=\"/PwmOut/\">PwmOut</option>\
olympux 42:d0ff08711ca5 158 <option value=\"/Timer/\">Timer</option>\
olympux 42:d0ff08711ca5 159 </select><br>\
olympux 42:d0ff08711ca5 160 name: <input type=\"text\" id=\"name\"><br>\
olympux 42:d0ff08711ca5 161 arg(optional): <input type=\"text\" id=\"arg\">\
olympux 42:d0ff08711ca5 162 <p><input type=\"button\" value=\"Create\" onclick=\"javascript:submitCreateForm();\"></p>\
olympux 42:d0ff08711ca5 163 </form> \
olympux 42:d0ff08711ca5 164 \
olympux 42:d0ff08711ca5 165 <h3>Call a function</h3>\
olympux 42:d0ff08711ca5 166 <p>Enter an RPC command.</p>\
olympux 42:d0ff08711ca5 167 <form>\
olympux 42:d0ff08711ca5 168 Command: <input type= \"text\" id=\"command\" maxlength=127><br>\
olympux 42:d0ff08711ca5 169 <p><input type=\"button\" value=\"Send\" onclick=\"javascript:submitCallFuncForm();\"></p><br>\
olympux 42:d0ff08711ca5 170 </form>\
olympux 42:d0ff08711ca5 171 </body> \
olympux 42:d0ff08711ca5 172 </html>";
olympux 42:d0ff08711ca5 173
olympux 42:d0ff08711ca5 174
olympux 42:d0ff08711ca5 175 static char chunk[2048]; // Need to update according to HTML content
olympux 40:c966abbe2d62 176
olympux 40:c966abbe2d62 177 Formatter::Formatter(int nb):
olympux 40:c966abbe2d62 178 currentChunk(0),
olympux 40:c966abbe2d62 179 nbChunk(nb)
olympux 40:c966abbe2d62 180 {
olympux 40:c966abbe2d62 181 }
olympux 40:c966abbe2d62 182
olympux 40:c966abbe2d62 183 char* Formatter::get_page(char *reply)
olympux 40:c966abbe2d62 184 {
olympux 40:c966abbe2d62 185 chunk[0] = '\0';
olympux 40:c966abbe2d62 186
olympux 40:c966abbe2d62 187 if(currentChunk < nbChunk)
olympux 40:c966abbe2d62 188 {
olympux 40:c966abbe2d62 189 get_chunk(currentChunk, reply);
olympux 40:c966abbe2d62 190 currentChunk++;
olympux 40:c966abbe2d62 191 }
olympux 40:c966abbe2d62 192 else
olympux 40:c966abbe2d62 193 currentChunk = 0;
olympux 40:c966abbe2d62 194
olympux 40:c966abbe2d62 195 return chunk;
olympux 40:c966abbe2d62 196 }
olympux 40:c966abbe2d62 197
olympux 40:c966abbe2d62 198 void Formatter::get_chunk(const int c, char *reply)
olympux 40:c966abbe2d62 199 {
olympux 40:c966abbe2d62 200 strcat(chunk, reply);
olympux 40:c966abbe2d62 201 }
olympux 40:c966abbe2d62 202
olympux 40:c966abbe2d62 203 SimpleHTMLFormatter::SimpleHTMLFormatter():
olympux 40:c966abbe2d62 204 Formatter()
olympux 40:c966abbe2d62 205 {
olympux 40:c966abbe2d62 206 }
olympux 40:c966abbe2d62 207
olympux 40:c966abbe2d62 208 void SimpleHTMLFormatter::get_chunk(const int c, char* reply)
olympux 40:c966abbe2d62 209 {
olympux 40:c966abbe2d62 210 strcat(chunk, SIMPLE_HTML_CODE);
olympux 40:c966abbe2d62 211
olympux 40:c966abbe2d62 212 if(reply != NULL && strlen(reply) != 0)
olympux 40:c966abbe2d62 213 {
olympux 40:c966abbe2d62 214 strcat(chunk, "RPC reply : ");
olympux 40:c966abbe2d62 215 strcat(chunk, reply);
olympux 40:c966abbe2d62 216 }
olympux 40:c966abbe2d62 217
olympux 40:c966abbe2d62 218 if(!RPCObjectManager::instance().is_empty())
olympux 40:c966abbe2d62 219 {
olympux 40:c966abbe2d62 220 strcat(chunk, "<ul>");
olympux 40:c966abbe2d62 221 for(std::list<char*>::iterator itor = RPCObjectManager::instance().begin();
olympux 40:c966abbe2d62 222 itor != RPCObjectManager::instance().end();
olympux 40:c966abbe2d62 223 ++itor)
olympux 40:c966abbe2d62 224 {
olympux 40:c966abbe2d62 225 strcat(chunk, "<li>");
olympux 40:c966abbe2d62 226 strcat(chunk, *itor);
olympux 40:c966abbe2d62 227 strcat(chunk, "</li>");
olympux 40:c966abbe2d62 228 }
olympux 40:c966abbe2d62 229 strcat(chunk, "</ul>");
olympux 40:c966abbe2d62 230 }
olympux 40:c966abbe2d62 231
olympux 40:c966abbe2d62 232 strcat(chunk, "</body></html>");
olympux 40:c966abbe2d62 233 }
olympux 40:c966abbe2d62 234
olympux 40:c966abbe2d62 235 InteractiveHTMLFormatter::InteractiveHTMLFormatter():
olympux 40:c966abbe2d62 236 Formatter(3)
olympux 40:c966abbe2d62 237 {
olympux 40:c966abbe2d62 238 }
olympux 40:c966abbe2d62 239
olympux 40:c966abbe2d62 240 void InteractiveHTMLFormatter::get_chunk(const int c, char *reply)
olympux 40:c966abbe2d62 241 {
olympux 40:c966abbe2d62 242 if(c == 0)
olympux 40:c966abbe2d62 243 //sprintf(chunk, INTERACTIVE_HTML_CODE_1, EthernetInterface::getIPAddress());
olympux 40:c966abbe2d62 244 sprintf(chunk, INTERACTIVE_HTML_CODE_1, eth.getIPAddress());
olympux 40:c966abbe2d62 245
olympux 40:c966abbe2d62 246 else if(c == 1)
olympux 40:c966abbe2d62 247 {
olympux 40:c966abbe2d62 248 if(reply != NULL && strlen(reply) != 0)
olympux 40:c966abbe2d62 249 {
olympux 40:c966abbe2d62 250 strcat(chunk, "RPC reply : ");
olympux 40:c966abbe2d62 251 strcat(chunk, reply);
olympux 40:c966abbe2d62 252 }
olympux 40:c966abbe2d62 253 if(!RPCObjectManager::instance().is_empty())
olympux 40:c966abbe2d62 254 {
olympux 40:c966abbe2d62 255 strcat(chunk, "<p>Objects created :</p>");
olympux 40:c966abbe2d62 256
olympux 40:c966abbe2d62 257 strcat(chunk, "<ul>");
olympux 40:c966abbe2d62 258 for(std::list<char*>::iterator itor = RPCObjectManager::instance().begin();
olympux 40:c966abbe2d62 259 itor != RPCObjectManager::instance().end();
olympux 40:c966abbe2d62 260 ++itor)
olympux 40:c966abbe2d62 261 {
olympux 40:c966abbe2d62 262 strcat(chunk, "<li>");
olympux 40:c966abbe2d62 263 strcat(chunk, *itor);
olympux 40:c966abbe2d62 264 strcat(chunk, " (<a href=\"http://");
olympux 40:c966abbe2d62 265 //strcat(chunk, EthernetInterface::getIPAddress());
olympux 40:c966abbe2d62 266 strcat(chunk, eth.getIPAddress());
olympux 40:c966abbe2d62 267 strcat(chunk, "/");
olympux 40:c966abbe2d62 268 strcat(chunk, *itor);
olympux 40:c966abbe2d62 269 strcat(chunk, "/delete\">delete</a>)");
olympux 40:c966abbe2d62 270 strcat(chunk, "</li>");
olympux 40:c966abbe2d62 271 }
olympux 40:c966abbe2d62 272 strcat(chunk, "</ul>");
olympux 40:c966abbe2d62 273 }
olympux 40:c966abbe2d62 274 strcat(chunk, " ");
olympux 40:c966abbe2d62 275 }
olympux 40:c966abbe2d62 276 else if(c == 2)
olympux 40:c966abbe2d62 277 strcat(chunk, INTERACTIVE_HTML_CODE_2);
olympux 40:c966abbe2d62 278 }
olympux 40:c966abbe2d62 279
olympux 40:c966abbe2d62 280