forked from defend/nodemcu-lab-1
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
5.1 KiB
159 lines
5.1 KiB
#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;
|
|
}
|