Last Updated: 2026-02-09
- P1-1 Fixed backend
/calculate-linkcrash -- removed duplicatereq.rx_heightpositional argument inserver.py:68-78that causedTypeErroron every call. Hata, Bullington, and FSPL models via the backend now work. - P1-2 Wired
groundType,climate, andcalculateSensitivitytoCoverageClickHandlervia therfContextprop inMapContainer.jsx. User's ground type and climate zone selections now flow to initial RF coverage calculations. - P1-3 Added
epsilon,sigma, andclimateto the RF coverage recalculation path (MapContainer.jsxrecalcTimestamp effect). The "Update Calculation" button now respects environment settings. - P1-4 Fixed RF observer drag handler to include
txLoss(cable loss),epsilon,sigma,climate, and usenodeConfigs.B.antennaGaininstead of hardcoded2.15for rxGain.
- P2-1 Unified sensitivity calculation -- created canonical
calculateLoRaSensitivity(sf, bw)inrfMath.jsusing SX1262 per-SF lookup table. BothcalculateLinkBudgetandRFContext.calculateSensitivitynow delegate to this single function. Eliminated the 1.5 dB discrepancy between link analysis and coverage tools. - P2-2 Updated LoRa sensitivity to SX1262 datasheet values. Per-SF lookup table at 125kHz: SF7=-124, SF8=-127, SF9=-130, SF10=-133, SF11=-135.5, SF12=-137 dBm. Replaces the old
-123 + 2.5*stepapproximation. - P2-3 Harmonized FSPL constant to
32.45acrossrfMath.jsandrf_physics.py, matching ITU-R P.525-4 (exact speed of light) and the C++ ITM vendor code. - P2-4 Batch processing now uses per-node A/B configs (antenna height, gain, device loss) instead of GLOBAL proxy values. Fade margin is now included in batch link budgets. Bullington diffraction is applied for terrain-aware path loss instead of pure FSPL.
- P5-1 True LOS Viewshed: Implemented Fresnel zone analysis and LOS checks in backend
optimize_location. - P5-3 Adaptive Grid & Heatmap: Replaced fixed grid with dynamic density scan and added Heatmap visualization overlay in
OptimizationLayer. - P5-7 Export Capabilities: Added CSV and KML export for optimized site candidates via
/export-resultsendpoint.
Move Okumura-Hata and explicit FSPL calculations to JavaScript so model switching works without the Python backend. The Bullington diffraction model is already in rfMath.js. Adding Hata eliminates the backend dependency for non-ITM models.
Files: src/utils/rfMath.js, src/components/Map/LinkLayer.jsx
Currently the RF coverage tool is hardwired to WASM ITM. Add a model dispatch in useRFCoverageTool.js that supports FSPL-only or Hata for faster coverage maps when full ITM precision isn't needed. ITM remains the default.
Files: src/hooks/useRFCoverageTool.js, src/components/Map/Controls/CoverageClickHandler.jsx
Batch mesh reports currently use FSPL + Bullington (frontend-only). Integrate the WASM ITM path (same as link analysis) for full terrain-aware batch reports. Requires fetching elevation profiles for each node pair.
Files: src/components/Map/BatchProcessing.jsx, src/hooks/useWasmITM.js
Allow CSV import to include optional per-node columns: antenna height, device type, antenna type. Currently all batch nodes use the global A/B config. Per-node overrides would enable realistic multi-device mesh planning.
Files: src/components/Map/BatchProcessing.jsx
itmlogic is listed in requirements.txt but never imported. Implement as a true Python ITM fallback for server-side batch processing and environments where WASM isn't available. Enables Celery workers to run ITM asynchronously.
Files: rf-engine/rf_physics.py, rf-engine/tasks/
Current Hata model covers 150-1500 MHz. The COST 231 extension covers 1500-2000 MHz for future higher-frequency deployments (e.g., 2.4 GHz ISM). Straightforward formula addition.
Files: rf-engine/rf_physics.py, src/utils/rfMath.js (if client-side Hata is added in P3-1)
Current clutter model applies a uniform height everywhere. Integrating land cover data (NLCD for US, Corine for EU) would enable per-pixel clutter classification: forest canopy height, urban building density, open field. This would significantly improve coverage accuracy in mixed environments.
Dependencies: Land cover tile server, clutter height lookup table
All models currently assume omnidirectional antennas. The Yagi preset has 11 dBi gain but no directional pattern. Adding azimuth/elevation radiation patterns would enable:
- Directional link predictions
- Coverage maps with beam patterns
- Tilt optimization for hilltop sites
Data needed: Antenna pattern files (CSV or NEC2 format)
Current tools analyze point-to-point links only. A mesh planner would:
- Calculate end-to-end connectivity through relay chains
- Identify single points of failure
- Suggest optimal relay placement
- Estimate end-to-end latency and throughput
Could build on the batch processing infrastructure with graph analysis (Dijkstra/Floyd-Warshall for optimal paths).
The ITM supports time/location/situation variability percentages (currently fixed at 50/50/50). Exposing these as user controls would enable:
- Worst-case planning (90/90/90 for reliability)
- Best-case estimation (10/10/10 for maximum range)
- Statistical coverage contours showing probability of reception
- Viewshed Shadow Regression: Purple shadows are not rendering correctly in
WasmViewshedLayer. Fixed in v1.14.2 via explicit shader state management.
Status: ✅ Implemented in Phase 5.
Problem: Limited to 10m/30m NED/SRTM. Solution: Support LiDAR DSM (1-2m) and local tile stitching. Impact: Urban canyon accuracy and precise vegetation blocking.
Status: ✅ Implemented in Phase 5. Features: Radial Scan, Density-based Grid, Heatmap Overlay.
Problem: Simple peak-minus-mean misses ridgelines. Solution: Multi-scale prominence (1km, 5km rings) + Isolation metric.
Status: ✅ Implemented in v1.14.0/1.14.3. Features: Multi-Site Analysis now computes unique coverage per site and marginal gain contribution.
Problem: Single score hides trade-offs. Solution: Compute and visualize the Pareto frontier for multi-objective optimization (Elevation vs Coverage vs Access).
Features: Multi-Site Analysis now computes unique coverage per site and marginal gain contribution.
Problem: Single score hides trade-offs. Solution: Compute and visualize the Pareto frontier for multi-objective optimization (Elevation vs Coverage vs Access).
Status: ✅ Implemented in Phase 5 (CSV/KML).
Problem: Multi-Site analysis shows a merged composite, making it hard to distinguish which node covers which area. Solution: Refactor backend to return individual coverage masks or labeled bitmasks. Render individual node boundaries (dashed lines) or distinct color layers in the frontend to visualize exact per-node coverage.