signalk-pypilot-newui 3.0.0 → 3.1.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/CHANGELOG.md CHANGED
@@ -1,5 +1,137 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.1.1 — 2026-10-10 — Refreshed screenshots
4
+
5
+ Patch: swaps in four up-to-date screenshots (captured on sea trial
6
+ 2026-10-10, Rev449) so the SK App Store listing shows the 3.1.0
7
+ feature set — Control rose with heading-precision gauge + AIS hull
8
+ top-view, Freeboard-SK chartplotter embedded in the rose, Logbook
9
+ trip detail with OpenSeaMap trace + SOG/AWS chart, and the refreshed
10
+ Tune sliders. No code changes.
11
+
12
+ ## 3.1.0 — 2026-10-10 — Fullscreen auto, configurable bottom chip, heading precision, AIS polish
13
+
14
+ Rolls up Rev439 → Rev449 (11 revs) on top of 3.0.0. Minor bump: a
15
+ family of UX refinements + a couple of safety-oriented fixes;
16
+ backward-compatible with 3.0.0 plugin config and SK paths. The theme
17
+ of the release is **"glance information at a distance"** — the sailor
18
+ mounts the tablet across the cockpit and reads the visor as a true
19
+ instrument, so chip sizes, legibility, precision indicators, and
20
+ fullscreen-by-default all got tightened in this bump.
21
+
22
+ ### Added
23
+
24
+ - **Fullscreen + Screen Wake Lock auto-on by default** (Rev446/Rev448).
25
+ On the very first user tap, the visor requests browser fullscreen
26
+ on `<html>` and takes a `navigator.wakeLock("screen")` so the
27
+ display never dims nor locks — same UX as YouTube's player. A
28
+ floating ⛶ button top-right toggles both and persists the sailor's
29
+ choice (`localStorage[pypilot-newui.fullscreenAuto]`), so later
30
+ reloads honour "I opted out".
31
+ - **Configurable bottom chip on the rose — up to 4 datapoints
32
+ cycled** (Rev439 → Rev445). Short-tap on the chip under the compass
33
+ cycles through the user-picked set (default: SOG → Depth → %Polar);
34
+ long-press opens a modal where the sailor picks up to 4 datapoints
35
+ from the same catalog as the four configurable corners (base paths +
36
+ performance extras + any custom SK path registered in a corner).
37
+ Persisted in `localStorage[pypilot-newui.roseBottomChipPaths]`.
38
+ Replaces the old "always AWS/TWS mirror" behaviour.
39
+ - **Heading-precision gauge under the compass readout** (Rev443/Rev444).
40
+ Second line inside the `#rose-hdg-chip` shows how far off the pilot
41
+ still is from its own target — the sailor's "glance accuracy
42
+ reading", not the target value itself. Signed `target - current`:
43
+ negative = pilot must correct to port (babor), positive = to
44
+ starboard (estribor). Colour: `|err|<3°` green, `<10°` orange, else
45
+ red. In compass / gps / nav uses heading − target; in wind / aproado
46
+ uses AWA − target; in true wind / empopado uses TWA − target.
47
+ Shows `--` when the AP is OFF (`state.engaged === false`) so a
48
+ stale `state.target` can never mislead the sailor.
49
+ - **Safe-exit to compass after APROADO / EMPOPADO** (Rev440). When
50
+ the user finishes an aproado or empopado without opting in to full
51
+ `restoreAll`, the visor now auto-switches the pilot back to COMPASS
52
+ with the current heading as target. Rationale: leaving the pilot in
53
+ WIND / TRUE WIND after the manoeuvre is less stable for "hold what
54
+ I have now" than COMPASS. Carlos sea-trial 2026-10-10. Falls back
55
+ to no-op if the heading sensor is absent.
56
+ - **AIS target as a tinted top-view hull sprite** (Rev442 → Rev443,
57
+ Rev447 → Rev449). Replaces the plain red triangle with the
58
+ `boat-cenital.svg` sprite (same asset as the own-vessel sprite in
59
+ the rose centre), tinted via SVG `feColorMatrix` filters per state:
60
+ red (alarm, blinking, 150 % scale) · orange (warn, fixed, 100 %) ·
61
+ blue-grey (acked, no blink, 100 %). Bow always points toward the
62
+ self vessel (rotation now `rotate(relDeg + 90)` to match the
63
+ horizontal asset). Alarm sprite blinks; acked stays fully visible
64
+ but muted. Paints as the LAST element inside the rose SVG so it
65
+ stays on top of wind arrows, sectors and HUDs.
66
+ - **Only the 3 most urgent AIS targets painted** (Rev441). When more
67
+ than 3 collision alarms are active, only the 3 lowest-TCPA ones
68
+ render on the rose. The infobox navigator still walks ALL alarms so
69
+ the sailor can scroll through the hidden ones.
70
+ - **Tap on an AIS target opens its data popup** (Rev441). Click
71
+ delegation on `#ais-alarm-layer`: tapping a hull sets
72
+ `_aisInfoboxIdx` to that MMSI and forces the popup open — works for
73
+ both pending and silenced targets. Auto-resets to the newest threat
74
+ after 20 s if no further interaction.
75
+ - **ACK keeps the AIS target arrow on the rose** (Rev441 → Rev442).
76
+ ACK no longer deletes the MMSI from `state.aisAlarms`; the hull
77
+ stays visible (silenced style) until the plugin declares the
78
+ threat gone. Button toggles ACK ↔ ACKED (ES: SILENCIAR ↔
79
+ SILENCIADO), with `disabled` + `.is-acked` styling when the MMSI is
80
+ already acknowledged.
81
+ - **X close button on the AIS infobox** (Rev442). When the sailor
82
+ opened the popup by tapping a hull, the X dismisses it and clears
83
+ the user-pick flag so new threats can take over.
84
+ - **Long "Viento Aparente" / "Viento Real" labels in the mode-selector
85
+ modal** (Rev441). The modal shows the long names so wind modes are
86
+ explicit on first open; the bbar button keeps the short labels
87
+ (APARENTE / REAL) to fit the narrow chip.
88
+ - **Landscape tabbar made compact** (Rev446). `.tab-btn` padding
89
+ `12→4 px`, font-size `14→12 px` inside
90
+ `@media (orientation: landscape)`. Saves ~20 vertical pixels for
91
+ tablets mounted horizontally.
92
+
93
+ ### Changed
94
+
95
+ - **Heading chip grows UPWARD** (Rev444). The chip rect height
96
+ expands toward `-y` (bottom edge still at `-84`), so the new
97
+ precision line never covers the target diamond that sits just
98
+ below the top of the compass ring.
99
+ - **AWS / TWS sub-line font-size bumped three steps** (Rev443 →
100
+ Rev445). From `clamp(11, 2vw, 16px)` to `clamp(20, 3.8vw, 32px)`
101
+ so the kn number sits halfway between the dim corner label and
102
+ the big angle value when read from the helm.
103
+ - **AIS voice is a short safety nudge, not a report** (Rev441,
104
+ Rev449). The voice line used to spell CPA / TCPA / MMSI, which TTS
105
+ mangled on long numbers. Now it just says *"Alarma AIS, target en
106
+ rumbo de colisión"* / *"AIS alarm, target on collision course"*;
107
+ the data stays visible in the infobox. ES says "AIS" as a word
108
+ (Rev449 — was "A I S" letter-by-letter).
109
+
110
+ ### Fixed
111
+
112
+ - **AIS target bearing was 180° off in some geometries** (Rev448 —
113
+ found during 2026-10-10 sea trial). `renderAisAlarms` checked
114
+ `state.position.latitude` but `state.position` carries short keys
115
+ `{lat, lon}` — the test always failed and the code fell back to
116
+ `cpaPositions.self` (= *projected* self position at CPA future
117
+ time). Bearing was then computed between two **future** positions,
118
+ which can be nowhere near the current geometry. The adapter now
119
+ converts `{lat, lon}` → `{latitude, longitude}` once at render
120
+ time, so the hull always paints at the real bearing to the target
121
+ as-of-now.
122
+ - **Signal K server token kept being asked "every once in a while"**
123
+ (Rev446). `handleAuthWrite` wiped the permanent device token on
124
+ the FIRST `401` and kicked off an access-request modal — a single
125
+ transient 401 (SK restart in flight, proxy hiccup, DNS blip) was
126
+ enough to invalidate a perfectly good token. Now requires THREE
127
+ consecutive 401 writes before wiping; one successful write resets
128
+ the counter.
129
+ - **Precision gauge sign convention** (Rev444). First pass used
130
+ `heading − target`; Carlos's convention is "the correction the
131
+ pilot still has to apply" → `target − heading`. Negative therefore
132
+ means *pilot must go to port* and positive *pilot must go to
133
+ starboard*.
134
+
3
135
  ## 3.0.0 — 2026-10-10 — AIS collision overlay + Freeboard-SK embedded
4
136
 
5
137
  Rolls up Rev431 through Rev438 (8 revs). The headline feature of 3.0.0
package/README.md CHANGED
@@ -10,20 +10,47 @@ watches how your autopilot is behaving and quietly suggests how to
10
10
  sharpen its settings, so you spend more time sailing and less time
11
11
  guessing which slider to move.
12
12
 
13
+ Since **3.0.0** the visor also ships with an **integrated
14
+ chartplotter**: double-tap the compass rose and
15
+ [Freeboard-SK](https://www.npmjs.com/package/@signalk/freeboard-sk)
16
+ opens embedded inside the rose box with every AIS target, your route
17
+ and all overlays — side panels (mode, nudges, AP) stay reachable, no
18
+ tab switching, no re-authentication. **For charts to render you need a
19
+ Signal K chart provider installed and configured in Freeboard-SK**
20
+ (see [Chart provider is required](#chart-provider-is-required-for-the-embedded-plotter)
21
+ below).
22
+
13
23
  Runs alongside [`pypilot-autopilot-provider`](https://www.npmjs.com/package/pypilot-autopilot-provider)
14
24
  by Panaaj — see [Working alongside pypilot-autopilot-provider](#working-alongside-pypilot-autopilot-provider).
15
25
 
26
+ ## Chart provider is required for the embedded plotter
27
+
28
+ The chartplotter embedded in the rose uses Freeboard-SK, which itself
29
+ is only a renderer — it needs a Signal K **chart provider** plugin to
30
+ know where to fetch tiles from. Any of the standard providers works:
31
+
32
+ - **[`@signalk/charts-plugin`](https://www.npmjs.com/package/@signalk/charts-plugin)**
33
+ — serves local MBTiles / S57 / XYZ chart sets you drop into
34
+ `~/.signalk/charts/` (OpenCPN-style). Recommended default.
35
+ - **[`signalk-chart-tiler`](https://www.npmjs.com/package/signalk-chart-tiler)**
36
+ or any other upstream raster/vector provider.
37
+
38
+ Without a provider, Freeboard-SK will open embedded in the rose but
39
+ the map area will stay empty. Install one from the SK App Store, add
40
+ your chart sources, and the chartplotter inside pypilot-newui lights
41
+ up automatically.
42
+
16
43
  ## Screenshots
17
44
 
18
- ![Control - compass rose with concentric target + wind arrows](https://raw.githubusercontent.com/Aitonos/signalk-pypilot-newui/main/public/screenshots/01-control-rose.jpg)
45
+ ![Control - compass rose with precision gauge + AIS collision target as a tinted top-view hull](https://raw.githubusercontent.com/Aitonos/signalk-pypilot-newui/main/public/screenshots/01-control-rose.png)
19
46
 
20
- | Chart · Trip Stats | Tune · gain sliders |
47
+ | Chartplotter embedded | Logbook · trip detail |
21
48
  |---|---|
22
- | ![Chart tab - Trip Stats + Servo Health](https://raw.githubusercontent.com/Aitonos/signalk-pypilot-newui/main/public/screenshots/02-chart-trip-stats.jpg) | ![Tune tab - PID gain sliders](https://raw.githubusercontent.com/Aitonos/signalk-pypilot-newui/main/public/screenshots/03-tune-gains.jpg) |
49
+ | ![Chartplotter integrated - Freeboard-SK embedded in the rose box](https://raw.githubusercontent.com/Aitonos/signalk-pypilot-newui/main/public/screenshots/02-chartplotter-embedded.png) | ![Logbook trip detail - OpenSeaMap trace + SOG vs AWS chart](https://raw.githubusercontent.com/Aitonos/signalk-pypilot-newui/main/public/screenshots/03-logbook-trip-detail.png) |
23
50
 
24
- | Setup · Trips | Chart · hover freeze |
51
+ | Tune · gain sliders | Chart · hover freeze |
25
52
  |---|---|
26
- | ![Setup - Trips card](https://raw.githubusercontent.com/Aitonos/signalk-pypilot-newui/main/public/screenshots/04-setup-launcher.jpg) | ![Chart - hover freeze](https://raw.githubusercontent.com/Aitonos/signalk-pypilot-newui/main/public/screenshots/05-race-timer.jpg) |
53
+ | ![Tune tab - PID gain sliders](https://raw.githubusercontent.com/Aitonos/signalk-pypilot-newui/main/public/screenshots/04-tune-sliders.png) | ![Chart - hover freeze](https://raw.githubusercontent.com/Aitonos/signalk-pypilot-newui/main/public/screenshots/05-race-timer.jpg) |
27
54
 
28
55
  ![Tack history - persistent per-tack log](https://raw.githubusercontent.com/Aitonos/signalk-pypilot-newui/main/public/screenshots/06-info.jpg)
29
56
 
@@ -247,7 +274,10 @@ on its own), but installing them unlocks the features listed.
247
274
  — Double-tap the compass rose to open Freeboard-SK embedded inside
248
275
  the rose box (side panels stay visible and usable). Lets you drop
249
276
  from the autopilot view to the full chart with every AIS target in
250
- one tap, without leaving the pypilot-newui session.
277
+ one tap, without leaving the pypilot-newui session. **Pair with a
278
+ Signal K chart provider (e.g. `@signalk/charts-plugin`) or the chart
279
+ area will stay empty** — see
280
+ [Chart provider is required](#chart-provider-is-required-for-the-embedded-plotter).
251
281
  See `docs/_feature_ais_overlay.md`.
252
282
 
253
283
  - **[`signalk-collision-alerts`](https://www.npmjs.com/package/signalk-collision-alerts)**
package/dist/index.js CHANGED
@@ -28,7 +28,7 @@ const trip_recorder_1 = require("./trip-recorder");
28
28
  const maneuver_trace_1 = require("./maneuver-trace");
29
29
  // Rev counter bumped on every build so the user can distinguish deploys
30
30
  // from the webapp header (feedback_revision_bump_each_build).
31
- const PLUGIN_REVISION = "Rev438";
31
+ const PLUGIN_REVISION = "Rev449";
32
32
  // Rev59: read package.json once at load time so /status can report the
33
33
  // npm package version alongside the internal Rev counter.
34
34
  // eslint-disable-next-line @typescript-eslint/no-require-imports
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "signalk-pypilot-newui",
3
- "version": "3.0.0",
3
+ "version": "3.1.1",
4
4
  "description": "Signal K friendly UI for the pypilot autopilot, with first-class Signal K paths and Simple Switches so any downstream Signal K client can drive or monitor the pilot. Touch-first mobile visor + full pypilot data (servo, gains, calibration, tack, warnings). Coexists with pypilot-autopilot-provider.",
5
5
  "main": "./dist/index.js",
6
6
  "scripts": {
@@ -51,20 +51,20 @@
51
51
  "webapp": "./public",
52
52
  "screenshots": [
53
53
  {
54
- "src": "./public/screenshots/01-control-rose.jpg",
55
- "title": "Control - compass rose with concentric target + wind arrows (amber A = apparent wind, teal T = true wind), hull-fixed sailing wedges, 4 configurable corner tiles, big-touch AP button and heading trim buttons"
54
+ "src": "./public/screenshots/01-control-rose.png",
55
+ "title": "Control - compass rose with heading + precision gauge (green/orange/red), AWA/TWA wind arrows, hull-fixed sailing wedges, configurable bottom chip (SOG/depth/polar%/custom) and an AIS collision target painted as a tinted top-view hull"
56
56
  },
57
57
  {
58
- "src": "./public/screenshots/02-chart-trip-stats.jpg",
59
- "title": "Chart - Trip Stats cards (AP engaged time, distance, energy, RMS/p95 heading error, servo runtime, tacks/gybes, max servo A) plus live Servo Health with baseline, recent average, deviation and peak"
58
+ "src": "./public/screenshots/02-chartplotter-embedded.png",
59
+ "title": "Chartplotter integrated - double-tap the rose to open Freeboard-SK embedded inside the rose box; every AIS target, route and your position with the autopilot buttons still reachable. Needs a Signal K chart provider (e.g. @signalk/charts-plugin)"
60
60
  },
61
61
  {
62
- "src": "./public/screenshots/03-tune-gains.jpg",
63
- "title": "Tune - PID gain sliders per pilot/profile with plain-language help ('act now reflex', 'closes sustained drift'), locked by default with orange 'was:' baseline, +/-10 and +/-1 fine-tune buttons"
62
+ "src": "./public/screenshots/03-logbook-trip-detail.png",
63
+ "title": "Logbook - auto-recorded trip detail with OpenSeaMap trace, speed-coloured track, gust / peak-SOG / low-voltage / tack markers and a SOG vs AWS chart"
64
64
  },
65
65
  {
66
- "src": "./public/screenshots/04-setup-launcher.jpg",
67
- "title": "Trips - auto-recorded outings summarised with distance, duration, average SOG/TWS, tack count and peak speeds; tap to open the OpenSeaMap trace and share as PNG or WhatsApp"
66
+ "src": "./public/screenshots/04-tune-sliders.png",
67
+ "title": "Tune - PID gain sliders per pilot/profile with plain-language help ('act now reflex', 'closes sustained drift'), PROFILE badge, locked by default with +/-10 and +/-1 fine-tune buttons and a reset-to-baseline icon"
68
68
  },
69
69
  {
70
70
  "src": "./public/screenshots/05-race-timer.jpg",