#include <Arduino.h> enum parts { HTML_BEGIN, HTML_END, STYLE, SCRIPT, ACC_CALIBRATE }; const char html_begin[] PROGMEM = R"( <!DOCTYPE html> <html> <head> <style> button { width: 190px; height: 40px; } #navs { height: 40px; width: 400px; position: relative; } footer { height: 5%; text-align: center; width: 100%; margin-top: 100px; } .clear { clear: left; } #hbs_text { text-align: left; width: 400px; text-indent: 20px; } </style> <meta charset="UTF-8"> </head> <body> <div id="main_block" align="center"> <h1>Диагностика</h1> <canvas id="myCanvas" width="440" height="240" style="border:0px solid #000000;"> Браузер устарел! </canvas> <script> var socket = new WebSocket("ws://192.168.1.1:81"); var i, data; var c = document.getElementById("myCanvas"); var context = c.getContext("2d"); var maxX = 400, maxY = 200; var biasX = 20, biasY = 20; var curVoltage = 20; var freq = 16; function iY(y) { return maxY + biasY - y; } context.beginPath(); context.moveTo(20, iY(0)); for (i = 0; i <= 200; i+=20) { context.lineTo(20, iY(i)); context.lineTo(15, iY(i)); context.moveTo(20, iY(i)); textY = i/200*curVoltage; context.fillText(textY.toFixed(1), 0, iY(i-2.5)); } context.moveTo(20, iY(0)); for (i = 20; i <= 420; i+=40) { context.lineTo(i, iY(0)); context.lineTo(i, iY(-5)); context.moveTo(i, iY(0)); textX = (i-20)/400*freq ; context.fillText(textX.toFixed(1), i-10, iY(-20)); } context.stroke(); socket.onopen = function () { alert('Соединение установлено.'); }; socket.onclose = function (event) { if (!event.wasClean) { alert('Обрыв соединения'); } }; socket.onmessage = function (event) { context.clearRect(biasX, 0, maxX, maxY + biasY); context.beginPath(); data = JSON.parse(event.data); context.moveTo(biasX, data.data[0]+biasY); for (i = 1; i < 200; i++) { context.lineTo(i*2 + biasX, data.data[i] + biasY); } voltage = data.data[199]*(-0.1)+20; context.fillText(voltage + " V", 200,20); context.stroke(); }; function calibrateDevice() { var calibrating = 10; socket.send(JSON.stringify(calibrating)); document.getElementById("calibrate_text").innerHTML = "Калибровка в течении 10 секунд - Сделайте несколько оборотов устройством перпендикулярно оси Х"; } </script> <div class="clear"></div> </div> <footer> <hr \>DEFEND STUDIO | DEFEND.PW | 2018 </footer> </body> </html> )"; const char acc_calibrate[] PROGMEM = R"=( <p id="calibrate_text">Устройство не откалибровано.</p> <button onclick="calibrateDevice()">Откалибровать</button> )="; static int getHtml(parts p, char &adr, uint16_t buf_size, uint16_t bias) { char *buffer = &adr; const char *html_part; int length = 0; switch (p) { case HTML_BEGIN: html_part = html_begin; break; // case HTML_END: // html_part = html_end; // break; // case STYLE: // html_part = style; // break; // case SCRIPT: // html_part = script; // break; case ACC_CALIBRATE: html_part = acc_calibrate; break; } length = strlen_P(html_part); for (int i = 0; i != length; i++) { if (i > buf_size) return i; buffer[i + bias] = pgm_read_byte_near(html_part + i); } return length; }