@@ -643,29 +662,49 @@
drawSatelliteVisualization();
- // Подключение микрофона для визуализации (опционально) — УДАЛЕНО
- // Теперь используем RMS от satellite вместо локального микрофона
-
- // WebSocket подключение
- function connectWebSocket() {
- const hostInput = prompt("Введите адрес LVA WebSocket (по умолчанию ws://192.168.200.111:8675):", "ws://192.168.200.111:8675");
- if(!hostInput) return;
- if(ws && ws.readyState === WebSocket.OPEN) ws.close();
- ws = new WebSocket(hostInput);
+ // WebSocket подключение/отключение
+ function toggleConnection() {
+ const wsUrl = document.getElementById('wsUrlInput').value.trim();
+
+ if(!wsUrl) {
+ addEventToLog('❌ Введите WebSocket URL');
+ return;
+ }
+
+ // Если уже подключены — отключаемся
+ if(ws && ws.readyState === WebSocket.OPEN) {
+ ws.close();
+ return;
+ }
+
+ // Подключаемся
+ if(ws && ws.readyState === WebSocket.CONNECTING) {
+ ws.close();
+ return;
+ }
+
+ ws = new WebSocket(wsUrl);
+
ws.onopen = () => {
isConnected = true;
+ updateConnectButton();
statusLed.classList.add('connected');
statusLabel.innerText = 'connected';
- addEventToLog(`✅ Соединение установлено с ${hostInput}`);
+ addEventToLog(`✅ Соединение установлено с ${wsUrl}`);
stateText.innerText = 'ONLINE';
orb.style.animation = 'pulse-glow 0.8s';
setTimeout(()=> orb.style.animation='',700);
- // initMicVisualizer() — удалено, используем satellite RMS
};
+
ws.onmessage = handleIncomingMessage;
- ws.onerror = (err) => { addEventToLog(`⚠️ WebSocket ошибка`); };
+
+ ws.onerror = (err) => {
+ addEventToLog(`⚠️ WebSocket ошибка`);
+ };
+
ws.onclose = () => {
isConnected = false;
+ updateConnectButton();
statusLed.classList.remove('connected');
statusLabel.innerText = 'disconnected';
addEventToLog(`🔌 Отключено`);
@@ -673,9 +712,45 @@
document.body.classList.remove('listening-active');
};
}
+
+ // Обновление кнопки подключения
+ function updateConnectButton() {
+ const btn = document.getElementById('connectBtn');
+ const btnCard = document.getElementById('connectBtnCard');
+
+ if(ws && ws.readyState === WebSocket.OPEN) {
+ if(btn) { btn.innerHTML = '🔌 DISCONNECT'; btn.classList.add('danger-btn'); }
+ if(btnCard) { btnCard.innerHTML = '🔌 DISCONNECT'; btnCard.classList.add('danger-btn'); }
+ } else {
+ if(btn) { btn.innerHTML = '⟳ CONNECT'; btn.classList.remove('danger-btn'); }
+ if(btnCard) { btnCard.innerHTML = '⟳ CONNECT'; btnCard.classList.remove('danger-btn'); }
+ }
+ }
- // Кнопки управления
- document.getElementById('connectBtn').addEventListener('click', connectWebSocket);
+ // Кнопки подключения
+ document.getElementById('connectBtn').addEventListener('click', toggleConnection);
+ document.getElementById('connectBtnCard').addEventListener('click', toggleConnection);
+
+ // Auto-connect при загрузке
+ window.addEventListener('load', () => {
+ addEventToLog('🤖 Wyoming Droid Assistant • готов к подключению');
+
+ // Инициализация RMS элементов после загрузки DOM
+ const rmsFillEl = document.getElementById('rmsFill');
+ const rmsValueEl = document.getElementById('rmsValue');
+ if (rmsFillEl && rmsValueEl) {
+ console.log('RMS meter initialized');
+ }
+
+ // Auto-connect если включена опция
+ const autoConnect = document.getElementById('autoConnect');
+ if(autoConnect && autoConnect.checked) {
+ setTimeout(() => {
+ addEventToLog('📡 Auto-connect...');
+ toggleConnection();
+ }, 500);
+ }
+ });
// Volume control
document.getElementById('startListeningBtn').addEventListener('click', () => sendCommand('set_volume', { level: 1.0 }));