@signalk/freeboard-sk 2.19.9 → 2.21.0-beta.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signalk/freeboard-sk",
3
- "version": "2.19.9",
3
+ "version": "2.21.0-beta.1",
4
4
  "description": "Openlayers chart plotter implementation for Signal K",
5
5
  "keywords": [
6
6
  "signalk-webapp",
@@ -64,22 +64,17 @@
64
64
  "@types/arcgis-rest-api": "^10.4.5",
65
65
  "@types/express": "^4.17.17",
66
66
  "@types/geojson": "^7946.0.10",
67
- "@types/jasmine": "~5.1.0",
68
67
  "@types/node": "^24.10.1",
69
68
  "@types/topojson-specification": "^1.0.2",
70
69
  "@types/xml2js": "^0.4.14",
71
70
  "@typescript-eslint/eslint-plugin": "^8.46.3",
72
71
  "@typescript-eslint/parser": "^8.46.3",
72
+ "@vitest/web-worker": "^4.0.18",
73
73
  "baseline-browser-mapping": "^2.9.18",
74
74
  "buffer": "^6.0.3",
75
75
  "eslint": "^9.17.0",
76
76
  "events": "^3.3.0",
77
- "jasmine-core": "~5.5.0",
78
- "karma": "~6.4.0",
79
- "karma-chrome-launcher": "~3.1.0",
80
- "karma-coverage": "~2.2.0",
81
- "karma-jasmine": "~5.1.0",
82
- "karma-jasmine-html-reporter": "~2.1.0",
77
+ "jsdom": "^28.1.0",
83
78
  "ng-packagr": "^21.0.0",
84
79
  "ngeohash": "^0.6.3",
85
80
  "ol": "^10.7.0",
@@ -88,7 +83,7 @@
88
83
  "prettier": "^3.6.2",
89
84
  "prettier-plugin-organize-attributes": "^1.0.0",
90
85
  "proj4": "2.6.2",
91
- "rxjs": "~6.6.3",
86
+ "rxjs": "~7.8.2",
92
87
  "semver": "^7.6.0",
93
88
  "signalk-client-angular": "^2.0.3",
94
89
  "simplify-ts": "^1.0.2",
@@ -97,6 +92,7 @@
97
92
  "timers": "^0.1.1",
98
93
  "ts-node": "~7.0.0",
99
94
  "typescript": "~5.9.3",
95
+ "vitest": "^4.0.18",
100
96
  "xml2js": "^0.6.2",
101
97
  "zone.js": "~0.15.0"
102
98
  }
@@ -7,19 +7,6 @@ const uuid = tslib_1.__importStar(require("uuid"));
7
7
  const geolib_1 = require("geolib");
8
8
  const AREA_TRIGGERS = ['entry', 'exit'];
9
9
  const AREA_GEOMETRIES = ['polygon', 'circle', 'region'];
10
- const STANDARD_ALARMS = [
11
- 'mob',
12
- 'fire',
13
- 'sinking',
14
- 'flooding',
15
- 'collision',
16
- 'grounding',
17
- 'listing',
18
- 'adrift',
19
- 'piracy',
20
- 'abandon',
21
- 'aground'
22
- ];
23
10
  const ALARM_API_PATH = '/signalk/v2/api/alarms';
24
11
  class AreaAlarmManager {
25
12
  alarms;
@@ -62,7 +49,6 @@ class AreaAlarmManager {
62
49
  * @param id Area identifier
63
50
  */
64
51
  silence(id) {
65
- // clean up notification
66
52
  const n = getSelfPathValue(`notifications.area.${id}`);
67
53
  if (n?.value && Array.isArray(n.value.method)) {
68
54
  const m = n.value.method.filter((i) => i !== 'sound');
@@ -98,7 +84,6 @@ class AreaAlarmManager {
98
84
  notify = true;
99
85
  server.debug(`*** active -> to inactive (${id})`);
100
86
  }
101
- alarm.lastUpdate == Date.now();
102
87
  }
103
88
  else {
104
89
  if (condition === 'outside' && !alarm.active) {
@@ -115,6 +100,7 @@ class AreaAlarmManager {
115
100
  }
116
101
  }
117
102
  if (notify) {
103
+ alarm.lastUpdate = Date.now();
118
104
  const msg = area.trigger === 'entry'
119
105
  ? alarm.active
120
106
  ? `Monitored area ${area.name ? area.name + ' ' : ''}has been entered.`
@@ -147,13 +133,6 @@ const initAlarms = (app, id) => {
147
133
  server = app;
148
134
  pluginId = id;
149
135
  server.debug(`** initAlarms() **`);
150
- if (server.registerActionHandler) {
151
- server.debug(`** Registering Alarm Action Handler(s) **`);
152
- STANDARD_ALARMS.forEach((i) => {
153
- server.debug(`** Registering ${i} Handler **`);
154
- server.registerPutHandler('vessels.self', `notifications.${i}`, handleV1PutRequest, pluginId);
155
- });
156
- }
157
136
  initAlarmEndpoints();
158
137
  setTimeout(() => parseRegionList(), 5000);
159
138
  // subscribe to deltas
@@ -351,147 +330,6 @@ const initAlarmEndpoints = async () => {
351
330
  });
352
331
  }
353
332
  });
354
- const f = await server.getFeatures();
355
- // test for notifications API
356
- if (!f.apis.includes('notifications')) {
357
- // standard alarms
358
- server.post(`${ALARM_API_PATH}/:alarmType`, (req, res, next) => {
359
- server.debug(`** ${req.method} ${ALARM_API_PATH}/${req.params.alarmType}`);
360
- if (!STANDARD_ALARMS.includes(req.params.alarmType)) {
361
- next();
362
- return;
363
- }
364
- try {
365
- const id = uuid.v4();
366
- const msg = req.body.message
367
- ? req.body.message
368
- : req.params.alarmType;
369
- const r = handleAlarm('vessels.self', `notifications.${req.params.alarmType}.${id}`, Object.assign({
370
- message: msg,
371
- method: [server_api_1.ALARM_METHOD.sound, server_api_1.ALARM_METHOD.visual],
372
- state: server_api_1.ALARM_STATE.emergency
373
- }, buildAlarmData()));
374
- res.status(r.statusCode).json(Object.assign(r, { id: id }));
375
- }
376
- catch (e) {
377
- res.status(400).json({
378
- state: 'FAILED',
379
- statusCode: 400,
380
- message: e.message
381
- });
382
- }
383
- });
384
- server.post(`${ALARM_API_PATH}/:alarmType/:id/silence`, (req, res) => {
385
- server.debug(`** ${req.method} ${req.path}`);
386
- if (!STANDARD_ALARMS.includes(req.params.alarmType)) {
387
- res.status(200).json({
388
- state: 'COMPLETED',
389
- statusCode: 200,
390
- message: `Unsupported Alarm (${req.params.alarmType}).`
391
- });
392
- return;
393
- }
394
- try {
395
- const al = getSelfPathValue(`notifications.${req.params.alarmType}.${req.params.id}`);
396
- if (al?.value) {
397
- server.debug('Alarm value....');
398
- if (al.value.method &&
399
- al.value.method.includes(server_api_1.ALARM_METHOD.sound)) {
400
- server.debug('Alarm has sound... silence!!!');
401
- al.value.method = al.value.method.filter((i) => i !== server_api_1.ALARM_METHOD.sound);
402
- const r = handleAlarm('vessels.self', `notifications.${req.params.alarmType}.${req.params.id}`, al.value);
403
- res.status(r.statusCode).json(r);
404
- }
405
- else {
406
- server.debug('Alarm has no sound... no action required.');
407
- res.status(200).json({
408
- state: 'COMPLETED',
409
- statusCode: 200,
410
- message: `Alarm (${req.params.alarmType}) is already silent.`
411
- });
412
- }
413
- }
414
- else {
415
- throw new Error(`Alarm (${req.params.alarmType}.${req.params.id}) has no value or was not found!`);
416
- }
417
- }
418
- catch (e) {
419
- res.status(400).json({
420
- state: 'FAILED',
421
- statusCode: 400,
422
- message: e.message
423
- });
424
- }
425
- });
426
- server.delete(`${ALARM_API_PATH}/:alarmType/:id`, (req, res, next) => {
427
- server.debug(`** ${req.method} ${ALARM_API_PATH}/${req.params.alarmType}`);
428
- if (!STANDARD_ALARMS.includes(req.params.alarmType)) {
429
- next();
430
- return;
431
- }
432
- try {
433
- const r = handleAlarm('vessels.self', `notifications.${req.params.alarmType}.${req.params.id}`, {
434
- message: '',
435
- method: [],
436
- state: server_api_1.ALARM_STATE.normal
437
- });
438
- res.status(r.statusCode).json(r);
439
- }
440
- catch (e) {
441
- res.status(400).json({
442
- state: 'FAILED',
443
- statusCode: 400,
444
- message: e.message
445
- });
446
- }
447
- });
448
- }
449
- };
450
- const handleV1PutRequest = (context, path, value, cb) => {
451
- cb(handleAlarm(context, path, value));
452
- };
453
- const buildAlarmData = () => {
454
- const pos = getSelfPathValue('navigation.position');
455
- const r = {
456
- createdAt: new Date().toISOString()
457
- };
458
- if (pos?.value) {
459
- r.position = pos.value;
460
- }
461
- return r;
462
- };
463
- const handleAlarm = (context, path, value) => {
464
- server.debug(`context: ${context}`);
465
- server.debug(`path: ${path}`);
466
- server.debug(`value: ${JSON.stringify(value)}`);
467
- if (!path) {
468
- server.debug('Error: no path provided!');
469
- return {
470
- state: 'COMPLETED',
471
- resultStatus: 400,
472
- statusCode: 400,
473
- message: `Invalid reference!`
474
- };
475
- }
476
- const pa = path.split('.');
477
- const alarmType = pa[1];
478
- server.debug(`alarmType: ${JSON.stringify(alarmType)}`);
479
- if (STANDARD_ALARMS.includes(alarmType)) {
480
- server.debug(`****** Sending Delta (Std Alarm Notification): ******`);
481
- emitNotification({
482
- path: path,
483
- value: value ?? null
484
- });
485
- return { state: 'COMPLETED', resultStatus: 200, statusCode: 200 };
486
- }
487
- else {
488
- return {
489
- state: 'COMPLETED',
490
- resultStatus: 400,
491
- statusCode: 400,
492
- message: `Invalid reference!`
493
- };
494
- }
495
333
  };
496
334
  // emit notification delta message **
497
335
  const emitNotification = (msg) => {
package/plugin/index.js CHANGED
@@ -4,7 +4,7 @@ const tslib_1 = require("tslib");
4
4
  const server_api_1 = require("@signalk/server-api");
5
5
  const alarms_1 = require("./alarms/alarms");
6
6
  const openapi = tslib_1.__importStar(require("./openApi.json"));
7
- const defaultPollInterval = 60;
7
+ //const defaultPollInterval = 60;
8
8
  const CONFIG_SCHEMA = {
9
9
  properties: {}
10
10
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "openapi": "3.0.0",
3
3
  "info": {
4
- "version": "2.18.0",
4
+ "version": "2.20.0",
5
5
  "title": "Freeboard-SK API",
6
6
  "description": "API endpoints exposed by Freeboard-SK to support application functionality and experimental features.",
7
7
  "termsOfService": "http://signalk.org/terms/",
@@ -14,16 +14,7 @@
14
14
  "url": "http://signalk.org/specification/",
15
15
  "description": "Signal K specification."
16
16
  },
17
- "servers": [
18
- {
19
- "url": "/"
20
- }
21
- ],
22
17
  "tags": [
23
- {
24
- "name": "Alarms",
25
- "description": "Standard alarms."
26
- },
27
18
  {
28
19
  "name": "Areas",
29
20
  "description": "Area alarms."
@@ -142,28 +133,6 @@
142
133
  "schema": {
143
134
  "type": "number"
144
135
  }
145
- },
146
- "AlarmTypeParam": {
147
- "in": "path",
148
- "required": true,
149
- "name": "alarmType",
150
- "description": "Alarm type.",
151
- "schema": {
152
- "type": "string",
153
- "enum": [
154
- "mob",
155
- "fire",
156
- "sinking",
157
- "flooding",
158
- "collision",
159
- "grounding",
160
- "listing",
161
- "adrift",
162
- "piracy",
163
- "abandon",
164
- "aground"
165
- ]
166
- }
167
136
  }
168
137
  },
169
138
  "securitySchemes": {
@@ -182,16 +151,19 @@
182
151
  "security": [{ "cookieAuth": [] }, { "bearerAuth": [] }],
183
152
  "paths": {
184
153
  "/signalk/v2/api/alarms/area": {
185
- "post": {
154
+ "get": {
186
155
  "tags": ["Areas"],
187
- "summary": "Set Alarm area.",
156
+ "summary": "List Area Alarms.",
188
157
  "requestBody": {
189
- "description": "Sets the defined area to monitor for vessel entry /exit.",
158
+ "description": "Lists the areas to monitor for vessel entry /exit.",
190
159
  "required": true,
191
160
  "content": {
192
161
  "application/json": {
193
162
  "schema": {
194
- "$ref": "#/components/schemas/AreaAlarmDef"
163
+ "type": "array",
164
+ "items": {
165
+ "$ref": "#/components/schemas/AreaAlarmDef"
166
+ }
195
167
  }
196
168
  }
197
169
  }
@@ -204,19 +176,12 @@
204
176
  "$ref": "#/components/responses/ErrorResponse"
205
177
  }
206
178
  }
207
- }
208
- },
209
- "/signalk/v2/api/alarms/area/{id}": {
210
- "parameters": [
211
- {
212
- "$ref": "#/components/parameters/AlarmIdParam"
213
- }
214
- ],
215
- "put": {
179
+ },
180
+ "post": {
216
181
  "tags": ["Areas"],
217
- "summary": "Update Alarm area OR Set the `Region` resource with the supplied identifier as the alarm area.",
182
+ "summary": "Set Alarm area.",
218
183
  "requestBody": {
219
- "description": "Updates the area details for the supplied area identfier.",
184
+ "description": "Sets the defined area to monitor for vessel entry /exit.",
220
185
  "required": true,
221
186
  "content": {
222
187
  "application/json": {
@@ -234,62 +199,24 @@
234
199
  "$ref": "#/components/responses/ErrorResponse"
235
200
  }
236
201
  }
237
- },
238
- "delete": {
239
- "tags": ["Areas"],
240
- "summary": "Clear / cancel Area Alarm.",
241
- "responses": {
242
- "200ActionResponse": {
243
- "$ref": "#/components/responses/200OKResponse"
244
- },
245
- "default": {
246
- "$ref": "#/components/responses/ErrorResponse"
247
- }
248
- }
249
202
  }
250
203
  },
251
- "/signalk/v2/api/alarms/area/{id}/silence": {
204
+ "/signalk/v2/api/alarms/area/{id}": {
252
205
  "parameters": [
253
206
  {
254
207
  "$ref": "#/components/parameters/AlarmIdParam"
255
208
  }
256
209
  ],
257
- "post": {
210
+ "put": {
258
211
  "tags": ["Areas"],
259
- "summary": "Silence Area Alarm.",
260
- "responses": {
261
- "200ActionResponse": {
262
- "$ref": "#/components/responses/200OKResponse"
263
- },
264
- "default": {
265
- "$ref": "#/components/responses/ErrorResponse"
266
- }
267
- }
268
- }
269
- },
270
- "/signalk/v2/api/alarms/{alarmType}": {
271
- "parameters": [
272
- {
273
- "$ref": "#/components/parameters/AlarmTypeParam"
274
- }
275
- ],
276
- "post": {
277
- "tags": ["Alarms"],
278
- "summary": "Raise Alarm.",
212
+ "summary": "Update Alarm area OR Set the `Region` resource with the supplied identifier as the alarm area.",
279
213
  "requestBody": {
280
- "description": "Alarm message text.",
281
- "required": false,
214
+ "description": "Updates the area details for the supplied area identfier.",
215
+ "required": true,
282
216
  "content": {
283
217
  "application/json": {
284
218
  "schema": {
285
- "type": "object",
286
- "properties": {
287
- "message": {
288
- "type": "string",
289
- "description": "Alarm message text.",
290
- "example": "Person overboard!"
291
- }
292
- }
219
+ "$ref": "#/components/schemas/AreaAlarmDef"
293
220
  }
294
221
  }
295
222
  }
@@ -302,20 +229,10 @@
302
229
  "$ref": "#/components/responses/ErrorResponse"
303
230
  }
304
231
  }
305
- }
306
- },
307
- "/signalk/v2/api/alarms/{alarmType}/{id}": {
308
- "parameters": [
309
- {
310
- "$ref": "#/components/parameters/AlarmTypeParam"
311
- },
312
- {
313
- "$ref": "#/components/parameters/AlarmIdParam"
314
- }
315
- ],
232
+ },
316
233
  "delete": {
317
- "tags": ["Alarms"],
318
- "summary": "Clear / cancel Alarm.",
234
+ "tags": ["Areas"],
235
+ "summary": "Clear / cancel Area Alarm.",
319
236
  "responses": {
320
237
  "200ActionResponse": {
321
238
  "$ref": "#/components/responses/200OKResponse"
@@ -326,18 +243,15 @@
326
243
  }
327
244
  }
328
245
  },
329
- "/signalk/v2/api/alarms/{alarmType}/{id}/silence": {
246
+ "/signalk/v2/api/alarms/area/{id}/silence": {
330
247
  "parameters": [
331
- {
332
- "$ref": "#/components/parameters/AlarmTypeParam"
333
- },
334
248
  {
335
249
  "$ref": "#/components/parameters/AlarmIdParam"
336
250
  }
337
251
  ],
338
252
  "post": {
339
- "tags": ["Alarms"],
340
- "summary": "Silence Alarm.",
253
+ "tags": ["Areas"],
254
+ "summary": "Silence Area Alarm.",
341
255
  "responses": {
342
256
  "200ActionResponse": {
343
257
  "$ref": "#/components/responses/200OKResponse"
@@ -844,6 +844,22 @@ License: "Apache-2.0"
844
844
  limitations under the License.
845
845
 
846
846
 
847
+ --------------------------------------------------------------------------------
848
+ Package: tslib
849
+ License: "0BSD"
850
+
851
+ Copyright (c) Microsoft Corporation.
852
+
853
+ Permission to use, copy, modify, and/or distribute this software for any
854
+ purpose with or without fee is hereby granted.
855
+
856
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
857
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
858
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
859
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
860
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
861
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
862
+ PERFORMANCE OF THIS SOFTWARE.
847
863
  --------------------------------------------------------------------------------
848
864
  Package: @angular/common
849
865
  License: "MIT"
@@ -1035,38 +1051,6 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
1035
1051
  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1036
1052
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1037
1053
 
1038
- --------------------------------------------------------------------------------
1039
- Package: pbf
1040
- License: "BSD-3-Clause"
1041
-
1042
- Copyright (c) 2024, Mapbox
1043
- All rights reserved.
1044
-
1045
- Redistribution and use in source and binary forms, with or without
1046
- modification, are permitted provided that the following conditions are met:
1047
-
1048
- * Redistributions of source code must retain the above copyright notice, this
1049
- list of conditions and the following disclaimer.
1050
-
1051
- * Redistributions in binary form must reproduce the above copyright notice,
1052
- this list of conditions and the following disclaimer in the documentation
1053
- and/or other materials provided with the distribution.
1054
-
1055
- * Neither the name of pbf nor the names of its
1056
- contributors may be used to endorse or promote products derived from
1057
- this software without specific prior written permission.
1058
-
1059
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1060
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1061
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1062
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
1063
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1064
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
1065
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
1066
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
1067
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1068
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1069
-
1070
1054
  --------------------------------------------------------------------------------
1071
1055
  Package: quickselect
1072
1056
  License: "ISC"
@@ -1191,6 +1175,38 @@ Package: pmtiles
1191
1175
  License: "BSD-3-Clause"
1192
1176
 
1193
1177
 
1178
+ --------------------------------------------------------------------------------
1179
+ Package: pbf
1180
+ License: "BSD-3-Clause"
1181
+
1182
+ Copyright (c) 2024, Mapbox
1183
+ All rights reserved.
1184
+
1185
+ Redistribution and use in source and binary forms, with or without
1186
+ modification, are permitted provided that the following conditions are met:
1187
+
1188
+ * Redistributions of source code must retain the above copyright notice, this
1189
+ list of conditions and the following disclaimer.
1190
+
1191
+ * Redistributions in binary form must reproduce the above copyright notice,
1192
+ this list of conditions and the following disclaimer in the documentation
1193
+ and/or other materials provided with the distribution.
1194
+
1195
+ * Neither the name of pbf nor the names of its
1196
+ contributors may be used to endorse or promote products derived from
1197
+ this software without specific prior written permission.
1198
+
1199
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1200
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1201
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1202
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
1203
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1204
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
1205
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
1206
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
1207
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1208
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1209
+
1194
1210
  --------------------------------------------------------------------------------
1195
1211
  Package: @maplibre/maplibre-gl-style-spec
1196
1212
  License: "ISC"
@@ -2269,9 +2269,20 @@
2269
2269
  This section provides choices about the units and values used when
2270
2270
  displaying data.<br />
2271
2271
 
2272
+ <b>Use Server Unit Preferences</b>: When checked sets the Distance,
2273
+ Depth, Speed & Temperature units to those selected on the Signal K
2274
+ server.
2275
+ <br />
2272
2276
  <b>Distance Units</b>: <i>Kilometres</i> / <i>Nautical Miles</i>
2273
2277
  <br />
2274
- <b>Depth Units</b>: <i>Metres</i> / <i>Feet</i>
2278
+ <b>Depth Units</b>: <i>Metres</i> / <i>Feet</i> / <i>Fathom</i>
2279
+ <br />
2280
+ <b>Length Units</b>: <i>Metres</i> / <i>Feet</i>
2281
+ <br />
2282
+ <b>Speed Units</b>: <i>Knots</i> / <i>m/sec</i> / <i>km/h</i> /
2283
+ <i>mph</i>
2284
+ <br />
2285
+ <b>Temperature Units</b>: <i>Celcius</i> / <i>Fahrenheit</i>
2275
2286
  <br />
2276
2287
  <b>Prefer True / Magnetic values</b>: <i>True</i> / <i>Magnetic</i
2277
2288
  ><br />
@@ -2330,6 +2341,7 @@
2330
2341
  </li>
2331
2342
  </ul>
2332
2343
  <b>Vector Charts:</b><br />
2344
+ Options that apply to S57 charts.
2333
2345
  <ul>
2334
2346
  <li>
2335
2347
  <b>Graphics Style</b>: Select this option in order to a close a
@@ -2342,6 +2354,10 @@
2342
2354
  <li><b>Shallow Depth</b>: Enter the depth in meters.</li>
2343
2355
  <li><b>Safety Depth</b>: Enter the depth in meters.</li>
2344
2356
  <li><b>Deep Depth</b>: Enter the depth in meters.</li>
2357
+ <li>
2358
+ <b>Layers</b>: Select S57 layers to display
2359
+ <i>(when avaiable)</i>.
2360
+ </li>
2345
2361
  </ul>
2346
2362
  <hr />
2347
2363
 
@@ -2418,7 +2434,7 @@
2418
2434
  <b>Default</b>: Calculates the length of the line displayed
2419
2435
  based on the vessel SOG and the map scale.
2420
2436
  </li>
2421
- <li><b>(x) NM</b> Length of the line to display.</li>
2437
+ <li><b>(x) nmi</b> Length of the line to display.</li>
2422
2438
  </ul>
2423
2439
  </li>
2424
2440
  <li>