diff --git a/gcs/src/components/navbar.jsx b/gcs/src/components/navbar.jsx index b56fc8e6e..ea0d5fa91 100644 --- a/gcs/src/components/navbar.jsx +++ b/gcs/src/components/navbar.jsx @@ -7,7 +7,6 @@ */ // Base imports -import { useEffect, useState } from "react" import { Link } from "react-router-dom" // Third party imports @@ -23,11 +22,7 @@ import { TextInput, Tooltip, } from "@mantine/core" -import { - useDisclosure, - useLocalStorage, - useSessionStorage, -} from "@mantine/hooks" +import { useSessionStorage } from "@mantine/hooks" import { IconInfoCircle, IconRefresh } from "@tabler/icons-react" // Local imports @@ -36,7 +31,38 @@ import { AddCommand } from "./spotlight/commandHandler.js" // Helper imports import { IconAlertTriangle } from "@tabler/icons-react" import { showErrorNotification } from "../helpers/notification.js" -import { socket } from "../helpers/socket" + +// Redux +import { useDispatch, useSelector } from "react-redux" +import { + ConnectionType, + emitConnectToDrone, + emitDisconnectFromDrone, + emitGetComPorts, + selectBaudrate, + selectComPorts, + selectConnectedToDrone, + selectConnecting, + selectConnectionModal, + selectConnectionStatus, + selectConnectionType, + selectFetchingComPorts, + selectIp, + selectNetworkType, + selectPort, + selectSelectedComPorts, + selectWireless, + setBaudrate, + setConnecting, + setConnectionModal, + setConnectionType, + setIp, + setNetworkType, + setPort, + setSelectedComPorts, + setWireless, +} from "../redux/slices/droneConnectionSlice.js" +import { selectIsConnectedToSocket } from "../redux/slices/socketSlice.js" // Styling imports import { twMerge } from "tailwind-merge" @@ -45,206 +71,73 @@ import tailwindConfig from "../../tailwind.config.js" const tailwindColors = resolveConfig(tailwindConfig).theme.colors export default function Navbar() { + // Redux + const dispatch = useDispatch() + const openedModal = useSelector(selectConnectionModal) + + const connecting = useSelector(selectConnecting) + const connectedToDrone = useSelector(selectConnectedToDrone) + const connectedToSocket = useSelector(selectIsConnectedToSocket) + + const comPorts = useSelector(selectComPorts) + const selectedComPort = useSelector(selectSelectedComPorts) + const fetchingComPorts = useSelector(selectFetchingComPorts) + const wireless = useSelector(selectWireless) + const selectedBaudRate = useSelector(selectBaudrate) + const connectionType = useSelector(selectConnectionType) + const networkType = useSelector(selectNetworkType) + const ip = useSelector(selectIp) + const port = useSelector(selectPort) + const droneConnectionStatusMessage = useSelector(selectConnectionStatus) + // Panel is open/closed - const [opened, { open, close }] = useDisclosure(false) const [outOfDate] = useSessionStorage({ key: "outOfDate" }) const [currentPage] = useSessionStorage({ key: "currentPage", defaultValue: "dashboard", }) - // Connection to drone - const [connecting, setConnecting] = useState(false) - const [connected, setConnected] = useSessionStorage({ - key: "connectedToDrone", - defaultValue: false, - }) - const [wireless, setWireless] = useLocalStorage({ - key: "wirelessConnection", - defaultValue: true, - }) - const [connectedToSocket, setConnectedToSocket] = useSessionStorage({ - key: "socketConnection", - defaultValue: false, - }) - const [selectedBaudRate, setSelectedBaudRate] = useLocalStorage({ - key: "baudrate", - defaultValue: "9600", - }) - - // eslint-disable-next-line no-unused-vars - const [aircraftType, setAircraftType] = useLocalStorage({ - key: "aircraftType", - defaultValue: 0, - }) - - const ConnectionType = { - Serial: "serial", - Network: "network", - } - - const [connectionType, setConnectionType] = useLocalStorage({ - key: "connectionType", - defaultValue: ConnectionType.Serial, - }) - - // Com Ports - const [comPorts, setComPorts] = useState([]) - const [selectedComPort, setSelectedComPort] = useSessionStorage({ - key: "selectedComPort", - defaultValue: null, - }) - const [fetchingComPorts, setFetchingComPorts] = useState(false) - - // Network Connection - const [networkType, setNetworkType] = useLocalStorage({ - key: "networkType", - defaultValue: "tcp", - }) - const [ip, setIp] = useLocalStorage({ - key: "ip", - defaultValue: "127.0.0.1", - }) - const [port, setPort] = useLocalStorage({ - key: "port", - defaultValue: "5760", - }) - - const [droneConnectionStatusMessage, setDroneConnectionStatusMessage] = - useState(null) - - function getComPorts() { - if (!connectedToSocket) return - socket.emit("get_com_ports") - setFetchingComPorts(true) - } - - // Check if connected to drone - useEffect(() => { - if (selectedComPort === null) { - socket.emit("is_connected_to_drone") - } - - socket.on("connect", () => { - setConnectedToSocket(true) - }) - - socket.on("disconnect", () => { - setConnectedToSocket(false) - }) - - // Flag connected/not connected, if not fetch ports - socket.on("is_connected_to_drone", (msg) => { - if (msg) { - setConnected(true) - } else { - setConnected(false) - setConnecting(false) - getComPorts() - } - }) - - // Fetch com ports and list them - socket.on("list_com_ports", (msg) => { - setFetchingComPorts(false) - setComPorts(msg) - if (selectedComPort === null || !msg.includes(selectedComPort)) { - const possibleComPort = msg.find( - (port) => - port.toLowerCase().includes("mavlink") || - port.toLowerCase().includes("ardupilot"), - ) - if (possibleComPort !== undefined) { - setSelectedComPort(possibleComPort) - } else if (msg.length > 0) { - setSelectedComPort(msg[0]) - } - } - }) - - // Flags that the drone is connected - socket.on("connected_to_drone", (data) => { - setAircraftType(data.aircraft_type) - if (data.aircraft_type != 1 && data.aircraft_type != 2) { - showErrorNotification("Aircraft not of type quadcopter or plane") - } - setConnected(true) - setConnecting(false) - close() - }) - - // Flags that the drone is disconnected - socket.on("disconnected_from_drone", () => { - console.log("disconnected_from_drone") - setConnected(false) - }) - - // Handles disconnect trigger - socket.on("disconnect", () => { - setConnected(false) - setConnecting(false) - }) - - // Flags an error with the com port - socket.on("connection_error", (msg) => { - console.log(msg.message) - showErrorNotification(msg.message) - setConnecting(false) - setConnected(false) - }) - - socket.on("drone_connect_status", (msg) => { - setDroneConnectionStatusMessage(msg.message) - }) - - return () => { - socket.off("connect") - socket.off("disconnect") - socket.off("is_connected_to_drone") - socket.off("list_com_ports") - socket.off("connected_to_drone") - socket.off("disconnected_from_drone") - socket.off("disconnect") - socket.off("connection_error") - socket.off("drone_connect_status") - setConnected(false) - } - }, []) - function connectToDrone(type) { if (type === ConnectionType.Serial) { - socket.emit("connect_to_drone", { - port: selectedComPort, - baud: parseInt(selectedBaudRate), - wireless: wireless, - connectionType: type, - }) + dispatch( + emitConnectToDrone({ + port: selectedComPort, + baud: parseInt(selectedBaudRate), + wireless: wireless, + connectionType: type, + }), + ) } else if (type === ConnectionType.Network) { if (ip === "" || port === "") { showErrorNotification("IP Address and Port cannot be empty") return } const networkString = `${networkType}:${ip}:${port}` - socket.emit("connect_to_drone", { - port: networkString, - baud: 115200, - wireless: true, - connectionType: type, - }) + dispatch( + emitConnectToDrone({ + port: networkString, + baud: 115200, + wireless: true, + connectionType: type, + }), + ) } else { return } - setConnecting(true) + + dispatch(setConnecting(true)) } + // All seems to be broken, made a ticket for joe to look into: https://github.com/orgs/Avis-Drone-Labs/projects/10/views/1?pane=issue&itemId=124913361 function disconnect() { - socket.emit("disconnect_from_drone") + dispatch(emitDisconnectFromDrone()) } function connectToDroneFromButton() { - getComPorts() - open() + dispatch(emitGetComPorts()) + dispatch(setConnectionModal(true)) } + AddCommand("connect_to_drone", connectToDroneFromButton) AddCommand("disconnect_from_drone", disconnect) @@ -255,10 +148,10 @@ export default function Navbar() {
- {connected && (
+ {connectedToDrone && (
<>
Connected to
@@ -496,15 +396,15 @@ export default function Navbar() {
{/* Button to connect to drone */}
{connectedToSocket ? (
) : (