signalk-pypilot-newui 2.8.0 → 2.10.0
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 +138 -0
- package/LICENSE +661 -0
- package/NOTICE +33 -9
- package/README.md +16 -16
- package/dist/alarms.js +88 -9
- package/dist/failsafe-bsp.js +64 -0
- package/dist/index.js +523 -17
- package/dist/leeway.js +74 -0
- package/dist/maneuver-trace.js +175 -0
- package/dist/publisher.js +2 -2
- package/dist/tack-catchup.js +90 -0
- package/dist/test/alarms-attitude.test.js +110 -0
- package/dist/test/alarms-trim.test.js +1 -1
- package/dist/test/episodes.test.js +1 -0
- package/dist/test/failsafe-bsp.test.js +56 -0
- package/dist/test/leeway.test.js +91 -0
- package/dist/test/servo-error-log.test.js +1 -1
- package/dist/test/tack-catchup.test.js +90 -0
- package/package.json +3 -3
- package/public/app.js +1057 -35
- package/public/index.html +295 -178
- package/public/style.css +55 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,143 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.10.0 — 2026-09-27 — Sea-trial wind-mode fixes + maneuver forensics
|
|
4
|
+
|
|
5
|
+
Rolls up Rev309 through Rev323. Between 2.9.0 (Rev280) and 2.10.0 the
|
|
6
|
+
plugin absorbed a sea trial (2026-09-25) that surfaced several critical
|
|
7
|
+
gaps in the wind-mode workflow, plus a new forensics module so future
|
|
8
|
+
sea trials can be audited offline.
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Maneuver Trace Log** (Rev322, opt-in). Every user-driven action from
|
|
13
|
+
the visor — aproado / empopado pick, tack tap, mode change, target PUT,
|
|
14
|
+
engage / disengage — is recorded together with pypilot state right
|
|
15
|
+
before the command AND 300 ms after. Pair pre/post makes it trivial
|
|
16
|
+
to answer "did the pilot actually obey?". Files land as JSONL under
|
|
17
|
+
`<plugin data dir>/maneuver-trace/`. New endpoints:
|
|
18
|
+
`GET|POST /maneuver-trace/{status,start,stop,event}` +
|
|
19
|
+
`GET /maneuver-trace/tail?n=N`. Setup card "Maneuver trace
|
|
20
|
+
(sea-trial forensics)" toggles it on the fly, off by default.
|
|
21
|
+
- **Empopado pseudo-mode** (Rev313 → Rev320) — mirror of Aproado for the
|
|
22
|
+
other extreme: bring the boat to TWA ≈ 180° so the mainsail flogs the
|
|
23
|
+
least while striking sail. Full HUD (choosing → transit → active),
|
|
24
|
+
hot gains at latch (P × 1.5, D × 1.7, servo slew × 1.3), audible
|
|
25
|
+
warning when `|TWA| < 160°` sustained 1 s ("empopado inestable"),
|
|
26
|
+
auto-cancel when `|TWA| < 140°` sustained 2.5 s. Restore in order
|
|
27
|
+
hot gains → profile → mode → target → engaged on SALIR / cancel.
|
|
28
|
+
- **Attitude safety alarms** (Rev299 / I1) — `attitude-heel-extreme` and
|
|
29
|
+
`attitude-pitch-extreme` rules with configurable thresholds
|
|
30
|
+
(`alarmAttitudeHeelDeg`, `alarmAttitudePitchDeg`), off by default so
|
|
31
|
+
a fresh install never disarms on the dock.
|
|
32
|
+
- **Roll feed-forward** (Rev282+) and **Post-tack catch-up** (Rev299)
|
|
33
|
+
publish diagnostic paths under
|
|
34
|
+
`steering.autopilot.pypilot.tuning.rollFf.*` and `.tackCatchup.*`.
|
|
35
|
+
Both are currently `appliedToAp: false` — computed and observable
|
|
36
|
+
but not yet fed to the pilot; a later release flips the switch after
|
|
37
|
+
sea trial validation.
|
|
38
|
+
- **Leeway estimator** (Rev298 / H4) publishing
|
|
39
|
+
`steering.autopilot.pypilot.derived.leewayRad` from the classical
|
|
40
|
+
`drift_deg = adj * heel_deg / bsp_kn²` formula. Opt-in via
|
|
41
|
+
`leewayAdjustment > 0`, kept off the canonical `performance.leeway`
|
|
42
|
+
path so it never overwrites `signalk-derived-data`.
|
|
43
|
+
- **Failsafe boat speed** (Rev299 / H2) — when both BSP and SOG go
|
|
44
|
+
missing, the plugin injects a configurable knots value so downstream
|
|
45
|
+
wind / leeway calculations keep producing plausible numbers.
|
|
46
|
+
- **Profile default persistence fix** (Rev310) — opening the visor from
|
|
47
|
+
a second device no longer silently overwrites the pypilot profile with
|
|
48
|
+
`default`; the select is now primed from the HTTP snapshot before the
|
|
49
|
+
WebSocket delta arrives.
|
|
50
|
+
|
|
51
|
+
### Fixed (critical — from the 2026-09-25 sea trial)
|
|
52
|
+
|
|
53
|
+
- **Tack in wind mode** (Rev309) — pressing VIRAR to a specific side now
|
|
54
|
+
reliably rotates the bow to that side, even when the "short arc" would
|
|
55
|
+
go the other way. Root cause: `planned = -refRad` in the countdown
|
|
56
|
+
path was ignoring the sign; now `_tackCountdownToExecuting` delegates
|
|
57
|
+
to `ap.tack.direction` + `ap.tack.state=begin` so pypilot honours the
|
|
58
|
+
band the sailor chose.
|
|
59
|
+
- **Aproado without countdown** (Rev311) — pressing POR PROA / POR POPA
|
|
60
|
+
starts the maneuver on the same tap (previously 5 s delay). Sustain
|
|
61
|
+
3 s for the "achieved" latch avoids false positives on brief AWA
|
|
62
|
+
oscillations.
|
|
63
|
+
- **Alarm silence during maneuvers** (Rev311 → Rev312 → Rev323) — the
|
|
64
|
+
`heading-deviation`, `cruise-drift` and `unable-to-steer` rules now
|
|
65
|
+
respect both pypilot's own `ap.tack.state != "none"` AND a visor-side
|
|
66
|
+
pseudo-mode flag posted to `POST /maneuver-state` when Aproado /
|
|
67
|
+
Empopado are running. Independent flag needed because pypilot does
|
|
68
|
+
not always update `ap.tack.state` when the sailor uses one of the
|
|
69
|
+
pseudo-modes.
|
|
70
|
+
- **Heading-deviation false positives in wind mode** (Rev323) —
|
|
71
|
+
threshold raised to 35° and sustain to 30 s when the pilot mode is
|
|
72
|
+
`wind` / `true wind`. In waves and gusts the AWA target legitimately
|
|
73
|
+
oscillates ±20-30° while the AP is still correcting; the 20°/15 s
|
|
74
|
+
default of compass mode was disarming the alarm several times per
|
|
75
|
+
hour on Tunatunes.
|
|
76
|
+
- **Tack countdown stability close-out** (Rev312) — if the tack overshoots
|
|
77
|
+
the plan but the boat is clearly settled (rate-of-turn < 3°/s for 2 s),
|
|
78
|
+
the overlay closes on its own instead of counting up to the 120 s
|
|
79
|
+
timeout.
|
|
80
|
+
|
|
81
|
+
### Changed
|
|
82
|
+
|
|
83
|
+
- **Alarms OFF by default** (Rev317) — a fresh install no longer arms
|
|
84
|
+
every rule; the sailor opts in via Setup → Alarms. Pre-Rev299 installs
|
|
85
|
+
keep legacy behaviour (undefined = all-on) so nothing changes silently
|
|
86
|
+
under an existing boat.
|
|
87
|
+
- **Terminology cleanup** (Rev321) — all references to third-party
|
|
88
|
+
autopilot brands / dashboards in code, comments, docs, UI hints and
|
|
89
|
+
package metadata have been rewritten as neutral descriptions of the
|
|
90
|
+
mechanism ("downstream Signal K clients", "wind-response damping
|
|
91
|
+
bands", "classical heel-over-speed² formula"). No behavioural change.
|
|
92
|
+
- **Tablet vertical crop hardening** (Rev314) — `100vh` → `100dvh` in
|
|
93
|
+
every fullscreen modal, `-webkit-overflow-scrolling: touch`, safe-area
|
|
94
|
+
padding. Fixes bottom-of-card clipping on Android tablets in portrait.
|
|
95
|
+
|
|
96
|
+
### Removed
|
|
97
|
+
|
|
98
|
+
- `docs/PROMPT_FOR_LLM_maneuver_catalog.md` — obsolete Rev209 audit
|
|
99
|
+
prompt, superseded by the current tack design.
|
|
100
|
+
|
|
101
|
+
## 2.9.0 — 2026-09-23 — Relicensed to AGPL-3.0-or-later
|
|
102
|
+
|
|
103
|
+
### License change (see NOTICE for details)
|
|
104
|
+
|
|
105
|
+
Starting with this release the plugin is distributed under the
|
|
106
|
+
**GNU Affero General Public License 3.0 or later** instead of Apache
|
|
107
|
+
2.0. The move is intended to keep downstream forks open under the
|
|
108
|
+
same license — including forks offered as a network service — while
|
|
109
|
+
still allowing personal and commercial USE without any fee, permission
|
|
110
|
+
or contract.
|
|
111
|
+
|
|
112
|
+
What this means in practice:
|
|
113
|
+
|
|
114
|
+
- **Personal or commercial use is unchanged.** A cruiser, charter
|
|
115
|
+
fleet, sailing school or workshop can install and use the plugin
|
|
116
|
+
without paying anything or asking anyone.
|
|
117
|
+
- **Fork for your own use or to contribute back — same as before.**
|
|
118
|
+
Anyone can clone the repo, modify the code, test it on their boat,
|
|
119
|
+
or open a pull request. The AGPL only kicks in the moment you
|
|
120
|
+
*distribute* your modified version (as a package or as a network
|
|
121
|
+
service).
|
|
122
|
+
- **Distributing a modified version obliges you to publish the source
|
|
123
|
+
code under AGPL-3.0-or-later too.** Closing a fork behind a
|
|
124
|
+
commercial product without releasing the source is no longer
|
|
125
|
+
permitted.
|
|
126
|
+
|
|
127
|
+
Previous releases (up to 2.8.0) remain available under the Apache 2.0
|
|
128
|
+
terms that were granted at the time — those rights are perpetual for
|
|
129
|
+
those specific versions.
|
|
130
|
+
|
|
131
|
+
### Also in this release
|
|
132
|
+
|
|
133
|
+
- Ship the `LICENSE` file that was declared in `package.json` but
|
|
134
|
+
missing from the tarball in all prior releases. The file now
|
|
135
|
+
carries the full AGPL-3.0 text (previously an implicit Apache-2.0
|
|
136
|
+
reference in `NOTICE`).
|
|
137
|
+
- `NOTICE` updated with licensing history + reaffirmation that
|
|
138
|
+
Panaaj's Apache-2.0 code fragment (autopilot-provider adapter)
|
|
139
|
+
is compatible with an AGPL-3.0 combined work.
|
|
140
|
+
|
|
3
141
|
## 2.8.0 — 2026-09-23 — Sea-trial critical fixes + intelligence layer
|
|
4
142
|
|
|
5
143
|
### Fixed (critical, from real sea trial)
|