Release v26.6.74: coverage freeze fix + launcher/audio fixes#64
Merged
Conversation
The camera-panel buttons (mode/heading cycle, zoom, tilt) were bound on `click`, which the NativeWebView launcher (touch) doesn't fire reliably — so tapping the heading-mode button did nothing on the launcher build while it worked in a browser. Bind them on `pointerdown` instead (the same event the rest of the touch UI uses); the campad container already stops propagation so this doesn't pan the map. Fixes #56. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…her-tap Fix heading/camera mode button not responding on launcher (#56)
The audio-unlock nudge played every cached alert element to prime it for autoplay, pausing each in an async .then(). Because the pause lands a beat after play() starts, the first pointer/key event emitted a brief burst of all alerts — most audibly the Hyd up/down 3-pt-hitch sounds. Prime the elements MUTED instead (muted playback still satisfies the autoplay policy), then restore. Real plays clone the element so they're unaffected. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…-burst Fix alert-sound burst on first UI click after startup
The test opened a read handle (FileShare.Read) on OldProfile.json and, while that handle was still open inside the using block, called WriteAllText on the same path -- which deterministically failed with 'process cannot access the file'. Read the file fully into a string and close the handle before writing the stripped-down profile back. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The virtual steer and machine modules bound their listen sockets to IPAddress.Any (0.0.0.0), which makes Windows Defender Firewall prompt for network access on every test run. All virtual-module traffic is 127.0.0.1, so bind the listeners to IPAddress.Loopback instead -- loopback traffic bypasses the firewall entirely, no per-machine allow rule needed. The send-only GPS receiver is left as an unbound UdpClient: outbound UDP does not trigger the prompt, and eager binding would race the machine module for an ephemeral port in VirtualModuleHub. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Fix Windows-only test failures: profile file-lock and firewall-prompting sockets
The web UI froze for ~1s and jumped the tractor forward whenever the coverage grid changed, worsening with field size. Root causes + fixes, all in the coverage streaming path: - Full-coverage snapshot walked the ENTIRE field bounding box at 0.1m (O(field area), ~130ms on a 40ha field even with 0.63ha painted) on the 10Hz broadcast loop, stalling pose/tick frames. Now enumerates only painted display cells via GetPaintedDisplayCells (O(worked area), ~9ms) and builds off the broadcast loop so pose never stalls. - Client drained a full snapshot in one render frame (unbounded per-cell drawRect). Now time-sliced (COV_DRAIN_BUDGET/frame). - Bounds expansion re-sent the entire accumulated coverage. The added ground is empty, so the host now announces the new grid (reset=false) and the client re-anchors its existing coverage into the larger grid (exact integer-offset pixel copy) — zero rescan, zero resend. A new CoverageInit `reset` flag distinguishes grow (re-anchor) from new field / reload / cell-size change (tear down + rebuild). - The first no-boundary expansion crosses the 0.1->0.2m resolution band (rebuild path). GetPaintedDisplayCells read the display buffer lock-free and could catch it cleared-but-not-yet-resampled, yielding an empty snapshot that permanently dropped pre-expansion coverage. Now materialized under _coverageLock (alpha folded in) for a consistent read. - Pre-existing edge-ribbon bug surfaced by the no-boundary test path: the auto-init SetFieldBounds->ClearEdges wiped an active section's ribbon while it stayed on, so StartMapping never re-opened it and the crisp worked-area perimeter silently never rendered. AccumulateEdge now re-opens a ribbon on a miss (self-heals). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…freeze Fix periodic coverage-map freeze on large fields (#34)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Promotes develop → main for release. Bumps 26.6.69 → 26.6.74.
What's included (4 merged PRs since main)
Load_OlderProfileWithoutNewFields, and virtual test UDP modules bound to loopback to avoid a Windows firewall prompt. Test-only; product server binding unchanged.pointerdownfor the NativeWebView launcher.Testing
After merge, cut the release:
git tag v26.6.74 && git push origin v26.6.74.🤖 Generated with Claude Code