Rename radar_dashboard.py -> GUI_V65_Tk.py and add core feature parity with the v7 PyQt dashboard while keeping Tkinter as the framework: Replay mode: - _ReplayController with threading.Event-based play/pause/stop - Reuses v7.ReplayEngine and v7.SoftwareFPGA for all 3 input formats - Dual dispatch routes FPGA control opcodes to SoftwareFPGA during raw IQ replay; non-routable opcodes show user-visible status message - Seek slider with re-emit guard, speed combo, loop checkbox - close() properly releases engine file handles on stop/reload Demo mode: - DemoTarget kinematics scaled to physical range grid (~307m max) - DemoSimulator generates synthetic RadarFrames with Gaussian blobs - Targets table (ttk.Treeview) updates from demo target list Mode exclusion (bidirectional): - Connect stops active demo/replay before starting acquisition - Replay load stops previous controller and demo before loading - Demo start stops active replay; refuses if live-connected - --live/--replay/--demo in mutually exclusive CLI arg group Bug fixes: - seek() now increments past emitted frame to prevent re-emit on resume - Failed replay load nulls controller ref to prevent dangling state Tests: 17 new tests for DemoTarget, DemoSimulator, _ReplayController CI: all 4 jobs pass (167+21+25+29 = 242 tests)
4.6 KiB
Contributing to PLFM_RADAR (AERIS-10)
Thanks for your interest in the project! This guide covers the basics for getting a change reviewed and merged.
Getting started
- Fork the repository and create a topic branch from
develop. - Keep generated outputs (Vivado projects, bitstreams, build logs)
out of version control — the
.gitignorealready covers most of these.
Repository layout
| Path | Contents |
|---|---|
4_Schematics and Boards Layout/ |
KiCad schematics, Gerbers, BOM/CPL |
9_Firmware/9_2_FPGA/ |
Verilog RTL, constraints, testbenches, build scripts |
9_Firmware/9_2_FPGA/formal/ |
SymbiYosys formal-verification wrappers |
9_Firmware/9_2_FPGA/scripts/ |
Vivado TCL build & debug scripts |
9_Firmware/9_3_GUI/ |
Python radar dashboard (Tkinter + matplotlib) |
docs/ |
GitHub Pages documentation site |
Before submitting a pull request
- Python — verify syntax:
python3 -m py_compile <file> - Verilog — if you have Vivado, run the relevant
build*.tcl; if not, note which scripts your change affects - Whitespace —
git diff --checkshould be clean - Keep PRs focused: one logical change per PR is easier to review
- Run the regression tests (see below)
Running regression tests
After any change, run the relevant test suites to verify nothing is broken. All commands assume you are at the repository root.
Prerequisites
| Tool | Used by | Install |
|---|---|---|
Icarus Verilog (iverilog) |
FPGA regression | brew install icarus-verilog / apt install iverilog |
| Python 3.8+ | GUI tests, co-sim | Usually pre-installed |
| GNU Make | MCU tests | Usually pre-installed |
SymbiYosys (sby) |
Formal verification | Optional — see SymbiYosys docs |
FPGA regression (RTL lint + unit/integration/signal-processing tests)
cd 9_Firmware/9_2_FPGA
bash run_regression.sh
This runs four phases:
| Phase | What it checks |
|---|---|
| 0 — Lint | iverilog -Wall on all production RTL + static regex checks |
| 1 — Changed Modules | Unit tests for individual blocks (CIC, Doppler, CFAR, etc.) |
| 2 — Integration | DDC chain, receiver golden-compare, system-top, end-to-end |
| 3 — Signal Processing | FFT engine, NCO, FIR, matched filter chain |
| 4 — Infrastructure | CDC modules, edge detector, USB interface, range-bin decimator, mode controller |
All tests must pass (exit code 0). Advisory lint warnings (e.g., case without default) are non-blocking.
MCU unit tests
cd 9_Firmware/9_1_Microcontroller/tests
make clean && make all
Runs 20 C-based unit tests covering safety, bug-fix, and gap-3 tests. Every test binary must exit 0.
GUI / dashboard tests
cd 9_Firmware/9_3_GUI
python3 -m pytest test_GUI_V65_Tk.py -v
# or without pytest:
python3 -m unittest test_GUI_V65_Tk -v
57+ protocol and rendering tests. The test_record_and_stop test
requires h5py and will be skipped if it is not installed.
Co-simulation (Python vs RTL golden comparison)
Run from the co-sim directory after a successful FPGA regression (the regression generates the RTL CSV outputs that the co-sim scripts compare against):
cd 9_Firmware/9_2_FPGA/tb/cosim
# Validate all .mem files (twiddles, chirp ROMs, addressing)
python3 validate_mem_files.py
# DDC chain: RTL vs Python model (5 scenarios)
python3 compare.py dc
python3 compare.py single_target
python3 compare.py multi_target
python3 compare.py noise_only
python3 compare.py sine_1mhz
# Doppler processor: RTL vs golden reference
python3 compare_doppler.py stationary
# Matched filter: RTL vs Python model (4 scenarios)
python3 compare_mf.py all
Each script prints PASS/FAIL per scenario and exits non-zero on failure.
Formal verification (optional)
Requires SymbiYosys (sby), Yosys, and a solver (z3 or boolector):
cd 9_Firmware/9_2_FPGA/formal
sby -f fv_doppler_processor.sby
sby -f fv_radar_mode_controller.sby
Quick checklist
Before pushing, confirm:
bash run_regression.sh— all phases passmake all(MCU tests) — 20/20 passpython3 -m unittest test_GUI_V65_Tk -v— all passpython3 validate_mem_files.py— all checks passpython3 compare.py dc && python3 compare_doppler.py stationary && python3 compare_mf.py allgit diff --check— no whitespace issues
Areas where help is especially welcome
See the list in README.md.
Questions?
Open a GitHub issue — that way the discussion is visible to everyone.