speedandcurrent 1.6.0 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -59
- package/correctionTable.js +1 -1
- package/index.js +392 -264
- package/package.json +5 -2
- package/public/TableRenderer.js +114 -210
- package/public/app.js +804 -447
- package/public/index.html +257 -96
- package/public/main.css +79 -158
- package/public/vectors.html +0 -30
- package/public/vectors.js +0 -145
package/public/vectors.html
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html>
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>Wind vectors</title>
|
|
7
|
-
<link rel="stylesheet" href="main.css">
|
|
8
|
-
</head>
|
|
9
|
-
|
|
10
|
-
<body>
|
|
11
|
-
<div id="message"></div>
|
|
12
|
-
|
|
13
|
-
<svg height="400" width="400" xmlns="http://www.w3.org/2000/svg" viewbox="-100 -100 200 200" id="canvas">
|
|
14
|
-
|
|
15
|
-
<!-- Draw the paths -->
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
<path id="hull" d="M -45 10 Q 15 25 30 0 Q 15 -25 -45 -10 z" stroke="black" fill="none" stroke-width="1"
|
|
19
|
-
transform="rotate(-90), scale(1, 1)" />
|
|
20
|
-
|
|
21
|
-
<line id="mast" x1="0" y1="0" x2="1" y2="8" stroke="brown" stroke-width="2" transform="rotate(-90)" />
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
Sorry, your browser does not support inline SVG.
|
|
25
|
-
</svg>
|
|
26
|
-
|
|
27
|
-
</body>
|
|
28
|
-
<script src="vectors.js"></script>
|
|
29
|
-
|
|
30
|
-
</html>
|
package/public/vectors.js
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
const API_BASE_URL = "/plugins/speedandcurrent";
|
|
2
|
-
let previous = 0;
|
|
3
|
-
let lastTime = new Date();
|
|
4
|
-
|
|
5
|
-
function getHeading(data) {
|
|
6
|
-
let heading = 0;
|
|
7
|
-
data.deltas.forEach(delta => {
|
|
8
|
-
if (delta.id == "heading") {
|
|
9
|
-
heading = delta.value * 180 / Math.PI;
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
return heading;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
function getLargest(data) {
|
|
17
|
-
let largest = 1;
|
|
18
|
-
data.polars.forEach(polar => {
|
|
19
|
-
largest = Math.max(largest, Math.abs(polar.x));
|
|
20
|
-
largest = Math.max(largest, Math.abs(polar.y));
|
|
21
|
-
});
|
|
22
|
-
return largest;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function drawBoat(canvas, heading) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const hull = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
29
|
-
hull.setAttribute("d", "M -45 8 Q 15 20 30 0 Q 15 -20 -45 -8 z");
|
|
30
|
-
hull.setAttribute("fill", "none");
|
|
31
|
-
hull.setAttribute("stroke", "black");
|
|
32
|
-
hull.setAttribute("stroke-width", "1");
|
|
33
|
-
//hull.setAttribute("transform", `scale(${1 - Math.abs(Math.sin(att.pitch))}, ${1 - Math.abs(Math.sin(att.roll))})`);
|
|
34
|
-
hull.setAttribute("id", "hull");
|
|
35
|
-
|
|
36
|
-
// const mast = document.createElementNS("http://www.w3.org/2000/svg", "line");
|
|
37
|
-
// mast.setAttribute("x1", 0);
|
|
38
|
-
// mast.setAttribute("y1", 0);
|
|
39
|
-
// mast.setAttribute("x2", offset.x);
|
|
40
|
-
// mast.setAttribute("y2", offset.y);
|
|
41
|
-
// mast.setAttribute("id", "mast");
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const boat = document.createElementNS("http://www.w3.org/2000/svg", "g");
|
|
45
|
-
boat.setAttribute("transform", `rotate(${heading - 90})`);
|
|
46
|
-
boat.appendChild(hull);
|
|
47
|
-
// boat.appendChild(mast);
|
|
48
|
-
canvas.appendChild(boat);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
function drawVectors(canvas, data, heading, scale) {
|
|
53
|
-
data.polars.forEach(polar => {
|
|
54
|
-
const vector = document.createElementNS("http://www.w3.org/2000/svg", "line");
|
|
55
|
-
vector.setAttribute("x1", 0 );
|
|
56
|
-
vector.setAttribute("y1", 0 );
|
|
57
|
-
vector.setAttribute("x2", polar.x * scale );
|
|
58
|
-
vector.setAttribute("y2", polar.y * scale );
|
|
59
|
-
vector.setAttribute("id", polar.id);
|
|
60
|
-
let dash;
|
|
61
|
-
let s = scale * 5 / 1.94384 - 1;
|
|
62
|
-
if (s > 50) {
|
|
63
|
-
s = s / 5;
|
|
64
|
-
dash = `1 1 ${s - 1} 1 ${s} 1 ${s} 1 ${s} 1 ${s - 1} 1 `;
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
dash = `1 1 ${s - 1} 1 ${s} 1 `;
|
|
68
|
-
}
|
|
69
|
-
vector.setAttribute("stroke-dasharray", dash);
|
|
70
|
-
vector.setAttribute("stroke-dashoffset", `1`);
|
|
71
|
-
if (polar.displayAttributes.plane == "Ground")
|
|
72
|
-
vector.setAttribute("transform", `rotate(${-90})`);
|
|
73
|
-
else
|
|
74
|
-
vector.setAttribute("transform", `rotate(${heading - 90})`);
|
|
75
|
-
canvas.appendChild(vector);
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
async function fetchVectorData() {
|
|
81
|
-
const data = await getFromServer('getVectors');
|
|
82
|
-
if (data) {
|
|
83
|
-
const canvas = document.getElementById("canvas");
|
|
84
|
-
canvas.innerHTML = "";
|
|
85
|
-
|
|
86
|
-
const heading = getHeading(data);
|
|
87
|
-
const largest = getLargest(data);
|
|
88
|
-
let time, deltaT;
|
|
89
|
-
|
|
90
|
-
if (previous == 0) {
|
|
91
|
-
previous = largest;
|
|
92
|
-
lastTime = new Date();
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
time = new Date();
|
|
96
|
-
deltaT = (time - lastTime)/1000;
|
|
97
|
-
if (largest != previous) {
|
|
98
|
-
if (largest > previous) {
|
|
99
|
-
previous *= (1.005 );
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
previous *= (0.9995 );
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const scale = 95 / previous;
|
|
108
|
-
|
|
109
|
-
drawBoat(canvas, heading);
|
|
110
|
-
drawVectors(canvas, data, heading, scale);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
async function getFromServer(endpoint) {
|
|
114
|
-
try {
|
|
115
|
-
const response = await fetch(`${API_BASE_URL}/${endpoint}`, {
|
|
116
|
-
method: 'GET',
|
|
117
|
-
headers: {
|
|
118
|
-
'Content-Type': 'application/json'
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
if (!response.ok) {
|
|
123
|
-
if (response.status === 503) {
|
|
124
|
-
throw new Error("Plugin is not running");
|
|
125
|
-
} else {
|
|
126
|
-
throw new Error(`Error fetching data: ${response.statusText}`);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
const data = await response.json();
|
|
132
|
-
return data;
|
|
133
|
-
} catch (error) {
|
|
134
|
-
handleError(error);
|
|
135
|
-
return null;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
function handleError(error) {
|
|
141
|
-
console.log('Error:', error.message);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
setInterval(fetchVectorData, 1000);
|