params.yaml:device.tx/rx.sample_ratewas 4 Msps, which is below the Nyquist requirement for a 7 MHz DVB-T2 channel (minimum ~7.7 Msps). Corrected to 8 Msps with an explanatory comment.run_tx.sh/run_rx.sh: Scripts calledgnuradio-companiondirectly, making them completely broken in headless/SSH/Docker environments. Rewrote to usegrcc(the GNU Radio command-line compiler) to compile and run the flowgraph as a Python script. Falls back to GRC only if a display is available.encode_h264_ts.sh: No check forffmpegbinary, no check that the input file exists. Both now produce clear error messages and exit 1.inject_metrics_block.py: Block could be inserted twice silently. Now detects an existing block and exits with a clear error.patch_grc_from_params.py: Used bareopen()withoutwith; exited with code 1 (error) when no changes were needed, breaking CI pipelines that called it on already-patched files. Both fixed. Exit 2 now signals "no changes needed".plot_metrics.py: HTML file handle was never closed (nowithstatement). Fixed using awith open(...)block.grc/blocks/mer_evm_logger.py:os.makedirs(os.path.dirname(csv_path))raisedFileNotFoundErrorwhencsv_pathhad no directory component (e.g."metrics.csv"), becauseos.path.dirname("")returns"". Fixed by usingos.path.abspath()beforedirname.
scripts/check_deps.sh: Colour-coded dependency checker. Verifies GNU Radio, gr-dvbt2, gr-dvbs2rx (optional), SoapySDR, libiio, ffmpeg, grcc, and all Python packages. Distinguishes required failures from optional warnings. Run viabash scripts/check_deps.shormake check-deps.scripts/validate_params.py: Validatesparams.yamlagainst DVB-T2 spec constraints: channel bandwidth, FFT size, guard interval, pilot pattern, constellation/code-rate combinations, sample rate vs Nyquist, gain ranges, and UDP port ranges.--strictflag treats warnings as errors. Integrated into CI.scripts/link_budget.py: DVB-T2 link budget calculator for 70 cm amateur radio. Computes FSPL, EIRP, received signal level, noise floor, C/N, and link margin against tabulated QEF thresholds (ETSI EN 302 755). Supports all standard DVB-T2 constellations and code rates. Run viamake budget DIST=5.scripts/status_monitor.py: Live terminal MER/EVM dashboard using Rich. Reads the metrics CSV and displays a continuously refreshing table with colour-coded MER/EVM values, alarm indicators, and rolling statistics.pip install richrequired. Run viamake status.--metricsflag forrun_tx.sh: launches the metrics-enabled flowgraph variant (tx_dvbt2_445_5MHz_with_metrics.grc) directly.--grblocksflag forrun_rx.sh: launches thegr-dvbs2rxall-blocks RX variant (rx_dvbt2_grblocks_445_5MHz.grc).--test-cardmode forencode_h264_ts.sh: streams a 60-second synthetic SMPTE test card — no video file required.--paramsflag onrun_tx.shandrun_rx.sh: specify an alternateparams.yamlpath.--watchmode forplot_metrics.py: continuously regenerates the HTML report as the CSV grows during a live TX session.--dry-runand--verboseflags forpatch_grc_from_params.py.--per-pidand--jsonflags forts_cc_monitor.py: per-PID CC breakdown and machine-readable JSON output for scripting.256QAMsupport inmer_evm_logger.py.alarmcolumn in metrics CSV:OK,MER_LOW, orEVM_HIGH, with configurable thresholds via block constructor args.- Alarm event table in the HTML metrics report.
make helptarget listing all available make targets with descriptions.make status,make budget,make cleantargets.tests/: Pytest-compatible unit tests forvalidate_params.py,link_budget.py, andts_cc_monitor.py.- CI: Added Python syntax check,
pyflakeslint,validate_params.py, and unit test jobs to.github/workflows/ci.yml.
Dockerfile: Converted to a multi-stage build (builder + lean runtime). Fixed package namelibvolk2-dev→libvolk-dev(renamed in Ubuntu 22.04+). Addedffmpegand Python data packages to the runtime image. Runs as a non-root user (hamradio, UID 1000). Runsvalidate_params.pyon image build.Makefile: Expanded from 2 targets to a full developer workflow withlint,test,validate,check-deps,tx,rx,tx-metrics,rx-grblocks,encode-test,report,watch-metrics,status,budget,pack, andclean.grc/blocks/mer_evm_logger.py: Added thread lock around CSV writes. Minimum window size enforced to 256 samples. Improved docstrings.docs/ARCHITECTURE.md: Added ASCII signal-chain diagram, headless execution notes, and metrics pipeline diagram.docs/METRICS.md: Documented alarm thresholds, CSV format, and all report generation options.params.yaml: Added inline comments explaining each parameter and its valid range.
- Initial DVB-T2 TX/RX chain on 445.5 MHz / 7 MHz channel
- GNU Radio 3.10 + gr-dvbt2 + LimeSDR/PlutoSDR (Soapy/IIO)
- MER/EVM logger EPY block (QPSK/16QAM/64QAM)
patch_grc_from_params.py,inject_metrics_block.py,plot_metrics.pyts_cc_monitor.py,encode_h264_ts.sh- Docker, devcontainer, GitHub Actions CI