021(gui): per-signal satellite palettes — realistic ICD IDs + GLONASS FDMA picker #36
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/021-gui-satellite-palettes"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Implements backlog step 021 per the user-approved design (per-signal grids; GLONASS slot+k view with by-channel mode; no preset dropdowns). Work order archived to
docs/done/021-gui-satellite-palettes.md.What it adds
Per-signal satellite palettes. Every signal row in Signal selection gains a
▾toggle opening an accordion grid of real ICD satellite IDs — GPSPRN1–32, GalileoE01–E36, BeiDouC1–C63, GLONASSR1–R24(8-column checkboxes; one grid open at a time keeps the window compact; BeiDou's 63 IDs fit 8 rows). The text entry stays as the advanced field (ranges,R2:-4overrides) and remains the single source of truth: grid edits write compact spec strings through the existing trace, and external changes (typed specs, scenario load) re-sync the open grid.GLONASS FDMA picker (the interesting part):
R2 (k-4),R10 (k0),R22 (k+4)— grouped by orbital plane (1–8 / 9–16 / 17–24); antipodal pairs (i, i+4) share a channel.k-7 (1598.062 MHz) -> R1style with the band carrier fromglonass_carrier_hzand the lowest slot viaglonass_channel_to_slot; ICD test channels (-6, -5) excluded; checking a channel selects its slot with the nominal k implied.slot:chan(2:-9,10) so editing never silently re-assigns a channel.All logic is registry-driven (no duplicated literal tables): new headless-safe helpers in
controllers.py—satellite_palette,glonass_channel_to_slot,glonass_channel_palette,glonass_one_per_channel,spec_string_for_satellites.Tests
tests/test_gui_palettes.py(headless): exact ICD ID sets per system; GLONASS nominal-k labels + plane grouping (antipodal pairing verified within planes); channel→slot mapping incl. test-channel → None; spec round-trips throughparse_sat_specfor all systems; non-nominal2:-9preservation; one-per-channel rule (incl. explicit-channel override); grid selections ≡ typed specs.tests/test_gui_app.py(gui-marked, run in CI with display): accordion behavior, grid↔model sync both ways, GLONASS slot/by-channel/one-per-channel flows, scenario-load re-sync.ruffclean;pytest: 209 passed, 8 skipped (gui-marked skip headless; run in CI with a display).Docs
README GUI sentence extended;
docs/backlog/000-overview.md021 row added (done on merge).Implements docs/done/021-gui-satellite-palettes.md (user-approved design: per-signal grids, GLONASS slot+k view with by-channel mode, no presets). - each signal row gains a "▾ satellites" toggle opening an accordion satellite palette (8-column checkbox grid, real ICD IDs: PRN1-32, E01-E36, C1-C63, R1-R24); one grid open at a time keeps the window compact; the text entry stays as the advanced field and single source of truth (grid writes go through the existing spec-var trace) - grid <-> model sync: populate from selections on open; re-sync on external changes (typed specs, scenario load); selecting a satellite auto-checks its signal - GLONASS slot view: labels carry the registry nominal channel ("R2 (k-4)"), planes grouped, All/None/One-per-channel helpers (antipodal pairs share a channel -> keep the lowest slot per channel); by-channel (k) view: nominal channels k=-7..+6 minus ICD test channels, labeled with band carrier (glonass_carrier_hz) + lowest slot (glonass_channel_to_slot) - non-nominal channels survive grid edits: rebuilt specs emit slot:chan (e.g. "2:-9,10") via spec_string_for_satellites - controllers helpers (registry-driven, headless-safe): satellite_palette, glonass_channel_to_slot, glonass_channel_palette, glonass_one_per_channel, spec_string_for_satellites Tests: tests/test_gui_palettes.py (headless: exact ICD ID sets, nominal k/plane annotations, channel->slot mapping incl. test-channel exclusion, spec round trips with non-nominal preservation, one-per-channel rule, grid selections == typed specs) + gui-marked accordion/GLONASS-flow tests in tests/test_gui_app.py. ruff clean; pytest 209 passed, 8 skipped (gui tests skip headless).