(data)
| 3489 | _wifiHm._rafPending = true; |
| 3490 | requestAnimationFrame(() => { _wifiHm._rafPending = false; wifiHeatmapRender(); }); |
| 3491 | } |
| 3492 | |
| 3493 | function _wifiHmDesignClick(x, y) { |
| 3494 | const st = document.getElementById('wifi-hm-design-status'); |
| 3495 | if (_wifiHm.tool === 'ap') { |
| 3496 | // The floor is a square of floorM × floorM metres (matches the rulers). |
| 3497 | const m = _wifiHmFloorM(); |
| 3498 | _wifiHm.predictAps.push({ x, y, tx_dbm: 20, freq: 5200, ple: 3.0, width_m: m, height_m: m }); |
| 3499 | _wifiHmPersistAp(); |
| 3500 | const n = _wifiHm.predictAps.length; |
| 3501 | if (st) st.textContent = `${n} node${n > 1 ? 's' : ''} placed — click to add more, or tick “Predict coverage”.`; |
| 3502 | wifiHeatmapRender(); |
no test coverage detected