diff --git a/ampel-firmware/web_server.cpp b/ampel-firmware/web_server.cpp index ba342516882e361068719bcbe902b18e05e41982..2c632da9693852479fb2ab5c842999ebd79d2087 100644 --- a/ampel-firmware/web_server.cpp +++ b/ampel-firmware/web_server.cpp @@ -32,86 +32,86 @@ namespace web_server { //TODO: Remove all "\n" to save some space header_template = PSTR("<!doctype html><html lang=en>" - "<head>\n" - "<title>%d ppm - CO2 SENSOR - %s - %s</title>\n" - "<meta charset='UTF-8'>\n" + "<head>" + "<title>%d ppm - CO2 SENSOR - %s - %s</title>" + "<meta charset='UTF-8'>" // HfT Favicon - "<link rel='icon' type='image/png' sizes='16x16' href='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAHtJREFUOE9jvMnA+5+BAsBIFQMkl85h+P3kGcOb8jqwW+TPH2H4de0GA29UGNxtfx49YWCRk0HwHz5iuKegwwB2AS4DkA2F6VR6cAWsEQbgBqDY9vARw/ejJ+Au+LxsFcPz6BSwHpwGYPMCSS6gyAAKYhESiKMGjPgwAADopHVhn5ynEwAAAABJRU5ErkJggg=='/>\n" + "<link rel='icon' type='image/png' sizes='16x16' href='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAHtJREFUOE9jvMnA+5+BAsBIFQMkl85h+P3kGcOb8jqwW+TPH2H4de0GA29UGNxtfx49YWCRk0HwHz5iuKegwwB2AS4DkA2F6VR6cAWsEQbgBqDY9vARw/ejJ+Au+LxsFcPz6BSwHpwGYPMCSS6gyAAKYhESiKMGjPgwAADopHVhn5ynEwAAAABJRU5ErkJggg=='/>" // Responsive grid: - "<link rel='stylesheet' href='https://unpkg.com/purecss@2.0.3/build/pure-min.css'>\n" - "<link rel='stylesheet' href='https://unpkg.com/purecss@2.0.3/build/grids-responsive-min.css'>\n" + "<link rel='stylesheet' href='https://unpkg.com/purecss@2.0.3/build/pure-min.css'>" + "<link rel='stylesheet' href='https://unpkg.com/purecss@2.0.3/build/grids-responsive-min.css'>" // JS Graphs: - "<script src='https://cdn.plot.ly/plotly-basic-1.58.2.min.js'></script>\n" + "<script src='https://cdn.plot.ly/plotly-basic-1.58.2.min.js'></script>" // Fullscreen - "<meta name='viewport' content='width=device-width, initial-scale=1'>\n" + "<meta name='viewport' content='width=device-width, initial-scale=1'>" // Refresh after every measurement. - // "<meta http-equiv='refresh' content='%d'>\n" - "</head>\n" - "<body>\n" + // "<meta http-equiv='refresh' content='%d'>" + "</head>" + "<body>" - "<div class='pure-g'><div class='pure-u-1'><div class='pure-menu'><p class='pure-menu-heading'>HfT-Stuttgart CO<sub>2</sub> Ampel</p></div></div>\n" - "<div class='pure-u-1'><ul class='pure-menu pure-menu-horizontal pure-menu-list'>\n" - "<li class='pure-menu-item'><a href='/config' class='pure-menu-link'>Config</a></li>\n" - "<li class='pure-menu-item'><a href='#table' class='pure-menu-link'>Info</a></li>\n" - "<li class='pure-menu-item'><a href='#graph' class='pure-menu-link'>Graph</a></li>\n" - "<li class='pure-menu-item'><a href='#log' class='pure-menu-link'>Log</a></li>\n" - "<li class='pure-menu-item'><a href='%s' class='pure-menu-link'>Download CSV</a></li>\n" - "<li class='pure-menu-item' id='led'>⬤</li>\n"// LED - "</ul></div></div>\n" - "<script>\n" + "<div class='pure-g'><div class='pure-u-1'><div class='pure-menu'><p class='pure-menu-heading'>HfT-Stuttgart CO<sub>2</sub> Ampel</p></div></div>" + "<div class='pure-u-1'><ul class='pure-menu pure-menu-horizontal pure-menu-list'>" + "<li class='pure-menu-item'><a href='/config' class='pure-menu-link'>Config</a></li>" + "<li class='pure-menu-item'><a href='#table' class='pure-menu-link'>Info</a></li>" + "<li class='pure-menu-item'><a href='#graph' class='pure-menu-link'>Graph</a></li>" + "<li class='pure-menu-item'><a href='#log' class='pure-menu-link'>Log</a></li>" + "<li class='pure-menu-item'><a href='%s' class='pure-menu-link'>Download CSV</a></li>" + "<li class='pure-menu-item' id='led'>⬤</li>"// LED + "</ul></div></div>" + "<script>" // Show a colored dot on the webpage, with a similar color than on LED Ring. - "hue=(1-(Math.min(Math.max(parseInt(document.title),500),1600)-500)/1100)*120;\n" - "document.getElementById('led').style.color=['hsl(',hue,',100%%,50%%)'].join('');\n" - "</script>\n" - "<div class='pure-g'>\n" - "<div class='pure-u-1' id='graph'></div>\n"// Graph placeholder - "</div>\n" - "<div class='pure-g'>\n" - "<table id='table' class='pure-table-striped pure-u-1 pure-u-md-1-2'>\n"); + "hue=(1-(Math.min(Math.max(parseInt(document.title),500),1600)-500)/1100)*120;" + "document.getElementById('led').style.color=['hsl(',hue,',100%%,50%%)'].join('');" + "</script>" + "<div class='pure-g'>" + "<div class='pure-u-1' id='graph'></div>"// Graph placeholder + "</div>" + "<div class='pure-g'>" + "<table id='table' class='pure-table-striped pure-u-1 pure-u-md-1-2'>"); body_template = - PSTR("<tr><th colspan='2'>%s</th></tr>\n" - "<tr><td>CO<sub>2</sub></td><td>%5d ppm</td></tr>\n" - "<tr><td>Temperature</td><td>%.1f℃</td></tr>\n" - "<tr><td>Humidity</td><td>%.1f%%</td></tr>\n" - "<tr><td>Last measurement</td><td>%s</td></tr>\n" - "<tr><td>Timestep</td><td>%5d s</td></tr>\n" - "<tr><th colspan='2'>CSV</th></tr>\n" //TODO: Gray out if !config::csv_active - "<tr><td>Last write</td><td>%s</td></tr>\n" - "<tr><td>Timestep</td><td>%5d s</td></tr>\n" - "<tr><td>Available space</td><td>%d kB</td></tr>\n" - "<tr><th colspan='2'>MQTT</th></tr>\n"//TODO: Gray out if !config::mqtt_active - "<tr><td>Connected?</td><td>%s</td></tr>\n" - "<tr><td>Last publish</td><td>%s</td></tr>\n" - "<tr><td>Timestep</td><td>%5d s</td></tr>\n" + PSTR("<tr><th colspan='2'>%s</th></tr>" + "<tr><td>CO<sub>2</sub></td><td>%5d ppm</td></tr>" + "<tr><td>Temperature</td><td>%.1f℃</td></tr>" + "<tr><td>Humidity</td><td>%.1f%%</td></tr>" + "<tr><td>Last measurement</td><td>%s</td></tr>" + "<tr><td>Timestep</td><td>%5d s</td></tr>" + "<tr><th colspan='2'>CSV</th></tr>" //TODO: Gray out if !config::csv_active + "<tr><td>Last write</td><td>%s</td></tr>" + "<tr><td>Timestep</td><td>%5d s</td></tr>" + "<tr><td>Available space</td><td>%d kB</td></tr>" + "<tr><th colspan='2'>MQTT</th></tr>"//TODO: Gray out if !config::mqtt_active + "<tr><td>Connected?</td><td>%s</td></tr>" + "<tr><td>Last publish</td><td>%s</td></tr>" + "<tr><td>Timestep</td><td>%5d s</td></tr>" #if defined(ESP32) - "<tr><th colspan='2'>LoRaWAN</th></tr>\n" //TODO: Gray out if !config::lora_active - "<tr><td>Connected?</td><td>%s</td></tr>\n" - "<tr><td>Frequency</td><td>%s MHz</td></tr>\n" - "<tr><td>Last transmission</td><td>%s</td></tr>\n" - "<tr><td>Timestep</td><td>%5d s</td></tr>\n" + "<tr><th colspan='2'>LoRaWAN</th></tr>" //TODO: Gray out if !config::lora_active + "<tr><td>Connected?</td><td>%s</td></tr>" + "<tr><td>Frequency</td><td>%s MHz</td></tr>" + "<tr><td>Last transmission</td><td>%s</td></tr>" + "<tr><td>Timestep</td><td>%5d s</td></tr>" #endif - "<tr><th colspan='2'>Sensor</th></tr>\n" - "<tr><td>Temperature offset</td><td>%.1fK</td></tr>\n" //TODO: Read it from sensor? - "<tr><td>Auto-calibration?</td><td>%s</td></tr>\n" - "<tr><td>Local address</td><td><a href='http://%s.local/'>%s.local</a></td></tr>\n" - "<tr><td>Local IP</td><td><a href='http://%s'>%s</a></td></tr>\n" - "<tr><td>MAC</td><td>%s</td></tr>\n" - "<tr><td>Free heap space</td><td>%6d bytes</td></tr>\n" - "<tr><td>Largest heap block</td><td>%6d bytes</td></tr>\n" - "<tr><td>Frag</td><td>%3d%%</td></tr>\n" - "<tr><td>Max loop duration</td><td>%5d ms</td></tr>\n" - "<tr><td>Board</td><td>%s</td></tr>\n" - "<tr><td>ID</td><td>%s</td></tr>\n" - "<tr><td>Ampel firmware</td><td>%s</td></tr>\n" - "<tr><td>Uptime</td><td>%2d d %4d h %02d min %02d s</td></tr>\n" - "</table>\n" - "<div id='log' class='pure-u-1 pure-u-md-1-2'></div>\n" - "<form action='/command'><input type='text' id='send' name='send'><input type='submit' value='Send'></form>\n" + "<tr><th colspan='2'>Sensor</th></tr>" + "<tr><td>Temperature offset</td><td>%.1fK</td></tr>" //TODO: Read it from sensor? + "<tr><td>Auto-calibration?</td><td>%s</td></tr>" + "<tr><td>Local address</td><td><a href='http://%s.local/'>%s.local</a></td></tr>" + "<tr><td>Local IP</td><td><a href='http://%s'>%s</a></td></tr>" + "<tr><td>MAC</td><td>%s</td></tr>" + "<tr><td>Free heap space</td><td>%6d bytes</td></tr>" + "<tr><td>Largest heap block</td><td>%6d bytes</td></tr>" + "<tr><td>Frag</td><td>%3d%%</td></tr>" + "<tr><td>Max loop duration</td><td>%5d ms</td></tr>" + "<tr><td>Board</td><td>%s</td></tr>" + "<tr><td>ID</td><td>%s</td></tr>" + "<tr><td>Ampel firmware</td><td>%s</td></tr>" + "<tr><td>Uptime</td><td>%2d d %4d h %02d min %02d s</td></tr>" + "</table>" + "<div id='log' class='pure-u-1 pure-u-md-1-2'></div>" + "<form action='/command'><input type='text' id='send' name='send'><input type='submit' value='Send'></form>" "<form action='/delete_csv' method='POST' onsubmit=\"return confirm('Are you really sure you want to delete all data?') && (document.body.style.cursor = 'wait');\">" "<input type='submit' value='Delete CSV'/>" - "</form>\n" - "</div>\n"); + "</form>" + "</div>"); script_template = PSTR( @@ -190,7 +190,8 @@ namespace web_server { //NOTE: Splitting in multiple parts in order to use less RAM char content[2000]; // Update if needed - // INFO - Header size : 1767 - Body size : 1991 - Script size : 1909 + // Current size (without Lorawan): + // INFO - Header size : 1822 - Body size : 1953 - Script size : 1943 snprintf_P(content, sizeof(content), header_template, sensor::co2, config::ampel_name(), wifi::local_ip, csv_writer::filename);