diff --git a/static/js/modes/meshcore.js b/static/js/modes/meshcore.js index e966d6a..769978d 100644 --- a/static/js/modes/meshcore.js +++ b/static/js/modes/meshcore.js @@ -57,7 +57,7 @@ const MeshCore = (function () { _connected = state === 'connected'; if (connectBtn) connectBtn.disabled = state === 'connecting' || _connected; - if (disconnectBtn) disconnectBtn.disabled = !_connected; + if (disconnectBtn) disconnectBtn.disabled = state !== 'connecting' && !_connected; if (_connected && !_eventSource) _startSSE(); if (!_connected && _eventSource) { _eventSource.close(); _eventSource = null; } @@ -133,19 +133,33 @@ const MeshCore = (function () { } async function scanBle() { + const btn = document.querySelector('[onclick="MeshCore.scanBle()"]'); + const sel = document.getElementById('meshcoreBleSelect'); + if (btn) { btn.textContent = 'Scanning…'; btn.disabled = true; } + if (sel) sel.innerHTML = ''; try { const r = await fetch('/meshcore/ble/scan'); const d = await r.json(); - const sel = document.getElementById('meshcoreBleSelect'); if (!sel) return; - sel.innerHTML = ''; - (d.devices || []).forEach(dev => { + const devices = d.devices || []; + if (!devices.length) { + sel.innerHTML = ''; + return; + } + sel.innerHTML = ''; + devices.forEach(dev => { const o = document.createElement('option'); o.value = dev.address; - o.textContent = `${dev.name || 'Unknown'} (${dev.address}) RSSI ${dev.rssi}`; + o.textContent = `${dev.name || 'Unknown'} (${dev.address})${dev.rssi ? ' · ' + dev.rssi + ' dBm' : ''}`; sel.appendChild(o); }); - } catch (e) { console.error('BLE scan failed:', e); } + if (devices.length === 1) sel.value = devices[0].address; + } catch (e) { + if (sel) sel.innerHTML = ''; + console.error('BLE scan failed:', e); + } finally { + if (btn) { btn.textContent = 'Scan'; btn.disabled = false; } + } } // ── SSE Stream ─────────────────────────────────────────────────────────