Mauricio Donatti / Mbed 2 deprecated DCM_Heaters_8CH_v2

Dependencies:   mbed mbed-rtos AMC7812B EthernetInterface TextLCD

Committer:
mmdonatti
Date:
Mon Apr 26 11:22:48 2021 +0000
Revision:
2:7a49ed074968
Child:
3:820e3a42c06b
First v4 commit (support to 24V output)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mmdonatti 2:7a49ed074968 1 #include "HTTP_SERVER.h"
mmdonatti 2:7a49ed074968 2
mmdonatti 2:7a49ed074968 3 #ifndef DEBUG
mmdonatti 2:7a49ed074968 4 //#define DEBUG
mmdonatti 2:7a49ed074968 5 #endif
mmdonatti 2:7a49ed074968 6
mmdonatti 2:7a49ed074968 7 //HTML file - with Javascript
mmdonatti 2:7a49ed074968 8 const char *index_html = "<html><head><title>DCM Heaters Driver</title><link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"http://cnpem.br/wp-content/uploads/2018/01/LNLS_Sirius-02-293x300.png\" />\n\
mmdonatti 2:7a49ed074968 9 <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\"></script></head>\n\
mmdonatti 2:7a49ed074968 10 <script language=\"javascript\" type=\"text/javascript\">\n\
mmdonatti 2:7a49ed074968 11 function loop(){\n\
mmdonatti 2:7a49ed074968 12 $.post(\"read_data\", function(data){\n\
mmdonatti 2:7a49ed074968 13 if(data.length >0)\n\
mmdonatti 2:7a49ed074968 14 {\n\
mmdonatti 2:7a49ed074968 15 var str = data;\n\
mmdonatti 2:7a49ed074968 16 var res = str.split(\" \");\n\
mmdonatti 2:7a49ed074968 17 if(res.length == 97){\n\
mmdonatti 2:7a49ed074968 18 var table = '<div id=\"data_table\">'+\n\
mmdonatti 2:7a49ed074968 19 '<table width=\"100%\" border=\"1\" cellpadding=\"3\" cellspacing=\"1\" bgcolor=\"#E3EBFB\">'+\n\
mmdonatti 2:7a49ed074968 20 '<tr align=\"center\" valign=\"middle\">'+\n\
mmdonatti 2:7a49ed074968 21 '<td width=\"50\" height=\"40\"><strong>Channel</font></strong></td>'+\n\
mmdonatti 2:7a49ed074968 22 '<td width=\"96\" height=\"40\"><strong>Voltage (V)</font></strong></td>'+\n\
mmdonatti 2:7a49ed074968 23 '<td width=\"96\" height=\"40\"><strong>Current (A)</font></strong></td>'+\n\
mmdonatti 2:7a49ed074968 24 '<td width=\"96\" height=\"40\"><strong>Duty Cycle PWM (%)</font></strong></td>'+\n\
mmdonatti 2:7a49ed074968 25 '<td width=\"96\" height=\"40\"><strong>Current Limit (A)</font></strong></td>'+\n\
mmdonatti 2:7a49ed074968 26 '<td width=\"96\" height=\"40\"><strong>Failure</font></strong></td>'+\n\
mmdonatti 2:7a49ed074968 27 '<td width=\"96\" height=\"40\"><strong>Overload</font></strong></td>'+\n\
mmdonatti 2:7a49ed074968 28 '<td width=\"96\" height=\"40\"><strong>No Load</font></strong></td>'+\n\
mmdonatti 2:7a49ed074968 29 '<td width=\"96\" height=\"40\"><strong>Enable</font></strong></td></tr>';\n\
mmdonatti 2:7a49ed074968 30 for(var i=0;i<8;i++){\n\
mmdonatti 2:7a49ed074968 31 table = table + '<tr align=\"center\" valign=\"middle\">'+\n\
mmdonatti 2:7a49ed074968 32 '<td width=\"50\" height=\"31\"bgcolor=\"#FFFFFF\"><span style=\"font-weight:bold;\">'+(i+1)+'</span></td>'+\n\
mmdonatti 2:7a49ed074968 33 '<td width=\"96\" height=\"28\"bgcolor=\"#FFFFFF\"><span style=\"font-weight:bold;\">'+res[i*12]+'</span></td>'+\n\
mmdonatti 2:7a49ed074968 34 '<td width=\"96\" height=\"28\"bgcolor=\"#FFFFFF\"><span style=\"font-weight:bold;\">'+res[i*12+1]+'</span></td>'+\n\
mmdonatti 2:7a49ed074968 35 '<td width=\"96\" height=\"28\"bgcolor=\"#FFFFFF\"><span style=\"font-weight:bold;\">'+res[i*12+2]+'</span></td>'+\n\
mmdonatti 2:7a49ed074968 36 '<td width=\"96\" height=\"28\"bgcolor=\"#FFFFFF\"><span style=\"font-weight:bold;\">'+res[i*12+3]+'</span></td>'+\n\
mmdonatti 2:7a49ed074968 37 '<td width=\"96\" height=\"28\"bgcolor=\"'+res[i*12+4]+'\"><span style=\"font-weight:bold;\">'+res[i*12+5]+'</span></td>'+\n\
mmdonatti 2:7a49ed074968 38 '<td width=\"96\" height=\"28\"bgcolor=\"'+res[i*12+6]+'\"><span style=\"font-weight:bold;\">'+res[i*12+7]+'</span></td>'+\n\
mmdonatti 2:7a49ed074968 39 '<td width=\"96\" height=\"28\"bgcolor=\"'+res[i*12+8]+'\"><span style=\"font-weight:bold;\">'+res[i*12+9]+'</span></td>'+\n\
mmdonatti 2:7a49ed074968 40 '<td width=\"96\" height=\"28\"bgcolor=\"'+res[i*12+10]+'\"><span style=\"font-weight:bold;\">'+res[i*12+11]+'</span></td>'+\n\
mmdonatti 2:7a49ed074968 41 '</tr>';\n\
mmdonatti 2:7a49ed074968 42 }\n\
mmdonatti 2:7a49ed074968 43 table = table + '</table></div>';\n\
mmdonatti 2:7a49ed074968 44 document.getElementById(\"data_table\").innerHTML = table;\n\
mmdonatti 2:7a49ed074968 45 }}\n\
mmdonatti 2:7a49ed074968 46 });\n\
mmdonatti 2:7a49ed074968 47 setTimeout(function(){ loop() }, 2000);\n\
mmdonatti 2:7a49ed074968 48 }\n\
mmdonatti 2:7a49ed074968 49 </script>\n\
mmdonatti 2:7a49ed074968 50 <body onLoad=\"loop()\">\n\
mmdonatti 2:7a49ed074968 51 <table width=\"100%\"border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"font-weight:normal;\">\n\
mmdonatti 2:7a49ed074968 52 <tr>\n\
mmdonatti 2:7a49ed074968 53 <td width=\"25%\" height=\"142\" align=\"center\" valign=\"middle\" style=\"border-bottom: #000000 solid 1px;\">\n\
mmdonatti 2:7a49ed074968 54 <a href=\"http://www.lnls.cnpem.br/\"><img src=\"http://lnls.cnpem.br/wp-content/themes/lnls-v2/assets/images/logo-header.svg\" alt=\"LNLS\" width=\"305\" height=\"142\" /></a></td>\n\
mmdonatti 2:7a49ed074968 55 <td colspan=\"5\" height=\"142\" align=\"center\" scope=\"col\" style=\"border-bottom: #000000 solid 1px;\"><p><span class=\"style7\">DCM HEATERS DRIVER<br /><br/>\n\
mmdonatti 2:7a49ed074968 56 <strong>DIAGNOSTICS<br/></strong></span></p>\n\
mmdonatti 2:7a49ed074968 57 <p><span class=\"style7\"><strong><em> <a href=\"http://www.lnls.cnpem.br\">LNLS</a></em></strong></span></p></td>\n\
mmdonatti 2:7a49ed074968 58 <td width=\"25%\" height=\"142\" align=\"center\" style=\"border-bottom: #000000 solid 1px;\">\n\
mmdonatti 2:7a49ed074968 59 <a href=\"http://www.lnls.cnpem.br/grupos/gae/\"><img src=\"http://www.gae.agency/wp-content/uploads/2016/03/Logo_gae_hp_blue.png\" alt=\"GAE\" width=\"305\" height=\"99\" /></a></td>\n\
mmdonatti 2:7a49ed074968 60 </tr>\n\
mmdonatti 2:7a49ed074968 61 </table>\n<div id=\"data_table\"></div></body></html>\0";
mmdonatti 2:7a49ed074968 62
mmdonatti 2:7a49ed074968 63 //table colors vector
mmdonatti 2:7a49ed074968 64 const char *color[] = {"#C8FFC8\0","#FF0000\0"};
mmdonatti 2:7a49ed074968 65
mmdonatti 2:7a49ed074968 66 int index_html_len; //index with html length
mmdonatti 2:7a49ed074968 67
mmdonatti 2:7a49ed074968 68 char buffer[MAX_BUFFER_SIZE]; //receive and transmit buffer
mmdonatti 2:7a49ed074968 69 char tmp_buffer[200]; //aux buffer
mmdonatti 2:7a49ed074968 70 int status_code; //http status code
mmdonatti 2:7a49ed074968 71 char reason_phrase[30]; //http reason phrase
mmdonatti 2:7a49ed074968 72
mmdonatti 2:7a49ed074968 73 char httpmethod[20]; //http method
mmdonatti 2:7a49ed074968 74 char filepath[20]; //file requested
mmdonatti 2:7a49ed074968 75 char http_ver[20]; //http version
mmdonatti 2:7a49ed074968 76
mmdonatti 2:7a49ed074968 77 int idx_buffer; //index buffer
mmdonatti 2:7a49ed074968 78
mmdonatti 2:7a49ed074968 79 //Debug functions
mmdonatti 2:7a49ed074968 80 namespace HTTP_SERVER
mmdonatti 2:7a49ed074968 81 {
mmdonatti 2:7a49ed074968 82 void DEBUG_PRINT_LINE(const char* arg_line)
mmdonatti 2:7a49ed074968 83 {
mmdonatti 2:7a49ed074968 84 #ifdef DEBUG
mmdonatti 2:7a49ed074968 85 printf("(HTTP_SERVER) ")
mmdonatti 2:7a49ed074968 86 printf(arg_line);
mmdonatti 2:7a49ed074968 87 printf("\r\n");
mmdonatti 2:7a49ed074968 88 #endif
mmdonatti 2:7a49ed074968 89 }
mmdonatti 2:7a49ed074968 90 template<typename T>
mmdonatti 2:7a49ed074968 91 void DEBUG_PRINT_LINE(const char* arg_line, T arg_t)
mmdonatti 2:7a49ed074968 92 {
mmdonatti 2:7a49ed074968 93 #ifdef DEBUG
mmdonatti 2:7a49ed074968 94 printf("(HTTP_SERVER) ");
mmdonatti 2:7a49ed074968 95 printf(arg_line, arg_t);
mmdonatti 2:7a49ed074968 96 printf("\r\n");
mmdonatti 2:7a49ed074968 97 #endif
mmdonatti 2:7a49ed074968 98 }
mmdonatti 2:7a49ed074968 99 template<typename T1, typename T2>
mmdonatti 2:7a49ed074968 100 void DEBUG_PRINT_LINE(const char* arg_line, T1 arg_t1, T2 arg_t2)
mmdonatti 2:7a49ed074968 101 {
mmdonatti 2:7a49ed074968 102 #ifdef DEBUG
mmdonatti 2:7a49ed074968 103 printf("(HTTP_SERVER) ");
mmdonatti 2:7a49ed074968 104 printf(arg_line, arg_t1, arg_t2);
mmdonatti 2:7a49ed074968 105 printf("\r\n");
mmdonatti 2:7a49ed074968 106 #endif
mmdonatti 2:7a49ed074968 107 }
mmdonatti 2:7a49ed074968 108 }
mmdonatti 2:7a49ed074968 109 using namespace HTTP_SERVER;
mmdonatti 2:7a49ed074968 110
mmdonatti 2:7a49ed074968 111 HttpServer::HttpServer()
mmdonatti 2:7a49ed074968 112 {
mmdonatti 2:7a49ed074968 113 buffer[0] = '\0'; //constructor
mmdonatti 2:7a49ed074968 114 }
mmdonatti 2:7a49ed074968 115
mmdonatti 2:7a49ed074968 116 HttpServer::~HttpServer()
mmdonatti 2:7a49ed074968 117 {
mmdonatti 2:7a49ed074968 118 }
mmdonatti 2:7a49ed074968 119 bool HttpServer::init()
mmdonatti 2:7a49ed074968 120 {
mmdonatti 2:7a49ed074968 121 // TCP Socket setup
mmdonatti 2:7a49ed074968 122 // To open Server-side PORT
mmdonatti 2:7a49ed074968 123 if(tcpsvr.bind(TCP_PORT)< 0) {
mmdonatti 2:7a49ed074968 124 return false;
mmdonatti 2:7a49ed074968 125 }
mmdonatti 2:7a49ed074968 126 tcpsvr.set_blocking(true,1500); //set blocking socket
mmdonatti 2:7a49ed074968 127
mmdonatti 2:7a49ed074968 128 // Server start listening Request from a web browser.
mmdonatti 2:7a49ed074968 129
mmdonatti 2:7a49ed074968 130 if(tcpsvr.listen(5) < 0) {
mmdonatti 2:7a49ed074968 131 return false;
mmdonatti 2:7a49ed074968 132 }
mmdonatti 2:7a49ed074968 133
mmdonatti 2:7a49ed074968 134 index_html_len = strlen(index_html); //calculate string length
mmdonatti 2:7a49ed074968 135
mmdonatti 2:7a49ed074968 136 return true;
mmdonatti 2:7a49ed074968 137 }
mmdonatti 2:7a49ed074968 138
mmdonatti 2:7a49ed074968 139 bool HttpServer::run(channel *CH)
mmdonatti 2:7a49ed074968 140 {
mmdonatti 2:7a49ed074968 141 if(tcpsvr.accept(tcpcon) < 0) {
mmdonatti 2:7a49ed074968 142 //printf("(HTTP_SERVER) failed to accept connection.\r\n");
mmdonatti 2:7a49ed074968 143 return -1;
mmdonatti 2:7a49ed074968 144 }
mmdonatti 2:7a49ed074968 145 // When conected
mmdonatti 2:7a49ed074968 146 while(tcpcon.is_connected())
mmdonatti 2:7a49ed074968 147 {
mmdonatti 2:7a49ed074968 148 tcpcon.set_blocking(false,100);
mmdonatti 2:7a49ed074968 149 //
mmdonatti 2:7a49ed074968 150 // Request Analysis
mmdonatti 2:7a49ed074968 151 //
mmdonatti 2:7a49ed074968 152
mmdonatti 2:7a49ed074968 153 DEBUG_PRINT_LINE("DEBUG MODE");
mmdonatti 2:7a49ed074968 154 switch(tcpcon.receive(buffer, 1023)) {
mmdonatti 2:7a49ed074968 155 case 0:
mmdonatti 2:7a49ed074968 156 //DEBUG_PRINT_LINE("received buffer is empty.");
mmdonatti 2:7a49ed074968 157 status_code = 400;
mmdonatti 2:7a49ed074968 158 sprintf(reason_phrase,"No Request\0");
mmdonatti 2:7a49ed074968 159 httpmethod[0] = '\0';
mmdonatti 2:7a49ed074968 160 filepath[0] = '\0';
mmdonatti 2:7a49ed074968 161 http_ver[0] = '\0';
mmdonatti 2:7a49ed074968 162 break;
mmdonatti 2:7a49ed074968 163 case -1:
mmdonatti 2:7a49ed074968 164 DEBUG_PRINT_LINE("failed to read data from client.");
mmdonatti 2:7a49ed074968 165 status_code = 500;
mmdonatti 2:7a49ed074968 166 sprintf(reason_phrase,"Internal Server Error\0");
mmdonatti 2:7a49ed074968 167 httpmethod[0] = '\0';
mmdonatti 2:7a49ed074968 168 filepath[0] = '\0';
mmdonatti 2:7a49ed074968 169 http_ver[0] = '\0';
mmdonatti 2:7a49ed074968 170 break;
mmdonatti 2:7a49ed074968 171 default:
mmdonatti 2:7a49ed074968 172 DEBUG_PRINT_LINE("Received Data: %d",strlen(buffer));
mmdonatti 2:7a49ed074968 173 DEBUG_PRINT_LINE("-->\r\n");
mmdonatti 2:7a49ed074968 174 DEBUG_PRINT_LINE("%.*s[End of Request]",strlen(buffer),buffer);
mmdonatti 2:7a49ed074968 175 // get HTTP method, File path, HTTP version
mmdonatti 2:7a49ed074968 176 sprintf(httpmethod,strtok(buffer," "));
mmdonatti 2:7a49ed074968 177 filepath[0] = '\0';
mmdonatti 2:7a49ed074968 178 sprintf(http_ver,"HTTP/1.1\0");
mmdonatti 2:7a49ed074968 179 DEBUG_PRINT_LINE("httpmethod: %s", httpmethod);
mmdonatti 2:7a49ed074968 180 DEBUG_PRINT_LINE("file path: %s", filepath);
mmdonatti 2:7a49ed074968 181 DEBUG_PRINT_LINE("http ver : %s", http_ver);
mmdonatti 2:7a49ed074968 182 break;
mmdonatti 2:7a49ed074968 183 }
mmdonatti 2:7a49ed074968 184
mmdonatti 2:7a49ed074968 185 if (httpmethod[0] == '\0') {
mmdonatti 2:7a49ed074968 186 buffer[MAX_BUFFER_SIZE - 1] = '\0';
mmdonatti 2:7a49ed074968 187 sprintf(buffer,"%s %d %s\r\nConnection: Close\r\n\r\n\0", http_ver, status_code, reason_phrase);
mmdonatti 2:7a49ed074968 188 DEBUG_PRINT_LINE("echo back done.");
mmdonatti 2:7a49ed074968 189 break;
mmdonatti 2:7a49ed074968 190 }
mmdonatti 2:7a49ed074968 191
mmdonatti 2:7a49ed074968 192 // Response
mmdonatti 2:7a49ed074968 193 if (strcmp(httpmethod,"GET") == 0 ) //GET request - always index.html stoed in index_html
mmdonatti 2:7a49ed074968 194 {
mmdonatti 2:7a49ed074968 195 DEBUG_PRINT_LINE("GET request incomming.");
mmdonatti 2:7a49ed074968 196
mmdonatti 2:7a49ed074968 197 buffer[MAX_BUFFER_SIZE-1] = '\0';
mmdonatti 2:7a49ed074968 198 status_code = 200;
mmdonatti 2:7a49ed074968 199 sprintf(reason_phrase,"OK\0");
mmdonatti 2:7a49ed074968 200
mmdonatti 2:7a49ed074968 201 sprintf(buffer,"%s %d %s\r\nConnection: Close\r\nContent-Type: text/html\r\nKeep-Alive: timeout=15\r\n\r\n\0", http_ver, status_code, reason_phrase);
mmdonatti 2:7a49ed074968 202 tcpcon.send_all(buffer,strlen(buffer));
mmdonatti 2:7a49ed074968 203 tcpcon.send_all((char*)index_html,index_html_len);
mmdonatti 2:7a49ed074968 204
mmdonatti 2:7a49ed074968 205 break;
mmdonatti 2:7a49ed074968 206 }
mmdonatti 2:7a49ed074968 207 if (strcmp(httpmethod,"POST") == 0 ) //POST request - javascript request
mmdonatti 2:7a49ed074968 208 {
mmdonatti 2:7a49ed074968 209 DEBUG_PRINT_LINE("POST request incomming.");
mmdonatti 2:7a49ed074968 210 status_code = 200;
mmdonatti 2:7a49ed074968 211 sprintf(reason_phrase,"OK\0");
mmdonatti 2:7a49ed074968 212
mmdonatti 2:7a49ed074968 213 sprintf(buffer,"%s %d %s\r\nConnection: Close\r\n\r\n\0", http_ver, status_code, reason_phrase);
mmdonatti 2:7a49ed074968 214
mmdonatti 2:7a49ed074968 215 for(idx_buffer=0;idx_buffer<=7;idx_buffer++)
mmdonatti 2:7a49ed074968 216 {
mmdonatti 2:7a49ed074968 217 sprintf(tmp_buffer,"%4.2f %3.2f %d %3.2f %s %d %s %d %s %d %s %d \0",CH[idx_buffer].voltage,CH[idx_buffer].current,CH[idx_buffer].control,CH[idx_buffer].limit,\
mmdonatti 2:7a49ed074968 218 color[CH[idx_buffer].failure>0],CH[idx_buffer].failure,\
mmdonatti 2:7a49ed074968 219 color[CH[idx_buffer].overload>ERROR_REP],CH[idx_buffer].overload>ERROR_REP,\
mmdonatti 2:7a49ed074968 220 color[CH[idx_buffer].noload>ERROR_REP],CH[idx_buffer].noload>ERROR_REP,\
mmdonatti 2:7a49ed074968 221 color[CH[idx_buffer].enable==0],CH[idx_buffer].enable);
mmdonatti 2:7a49ed074968 222 strcat(buffer,tmp_buffer);
mmdonatti 2:7a49ed074968 223
mmdonatti 2:7a49ed074968 224 }
mmdonatti 2:7a49ed074968 225 tcpcon.send_all(buffer,strlen(buffer));
mmdonatti 2:7a49ed074968 226 break;
mmdonatti 2:7a49ed074968 227
mmdonatti 2:7a49ed074968 228
mmdonatti 2:7a49ed074968 229 }
mmdonatti 2:7a49ed074968 230 }
mmdonatti 2:7a49ed074968 231 tcpcon.close(); //always close the connection
mmdonatti 2:7a49ed074968 232 return 0;
mmdonatti 2:7a49ed074968 233 }