diff --git a/mock-uav-server/server.js b/mock-uav-server/server.js index ce874db..e320bd7 100644 --- a/mock-uav-server/server.js +++ b/mock-uav-server/server.js @@ -120,6 +120,16 @@ wss.on("connection", (ws) => { message: `aim vertical=${msg.vertical} horizontal=${msg.horizontal}`, severity: "normal", }); + return; + } + + if (msg.type === "led") { + sendJson(ws, { + type: "log", + message: `LED ${msg.state ? "on" : "off"}`, + severity: "normal", + }); + return; } }); }); diff --git a/src/App.jsx b/src/App.jsx index dbe2359..fb3725a 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -8,15 +8,16 @@ import { } from './components/ui/card' import { TableBody, TableCell, TableHead, TableHeader, TableRow } from './components/ui/table.jsx'; import { ScrollArea } from './components/ui/scroll-area'; -import { Input } from './components/ui/input'; import { Button } from './components/ui/button'; import Sliders from './Sliders.jsx'; import { Tabs, TabsList, TabsTrigger } from './components/ui/tabs.jsx'; import Canvas from './components/Canvas.jsx'; +import { Spinner } from './components/ui/spinner.jsx'; import { AddTargetDialog } from './components/Dialog.jsx'; import { saveTarget } from './targets.js'; import { DistanceTable } from './components/DistancesTable.jsx'; import TargetViewer from './components/TargetViewer.jsx'; +import { Navbar } from './components/Navbar.jsx'; function App() { const [uavStatus, setUavStatus] = useState({ @@ -29,8 +30,36 @@ function App() { const [logs, setLogs] = useState([]); const wsConnRef = useRef(new UAVConnection()); const [isConnected, setIsConnected] = useState(false); - wsConnRef.current.onWSOpen = () => { + const [autoReconnect, setAutoReconnect] = useState(false); + const [ledOn, setLedOn] = useState(false); + const autoReconnectRef = useRef(false); + const lastUrlRef = useRef(null); + const manualDisconnectRef = useRef(false); + + const handleConnect = (url) => { + lastUrlRef.current = url; + manualDisconnectRef.current = false; + wsConnRef.current.connect(url); + }; + + const handleDisconnect = () => { + manualDisconnectRef.current = true; + wsConnRef.current.disconnect(); + }; + + const handleAutoReconnectChange = (value) => { + setAutoReconnect(value); + autoReconnectRef.current = value; + }; + const handleLedChange = (value) => { + setLedOn(value); + if (isConnected) { + wsConnRef.current.sendMessage({ type: "led", state: value }); + } + }; + + wsConnRef.current.onWSOpen = () => { setUavStatus(prev => ({ ...prev, connection: "yes", @@ -39,13 +68,21 @@ function App() { setIsConnected(true); }; wsConnRef.current.onWSClose = () => { - setUavStatus(prev => ({ ...prev, connection: "no", mode: "null" })); setIsConnected(false); + + if (autoReconnectRef.current && !manualDisconnectRef.current && lastUrlRef.current) { + setTimeout(() => { + if (autoReconnectRef.current && lastUrlRef.current) { + wsConnRef.current.connect(lastUrlRef.current); + } + }, 3000); + } + manualDisconnectRef.current = false; }; const messageHandler = useCallback((json) => { @@ -112,12 +149,17 @@ function App() { }, []); return ( -