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 ─────────────────────────────────────────────────────────