signalk-polar-performance-plugin 0.0.35 → 0.0.37
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 +2 -1
- package/package.json +1 -1
- package/plugin/index.js +8 -0
- package/public/index.html +127 -2
package/README.md
CHANGED
|
@@ -45,12 +45,13 @@ In the plugin configuration you can toggle the following options:
|
|
|
45
45
|
- Configurable damping alorithm on inputs
|
|
46
46
|
- Extrapolation of polar data towards 0
|
|
47
47
|
- Configurable overall performance adjustment ratio
|
|
48
|
+
- Dots in webapp indicating Polar Speed and Boat Speed
|
|
49
|
+
- Use highest polar speed when going north of Polar
|
|
48
50
|
|
|
49
51
|
### To-do list
|
|
50
52
|
- Improved interpolation
|
|
51
53
|
- Make moment to do calculation smarter/configurable
|
|
52
54
|
- API to see JSON of polar
|
|
53
|
-
- Extrapolation of polar data towards 50 kts?
|
|
54
55
|
- Create polar from live data
|
|
55
56
|
-- Save polar info to file
|
|
56
57
|
-- Save new record speed for angle in polar
|
package/package.json
CHANGED
package/plugin/index.js
CHANGED
|
@@ -195,6 +195,10 @@ module.exports = function (app) {
|
|
|
195
195
|
function sendUpdates (perfObj) {
|
|
196
196
|
let values = []
|
|
197
197
|
let metas = []
|
|
198
|
+
values.push({path: 'performance.boatSpeedDamped', value: roundDec(BSP)})
|
|
199
|
+
metas.push({path: 'performance.boatSpeedDamped', value: {"units": "m/s"}})
|
|
200
|
+
values.push({path: 'environment.wind.angleTrueWaterDamped', value: roundDec(TWA)})
|
|
201
|
+
metas.push({path: 'environment.wind.angleTrueWaterDamped', value: {"units": "rad"}})
|
|
198
202
|
if (typeof perfObj.beatAngle != 'undefined') {
|
|
199
203
|
if (options.beatAngle == true) {
|
|
200
204
|
values.push({path: 'performance.beatAngle', value: roundDec(perfObj.beatAngle)})
|
|
@@ -272,6 +276,10 @@ module.exports = function (app) {
|
|
|
272
276
|
for (let indexTWS = 0 ; indexTWS < polar.length-1; indexTWS++) {
|
|
273
277
|
let lower = polar[indexTWS].tws
|
|
274
278
|
let upper = polar[indexTWS+1].tws
|
|
279
|
+
if (indexTWS == polar.length-1 && TWS > upper) {
|
|
280
|
+
// North of polar
|
|
281
|
+
TWS = upper
|
|
282
|
+
}
|
|
275
283
|
if (TWS >= lower && TWS <= upper) {
|
|
276
284
|
//app.debug('TWS between %d and %d', lower, upper)
|
|
277
285
|
// Calculate gap ratio
|
package/public/index.html
CHANGED
|
@@ -8,13 +8,51 @@
|
|
|
8
8
|
<canvas id="myChart" style="width:100%;max-width:1200px"></canvas>
|
|
9
9
|
|
|
10
10
|
<script>
|
|
11
|
+
|
|
12
|
+
var polarSpeed, boatSpeed, TWA
|
|
13
|
+
var myChart, chartData
|
|
14
|
+
|
|
11
15
|
$.getJSON("/plugins/signalk-polar-performance-plugin/chartData", function(json) {
|
|
12
|
-
|
|
16
|
+
|
|
17
|
+
// Add actual values dots
|
|
18
|
+
json.datasets.unshift({
|
|
19
|
+
label: 'Polar Speed',
|
|
20
|
+
backgroundColor: 'rgba(0,255,0,0.7)',
|
|
21
|
+
borderColor: 'rgba(0,255,0,0.2)',
|
|
22
|
+
borderWidth: 1,
|
|
23
|
+
radius: 30,
|
|
24
|
+
type: 'bubble',
|
|
25
|
+
data: [
|
|
26
|
+
{
|
|
27
|
+
y: 0,
|
|
28
|
+
x: 0,
|
|
29
|
+
r: 10
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
label: 'Boat Speed',
|
|
35
|
+
backgroundColor: 'rgba(0,150,255,0.7)',
|
|
36
|
+
borderColor: 'rgba(0,150,255,0.2)',
|
|
37
|
+
borderWidth: 1,
|
|
38
|
+
radius: 30,
|
|
39
|
+
type: 'bubble',
|
|
40
|
+
data: [
|
|
41
|
+
{
|
|
42
|
+
y: 0,
|
|
43
|
+
x: 0,
|
|
44
|
+
r: 10
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
chartData = json
|
|
50
|
+
showChart(chartData)
|
|
13
51
|
})
|
|
14
52
|
|
|
15
53
|
function showChart (data) {
|
|
16
54
|
console.log(data)
|
|
17
|
-
new Chart("myChart", {
|
|
55
|
+
myChart = new Chart("myChart", {
|
|
18
56
|
type: "scatter",
|
|
19
57
|
data: data,
|
|
20
58
|
options: {
|
|
@@ -104,5 +142,92 @@ function showChart (data) {
|
|
|
104
142
|
ctx.style.backgroundColor = 'rgba(0,0,0,0.8)'
|
|
105
143
|
ctx.style.fontColor = 'white'
|
|
106
144
|
}
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
function connect () {
|
|
148
|
+
console.log("connect()")
|
|
149
|
+
ws = new WebSocket((window.location.protocol === 'https:' ? 'wss' : 'ws') + "://" + window.location.host + "/signalk/v1/stream?subscribe=none");
|
|
150
|
+
ws.onopen = function() {
|
|
151
|
+
|
|
152
|
+
// Start listening for value updates
|
|
153
|
+
startListeners();
|
|
154
|
+
|
|
155
|
+
ws.onmessage = function(event) {
|
|
156
|
+
if (event.data.includes('signalk-server')) {
|
|
157
|
+
welcomeMessage = event.data;
|
|
158
|
+
console.log("Skipping welcome message: " + welcomeMessage)
|
|
159
|
+
} else {
|
|
160
|
+
handleData(JSON.parse(event.data));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
ws.onclose = function() {
|
|
165
|
+
console.log("WebSocket closed")
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
ws.onerror = function(err) {
|
|
169
|
+
console.log("WebSocket connection error: " + err.message + " - closing connection");
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function startListeners () {
|
|
176
|
+
var paths = [{'path': 'environment.wind.angleTrueWaterDamped'}, {'path': 'performance.polarSpeed'}, {'path': 'performance.boatSpeedDamped'}]
|
|
177
|
+
|
|
178
|
+
var subscriptionObject = {
|
|
179
|
+
"context": "vessels.self",
|
|
180
|
+
"policy" : "ideal",
|
|
181
|
+
"minPeriod": 2000,
|
|
182
|
+
"subscribe": paths
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
var subscriptionMessage = JSON.stringify(subscriptionObject);
|
|
186
|
+
console.log("subscriptionMessage: " + subscriptionMessage);
|
|
187
|
+
ws.send(subscriptionMessage);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function handleData (data) {
|
|
191
|
+
if (typeof data.updates[0].meta != 'undefined') {
|
|
192
|
+
return
|
|
193
|
+
}
|
|
194
|
+
var path = data.updates[0].values[0].path
|
|
195
|
+
var value = data.updates[0].values[0].value
|
|
196
|
+
|
|
197
|
+
if (path == 'performance.polarSpeed') {
|
|
198
|
+
polarSpeed = msToKts(value)
|
|
199
|
+
// console.log('polarSpeed set to %s', polarSpeed)
|
|
200
|
+
chartData.datasets[0].data[0].y = polarSpeed
|
|
201
|
+
} else if (path == 'environment.wind.angleTrueWaterDamped') {
|
|
202
|
+
TWA = radToDeg(value)
|
|
203
|
+
// console.log('TWA set to %s', TWA)
|
|
204
|
+
chartData.datasets[0].data[0].x = TWA
|
|
205
|
+
chartData.datasets[1].data[0].x = TWA
|
|
206
|
+
} else if (path == 'performance.boatSpeedDamped') {
|
|
207
|
+
boatSpeed = msToKts(value)
|
|
208
|
+
// console.log('boatSpeed set to %s', boatSpeed)
|
|
209
|
+
chartData.datasets[1].data[0].y = boatSpeed
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
connect()
|
|
215
|
+
|
|
216
|
+
setInterval(updateChart, 300)
|
|
217
|
+
|
|
218
|
+
function updateChart () {
|
|
219
|
+
myChart.update()
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function radToDeg(radians) {
|
|
223
|
+
return radians * 180 / Math.PI
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function msToKts(ms) {
|
|
227
|
+
return ms * 1.94384
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
|
|
107
232
|
</script>
|
|
108
233
|
|