feat: replace terminal GUI with an interactive Tachikoma dashboard#108
feat: replace terminal GUI with an interactive Tachikoma dashboard#108zsoerenm wants to merge 8 commits into
Conversation
Rebuild the live terminal UI on Tachikoma.jl as a single-screen dashboard: CN0 bars and a direction-of-arrival sky plot on top, a Position/Velocity/Time block and an OpenStreetMap map below. - Keep the UnicodePlots visuals (barplot / polarplot) and paint them into Tachikoma panels via parse_ansi; Tachikoma provides the layout, panel frames, interactivity, footer and the map. - Sky plot now labels satellites with readable numeric PRNs coloured by constellation (dropping the old circled-number glyph markers). - PVT panel shows the core fix with a collapsible diagnostics section (GDOP / inter-system & inter-frequency biases / pseudorange-residual RMS), toggled with `d`. - Map rendered in the background via UnicodeMaps.jl with `+`/`-` zoom and `hjkl` pan, falling back to coordinates + a Google Maps link when offline or pre-fix. - Deps: add Tachikoma and UnicodeMaps (git via [sources]); drop Term and the now-unused REPL; keep UnicodePlots. Note: the (non-exported) `GNSSReceiver.gui` signature changed from `gui(channel, io=stdout; construct_gui_panels=...)` to `gui(channel; fps=12)`. The exported `gnss_receiver_gui` entry point is unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #108 +/- ##
==========================================
+ Coverage 89.26% 89.87% +0.61%
==========================================
Files 9 9
Lines 736 830 +94
==========================================
+ Hits 657 746 +89
- Misses 79 84 +5 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
…eout - Bump UnicodeMaps compat to "1" (UnicodeMaps is being registered at 1.0.0; the [sources] git entry stays until it lands in General). - Drop the `[`GUIData`](@ref)` cross-reference in the `gui` docstring — GUIData has no docstring target, which failed the Documenter build; refer to it as plain code (matching `get_gui_data_channel`). - Aqua: raise the persistent_tasks `tmax` to 60 s. No dependency actually spawns a persistent task (find_persistent_tasks_deps is empty) and the receiver only spawns tasks at runtime inside `gui`/`receive`; the heavier UI dependency graph just needs longer than the 10 s default to settle on slow (Windows) CI. - Add `update!` interaction tests (quit, diagnostics toggle, map zoom/pan/recenter). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Dependency status: UnicodeMaps has been bumped to Fixes pushed for the other failures: Documenter cross-ref, and Aqua |
Released AirspeedVelocity 0.6 only honours a package's [sources] deps for the
--path code path, not --url (which this workflow uses), so the benchmark fails
to resolve our unregistered UnicodeMaps [sources] dep ("has no known
versions"). Temporarily install benchpkg from the fork branch that fixes URL
[sources] resolution (MilesCranmer/AirspeedVelocity.jl#133); revert to the
registered 0.6 once that lands or once UnicodeMaps is in General.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The Benchmarks.yml workflow runs as pull_request_target, so GitHub reads it from the default branch, not the PR head — changing the install step in this PR has no effect on its own benchmark check. It is also unnecessary: once UnicodeMaps 1.0 is registered in General (~2 days), the default-branch workflow's stock `AirspeedVelocity@0.6` install resolves UnicodeMaps and the benchmark goes green with no workflow change. Reverting to avoid dead churn. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Correction on the benchmark: pointing this workflow at the AirspeedVelocity fork branch (previous commit) turned out to be inert here — The benchmark will resolve on its own once UnicodeMaps 1.0 registers in General (~2 days): the default-branch workflow's stock |
Remove the UnicodeMaps.jl dependency and the in-terminal OpenStreetMap map for now, so GNSSReceiver has no unregistered git dependency. The Location panel shows the fix coordinates and a ready-to-click Google Maps link instead; removes the map background task, map model state and map keybindings. The rendered map view returns as a stacked follow-up PR. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Benchmark Results (minimum time) — macos-14Reporting the minimum over all samples (robust to shared-runner contention), not the median. Ratio = a80d8b2… / 39e5c71…: >1 means the PR is faster. ✅ ≥ 5 % faster, Time benchmarks
Memory benchmarksRatio = a80d8b2… / 39e5c71… memory: >1 means the PR allocates less. ✅ ≥ 5 % less,
|
Benchmark Results (minimum time) — ubuntu-latestReporting the minimum over all samples (robust to shared-runner contention), not the median. Ratio = a80d8b2… / 39e5c71…: >1 means the PR is faster. ✅ ≥ 5 % faster, Time benchmarks
Memory benchmarksRatio = a80d8b2… / 39e5c71… memory: >1 means the PR allocates less. ✅ ≥ 5 % less,
|
Add a 'Watch it live in the terminal' section to the worked example that feeds the downloaded ION recording into GNSSReceiver.gui, and make the file-replay snippet in the GUI page correct for that recording (pvt_approximate_year) with a cross-link to the worked example. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- read_uint8_iq_file / read_files gain a `sample_rate` keyword: when set, the reader paces replay to real time by sleeping one chunk of signal time between chunks, so a recording feeds the dashboard at the speed it was recorded instead of racing past and closing instantly. - The GUI no longer quits when the data channel closes; it holds the last frame (header shows "stream ended (press q to quit)") until the user quits with q. - Docs: the worked-example and GUI-page replay snippets pass `sample_rate` so the live dashboard is actually watchable. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Show the diagnostics (DOP + biases + residual RMS) by default (press d to hide), and expand the DOP line to the full GDOP/PDOP/HDOP/VDOP/TDOP breakdown — restoring/extending what the old GUI showed. - Make the Google Maps link a real OSC 8 hyperlink (via the style's hyperlink field) so it is click-to-open in supporting terminals, using a full https URL. - Size the direction-of-arrival polarplot canvas 2:1 (columns:rows) with margin for the axis labels so it renders as a round circle instead of a clipped/ stretched one. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
What
Replaces the
Term/UnicodePlotsredraw-loop terminal GUI with an interactive Tachikoma.jl dashboard, showing what the current TUI already implements plus a map:barplot), RINEX-style labels, green/red by health.polarplotsky plot, now labelled with readable numeric PRNs coloured by constellation (dropping the old circled-number glyph markers), with a legend.d.+/-zoom andhjklpan. Falls back to coordinates + a Google Maps link when offline or before the first fix.Design: the existing UnicodePlots plots are kept and painted into Tachikoma panels via
parse_ansi; Tachikoma provides only the layout, panel frames, interactivity, footer and map. Inspired by (not copied from) the JuliaCon 2026 presentation.Keys
q/Ctrl-Cquit ·dtoggle diagnostics ·+/-zoom map ·hjklpan map ·0recenter.Dependencies
Tachikoma(registered) andUnicodeMaps(git dep via[sources], fromJuliaGNSS/UnicodeMaps.jl).Termand the now-unusedREPL. KeepUnicodePlots.The non-exported
GNSSReceiver.guisignature changed fromgui(channel, io=stdout; construct_gui_panels=...)togui(channel; fps=12). The exportedgnss_receiver_guientry point is unchanged. Committed asfeat:(notfeat!:) so it doesn't trigger a major release automatically — retag/adjust if you'd prefer a major bump.Testing
Pkg.test()passes (GUI tests 36/36; the rendering tests now draw one frame into an off-screen Tachikoma buffer and assert on the text).Follow-up
media/output.png/docs/src/assets/gui.pngstill show the old UI — regenerating needs a live/replay screenshot run.🤖 Generated with Claude Code