'use client' import { useState, useEffect } from 'react' import { SerialPortInfo } from '@/lib/serial-utils' interface DeviceConnectionProps { onConnectionChange: (connected: boolean) => void onDataReceived: (data: any) => void } export default function DeviceConnection({ onConnectionChange, onDataReceived }: DeviceConnectionProps) { const [availablePorts, setAvailablePorts] = useState([]) const [selectedPort, setSelectedPort] = useState('') const [isConnected, setIsConnected] = useState(false) const [isConnecting, setIsConnecting] = useState(false) const [error, setError] = useState(null) // Load available serial ports useEffect(() => { loadPorts() }, []) // Poll for data when connected useEffect(() => { if (!isConnected) return const pollInterval = setInterval(async () => { try { const response = await fetch('/api/uwb/data') if (response.ok) { const data = await response.json() if (data.rangeData || data.deviceData?.length > 0) { onDataReceived(data) } } } catch (error) { console.error('Data polling error:', error) } }, 1000) // Poll every second return () => clearInterval(pollInterval) }, [isConnected, onDataReceived]) const loadPorts = async () => { try { const response = await fetch('/api/serial/ports') if (response.ok) { const data = await response.json() setAvailablePorts(data.esp32Ports || []) // Auto-select first ESP32 port if available if (data.esp32Ports?.length > 0 && !selectedPort) { setSelectedPort(data.esp32Ports[0].path) } } } catch (error) { console.error('Failed to load ports:', error) setError('Failed to load available ports') } } const connect = async () => { if (!selectedPort) return setIsConnecting(true) setError(null) try { const response = await fetch('/api/serial/connect', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ port: selectedPort, baudRate: 115200 }) }) if (response.ok) { setIsConnected(true) onConnectionChange(true) // Send initial test command await sendCommand('AT?') } else { const errorData = await response.json() setError(errorData.message || 'Connection failed') } } catch (error) { setError(`Connection error: ${error}`) } finally { setIsConnecting(false) } } const disconnect = async () => { try { await fetch('/api/serial/connect', { method: 'DELETE' }) setIsConnected(false) onConnectionChange(false) } catch (error) { console.error('Disconnect error:', error) } } const sendCommand = async (command: string) => { try { await fetch('/api/uwb/data', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ command }) }) } catch (error) { console.error('Command send error:', error) } } return (

Device Connection

{error && (
{error}
)}
{!isConnected ? ( ) : ( )}
{isConnected ? 'Connected' : 'Disconnected'}
{availablePorts.length === 0 && (

No ESP32 devices detected. Make sure your device is connected and drivers are installed.

)}
) }