Add radar scope, splash screen, Star Wars easter egg, and harden TUI
New features: - P1 green phosphor radar scope widget on Track screen with LUT-optimized rendering - Splash screen with pre-baked ANSI half-block art from 16colo.rs/Mistigris - Star Wars ASCII animation via telnet (ctrl+w) with IPv6 happy eyeballs and offline fallback - Dark Side / New Hope toast notifications on theme toggle - Kitty terminal detection with cat emoji on splash Robustness (from Apollo code review): - Circuit breaker in track loop after 10 consecutive errors - Input validation for frequency, symbol rate, step size across scan/spectrum/track - Consolidated sys.path manipulation into __init__.py - Radar scope pre-computes dist/angle LUT per pixel on resize Cleanup: - Removed unused imports across lband, monitor, scan, signal_gauge - Moved Pillow/textual-image to optional dev deps (splash uses pre-baked ANSI) - Added 41-test pytest suite covering telnet IAC parsing, radar geometry, splash assets
This commit is contained in:
parent
8da486719a
commit
6dcb6b693a
33 changed files with 2076 additions and 86 deletions
|
|
@ -109,15 +109,30 @@ class SpectrumScreen(Container):
|
|||
def _start_sweep(self) -> None:
|
||||
if self._sweeping:
|
||||
return
|
||||
self._sweeping = True
|
||||
|
||||
start = float(self.query_one("#spec-start", Input).value or "950")
|
||||
stop = float(self.query_one("#spec-stop", Input).value or "2150")
|
||||
step = float(self.query_one("#spec-step", Input).value or "5")
|
||||
dwell = int(self.query_one("#spec-dwell", Input).value or "10")
|
||||
lnb_lo = float(self.query_one("#spec-lnb", Input).value or "0")
|
||||
# Validate inputs
|
||||
try:
|
||||
start = float(self.query_one("#spec-start", Input).value or "950")
|
||||
stop = float(self.query_one("#spec-stop", Input).value or "2150")
|
||||
step = float(self.query_one("#spec-step", Input).value or "5")
|
||||
dwell = int(float(self.query_one("#spec-dwell", Input).value or "10"))
|
||||
lnb_lo = float(self.query_one("#spec-lnb", Input).value or "0")
|
||||
except ValueError:
|
||||
self._update_status("Invalid input — check numeric fields")
|
||||
return
|
||||
|
||||
if not (950 <= start <= 2150) or not (950 <= stop <= 2150):
|
||||
self._update_status("Frequency out of range (950–2150 MHz)")
|
||||
return
|
||||
if start >= stop:
|
||||
self._update_status("Start must be less than Stop")
|
||||
return
|
||||
if not (0.1 <= step <= 500):
|
||||
self._update_status("Step out of range (0.1–500 MHz)")
|
||||
return
|
||||
|
||||
continuous = self.query_one("#spec-continuous", Checkbox).value
|
||||
|
||||
self._sweeping = True
|
||||
self._sweep_worker = self._do_sweep(start, stop, step, dwell, lnb_lo, continuous)
|
||||
|
||||
def _stop_sweep(self) -> None:
|
||||
|
|
@ -140,7 +155,6 @@ class SpectrumScreen(Container):
|
|||
sweep_num = 0
|
||||
while self._sweeping:
|
||||
sweep_num += 1
|
||||
total_steps = max(1, int((stop - start) / step) + 1)
|
||||
step_count = [0]
|
||||
|
||||
def progress_cb(freq, step_num, total, result):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue