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:
Thu Jun 16 08:38:31 2016 +0000
Revision:
40:c966abbe2d62
Child:
42:d0ff08711ca5
Working with a few issues:; - Added RPC AnalogIn, wdt reset when creating new object on PC_0; - Added creating RPC string but not tested yet

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 40:c966abbe2d62 6 const char *SIMPLE_HTML_CODE = "\
olympux 40:c966abbe2d62 7 <!DOCTYPE html>\
olympux 40:c966abbe2d62 8 <html>\
olympux 40:c966abbe2d62 9 <head>\
olympux 40:c966abbe2d62 10 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\
olympux 40:c966abbe2d62 11 <title>TCP Server</title>\
olympux 40:c966abbe2d62 12 </head>\
olympux 40:c966abbe2d62 13 <body>";
olympux 40:c966abbe2d62 14
olympux 40:c966abbe2d62 15
olympux 40:c966abbe2d62 16 const char* INTERACTIVE_HTML_CODE_1 = "\
olympux 40:c966abbe2d62 17 <!DOCTYPE html> \
olympux 40:c966abbe2d62 18 <html>\
olympux 40:c966abbe2d62 19 <head>\
olympux 40:c966abbe2d62 20 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\
olympux 40:c966abbe2d62 21 <title>TCP Server</title>\
olympux 40:c966abbe2d62 22 <script type=\"text/javascript\">\
olympux 40:c966abbe2d62 23 var ip = \"%s\";\
olympux 40:c966abbe2d62 24 function submitCreateForm()\
olympux 40:c966abbe2d62 25 {\
olympux 40:c966abbe2d62 26 var list = document.getElementById(\"type\");\
olympux 40:c966abbe2d62 27 var type = list.options[list.selectedIndex].value;\
olympux 40:c966abbe2d62 28 var name = document.getElementById(\"name\").value;\
olympux 40:c966abbe2d62 29 if(name === \"\") \
olympux 40:c966abbe2d62 30 return;\
olympux 40:c966abbe2d62 31 var arg = document.getElementById(\"arg\").value;\
olympux 40:c966abbe2d62 32 var url;\
olympux 40:c966abbe2d62 33 if(arg === \"\") url = \"http://\" + ip + type + \"new?name=\" + name;\
olympux 40:c966abbe2d62 34 else url = \"http://\" + ip + type + \"new?arg=\" + arg + \"&name=\" + name;\
olympux 40:c966abbe2d62 35 location.href= url;\
olympux 40:c966abbe2d62 36 }\
olympux 40:c966abbe2d62 37 function submitCallFuncForm()\
olympux 40:c966abbe2d62 38 {\
olympux 40:c966abbe2d62 39 var command = document.getElementById(\"command\").value;\
olympux 40:c966abbe2d62 40 if(command === \"\") \
olympux 40:c966abbe2d62 41 return; \
olympux 40:c966abbe2d62 42 var tmp = command.split(\' \');\
olympux 40:c966abbe2d62 43 var url = tmp[0];\
olympux 40:c966abbe2d62 44 if(tmp.length > 1)\
olympux 40:c966abbe2d62 45 url += \"?\";\
olympux 40:c966abbe2d62 46 for(var i = 1; i < tmp.length; ++i)\
olympux 40:c966abbe2d62 47 {\
olympux 40:c966abbe2d62 48 url += \"arg\" + i + \"=\" + tmp[i];\
olympux 40:c966abbe2d62 49 if(i+1 < tmp.length)\
olympux 40:c966abbe2d62 50 url += \"&\";\
olympux 40:c966abbe2d62 51 }\
olympux 40:c966abbe2d62 52 location.href = url;\
olympux 40:c966abbe2d62 53 }\
olympux 40:c966abbe2d62 54 </script>\
olympux 40:c966abbe2d62 55 </head> \
olympux 40:c966abbe2d62 56 <body>";
olympux 40:c966abbe2d62 57
olympux 40:c966abbe2d62 58 const char* INTERACTIVE_HTML_CODE_2 = "<h3>Create Object :</h3>\
olympux 40:c966abbe2d62 59 <form>\
olympux 40:c966abbe2d62 60 Type: <select id=\"type\">\
olympux 40:c966abbe2d62 61 <option value=\"/DigitalOut/\">DigitalOut</option>\
olympux 40:c966abbe2d62 62 <option value=\"/DigitalIn/\">DigitalIn</option>\
olympux 40:c966abbe2d62 63 <option value=\"/DigitalInOut/\">DigitalInOut</option>\
olympux 40:c966abbe2d62 64 <option value=\"/AnalogIn/\">AnalogIn</option>\
olympux 40:c966abbe2d62 65 <option value=\"/PwmOut/\">PwmOut</option>\
olympux 40:c966abbe2d62 66 <option value=\"/Timer/\">Timer</option>\
olympux 40:c966abbe2d62 67 </select><br>\
olympux 40:c966abbe2d62 68 name: <input type=\"text\" id=\"name\"><br>\
olympux 40:c966abbe2d62 69 arg(optional): <input type=\"text\" id=\"arg\">\
olympux 40:c966abbe2d62 70 <p><input type=\"button\" value=\"Create\" onclick=\"javascript:submitCreateForm();\"></p>\
olympux 40:c966abbe2d62 71 </form> \
olympux 40:c966abbe2d62 72 \
olympux 40:c966abbe2d62 73 <h3>Call a function :</h3>\
olympux 40:c966abbe2d62 74 <p>Enter an RPC command.</p>\
olympux 40:c966abbe2d62 75 <form>\
olympux 40:c966abbe2d62 76 Command: <input type= \"text\" id=\"command\" maxlength=127><br>\
olympux 40:c966abbe2d62 77 <p><input type=\"button\" value=\"Send\" onclick=\"javascript:submitCallFuncForm();\"></p><br>\
olympux 40:c966abbe2d62 78 </form>\
olympux 40:c966abbe2d62 79 </body> \
olympux 40:c966abbe2d62 80 </html>";
olympux 40:c966abbe2d62 81
olympux 40:c966abbe2d62 82 static char chunk[1024];
olympux 40:c966abbe2d62 83
olympux 40:c966abbe2d62 84 Formatter::Formatter(int nb):
olympux 40:c966abbe2d62 85 currentChunk(0),
olympux 40:c966abbe2d62 86 nbChunk(nb)
olympux 40:c966abbe2d62 87 {
olympux 40:c966abbe2d62 88 }
olympux 40:c966abbe2d62 89
olympux 40:c966abbe2d62 90 char* Formatter::get_page(char *reply)
olympux 40:c966abbe2d62 91 {
olympux 40:c966abbe2d62 92 chunk[0] = '\0';
olympux 40:c966abbe2d62 93
olympux 40:c966abbe2d62 94 if(currentChunk < nbChunk)
olympux 40:c966abbe2d62 95 {
olympux 40:c966abbe2d62 96 get_chunk(currentChunk, reply);
olympux 40:c966abbe2d62 97 currentChunk++;
olympux 40:c966abbe2d62 98 }
olympux 40:c966abbe2d62 99 else
olympux 40:c966abbe2d62 100 currentChunk = 0;
olympux 40:c966abbe2d62 101
olympux 40:c966abbe2d62 102 return chunk;
olympux 40:c966abbe2d62 103 }
olympux 40:c966abbe2d62 104
olympux 40:c966abbe2d62 105 void Formatter::get_chunk(const int c, char *reply)
olympux 40:c966abbe2d62 106 {
olympux 40:c966abbe2d62 107 strcat(chunk, reply);
olympux 40:c966abbe2d62 108 }
olympux 40:c966abbe2d62 109
olympux 40:c966abbe2d62 110 SimpleHTMLFormatter::SimpleHTMLFormatter():
olympux 40:c966abbe2d62 111 Formatter()
olympux 40:c966abbe2d62 112 {
olympux 40:c966abbe2d62 113 }
olympux 40:c966abbe2d62 114
olympux 40:c966abbe2d62 115 void SimpleHTMLFormatter::get_chunk(const int c, char* reply)
olympux 40:c966abbe2d62 116 {
olympux 40:c966abbe2d62 117 strcat(chunk, SIMPLE_HTML_CODE);
olympux 40:c966abbe2d62 118
olympux 40:c966abbe2d62 119 if(reply != NULL && strlen(reply) != 0)
olympux 40:c966abbe2d62 120 {
olympux 40:c966abbe2d62 121 strcat(chunk, "RPC reply : ");
olympux 40:c966abbe2d62 122 strcat(chunk, reply);
olympux 40:c966abbe2d62 123 }
olympux 40:c966abbe2d62 124
olympux 40:c966abbe2d62 125 if(!RPCObjectManager::instance().is_empty())
olympux 40:c966abbe2d62 126 {
olympux 40:c966abbe2d62 127 strcat(chunk, "<ul>");
olympux 40:c966abbe2d62 128 for(std::list<char*>::iterator itor = RPCObjectManager::instance().begin();
olympux 40:c966abbe2d62 129 itor != RPCObjectManager::instance().end();
olympux 40:c966abbe2d62 130 ++itor)
olympux 40:c966abbe2d62 131 {
olympux 40:c966abbe2d62 132 strcat(chunk, "<li>");
olympux 40:c966abbe2d62 133 strcat(chunk, *itor);
olympux 40:c966abbe2d62 134 strcat(chunk, "</li>");
olympux 40:c966abbe2d62 135 }
olympux 40:c966abbe2d62 136 strcat(chunk, "</ul>");
olympux 40:c966abbe2d62 137 }
olympux 40:c966abbe2d62 138
olympux 40:c966abbe2d62 139 strcat(chunk, "</body></html>");
olympux 40:c966abbe2d62 140 }
olympux 40:c966abbe2d62 141
olympux 40:c966abbe2d62 142 InteractiveHTMLFormatter::InteractiveHTMLFormatter():
olympux 40:c966abbe2d62 143 Formatter(3)
olympux 40:c966abbe2d62 144 {
olympux 40:c966abbe2d62 145 }
olympux 40:c966abbe2d62 146
olympux 40:c966abbe2d62 147 void InteractiveHTMLFormatter::get_chunk(const int c, char *reply)
olympux 40:c966abbe2d62 148 {
olympux 40:c966abbe2d62 149 if(c == 0)
olympux 40:c966abbe2d62 150 //sprintf(chunk, INTERACTIVE_HTML_CODE_1, EthernetInterface::getIPAddress());
olympux 40:c966abbe2d62 151 sprintf(chunk, INTERACTIVE_HTML_CODE_1, eth.getIPAddress());
olympux 40:c966abbe2d62 152
olympux 40:c966abbe2d62 153 else if(c == 1)
olympux 40:c966abbe2d62 154 {
olympux 40:c966abbe2d62 155 if(reply != NULL && strlen(reply) != 0)
olympux 40:c966abbe2d62 156 {
olympux 40:c966abbe2d62 157 strcat(chunk, "RPC reply : ");
olympux 40:c966abbe2d62 158 strcat(chunk, reply);
olympux 40:c966abbe2d62 159 }
olympux 40:c966abbe2d62 160 if(!RPCObjectManager::instance().is_empty())
olympux 40:c966abbe2d62 161 {
olympux 40:c966abbe2d62 162 strcat(chunk, "<p>Objects created :</p>");
olympux 40:c966abbe2d62 163
olympux 40:c966abbe2d62 164 strcat(chunk, "<ul>");
olympux 40:c966abbe2d62 165 for(std::list<char*>::iterator itor = RPCObjectManager::instance().begin();
olympux 40:c966abbe2d62 166 itor != RPCObjectManager::instance().end();
olympux 40:c966abbe2d62 167 ++itor)
olympux 40:c966abbe2d62 168 {
olympux 40:c966abbe2d62 169 strcat(chunk, "<li>");
olympux 40:c966abbe2d62 170 strcat(chunk, *itor);
olympux 40:c966abbe2d62 171 strcat(chunk, " (<a href=\"http://");
olympux 40:c966abbe2d62 172 //strcat(chunk, EthernetInterface::getIPAddress());
olympux 40:c966abbe2d62 173 strcat(chunk, eth.getIPAddress());
olympux 40:c966abbe2d62 174 strcat(chunk, "/");
olympux 40:c966abbe2d62 175 strcat(chunk, *itor);
olympux 40:c966abbe2d62 176 strcat(chunk, "/delete\">delete</a>)");
olympux 40:c966abbe2d62 177 strcat(chunk, "</li>");
olympux 40:c966abbe2d62 178 }
olympux 40:c966abbe2d62 179 strcat(chunk, "</ul>");
olympux 40:c966abbe2d62 180 }
olympux 40:c966abbe2d62 181 strcat(chunk, " ");
olympux 40:c966abbe2d62 182 }
olympux 40:c966abbe2d62 183 else if(c == 2)
olympux 40:c966abbe2d62 184 strcat(chunk, INTERACTIVE_HTML_CODE_2);
olympux 40:c966abbe2d62 185 }
olympux 40:c966abbe2d62 186
olympux 40:c966abbe2d62 187