From 420c23bc01ea1e62a3bd0673b3aaf6f9d9a0c3f3 Mon Sep 17 00:00:00 2001 From: Ryan Turner <100864486+Turnlings@users.noreply.github.com> Date: Thu, 13 Nov 2025 13:45:30 +0000 Subject: [PATCH 01/10] Spotlight working on params page --- gcs/src/components/spotlight/actions.js | 8 ++++++++ gcs/src/params.jsx | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/gcs/src/components/spotlight/actions.js b/gcs/src/components/spotlight/actions.js index cddf74f44..afef4683e 100644 --- a/gcs/src/components/spotlight/actions.js +++ b/gcs/src/components/spotlight/actions.js @@ -135,3 +135,11 @@ AddSpotlightAction( RunCommand("new_preflight_checklist") }, ) +AddSpotlightAction( + "reboot_autopilot", + "Reboot Autopilot", + "command", + () => { + RunCommand("reboot_autopilot") + }, +) diff --git a/gcs/src/params.jsx b/gcs/src/params.jsx index dc90c4b88..be5b7cd79 100644 --- a/gcs/src/params.jsx +++ b/gcs/src/params.jsx @@ -25,6 +25,7 @@ import NoDroneConnected from "./components/noDroneConnected.jsx" import AutopilotRebootModal from "./components/params/autopilotRebootModal.jsx" import ParamsToolbar from "./components/params/paramsToolbar.jsx" import { Row } from "./components/params/row.jsx" +import { AddCommand } from "./components/spotlight/commandHandler" // Redux import { useDispatch, useSelector } from "react-redux" @@ -131,6 +132,10 @@ export default function Params() { dispatch(resetParamState()) } + useEffect(() => { + AddCommand("reboot_autopilot", rebootCallback) + }, []) + async function saveParamsToFile() { const options = { title: "Save parameters to a file", From c8017e0edb9d10bad4f779d7fbb664fe0db966e5 Mon Sep 17 00:00:00 2001 From: Ryan Turner <100864486+Turnlings@users.noreply.github.com> Date: Fri, 14 Nov 2025 12:32:14 +0000 Subject: [PATCH 02/10] useRebootCallback hook --- .../components/spotlight/commandHandler.js | 5 +++++ gcs/src/params.jsx | 22 ++++++++++--------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/gcs/src/components/spotlight/commandHandler.js b/gcs/src/components/spotlight/commandHandler.js index 952e095f3..1832b732f 100644 --- a/gcs/src/components/spotlight/commandHandler.js +++ b/gcs/src/components/spotlight/commandHandler.js @@ -8,12 +8,14 @@ import { useHotkeys } from "@mantine/hooks" import { useEffect, useState } from "react" import { useNavigate } from "react-router" import { useSettings } from "../../helpers/settings" +import { useRebootCallback } from "../../params" let commands = [] export function Commands() { let navigate = useNavigate() const [isMac, setIsMac] = useState(false) + let rebootCallback = useRebootCallback() useEffect(() => { window.ipcRenderer.invoke("app:is-mac").then((result) => { @@ -49,6 +51,9 @@ export function Commands() { AddCommand("open_settings", () => { open() }) + AddCommand("reboot_autopilot", () => { + rebootCallback() + }) // Register hotkeys useHotkeys([ diff --git a/gcs/src/params.jsx b/gcs/src/params.jsx index be5b7cd79..a06375b1c 100644 --- a/gcs/src/params.jsx +++ b/gcs/src/params.jsx @@ -68,6 +68,15 @@ function cleanFloat(value, decimals = 5) { return value } +export function useRebootCallback() { + const dispatch = useDispatch() + return () => { + dispatch(emitRebootAutopilot()) + dispatch(setAutoPilotRebootModalOpen(true)) + dispatch(resetParamState()) + } +} + export default function Params() { const dispatch = useDispatch() const connected = useSelector(selectConnectedToDrone) @@ -87,6 +96,9 @@ export default function Params() { const fetchingVars = useSelector(selectFetchingVars) const fetchingVarsProgress = useSelector(selectFetchingVarsProgress) + // + const rebootCallback = useRebootCallback() + // Reset state if we loose connection useEffect(() => { if (!connected) { @@ -126,16 +138,6 @@ export default function Params() { dispatch(setFetchingVars(true)) } - function rebootCallback() { - dispatch(emitRebootAutopilot()) - dispatch(setAutoPilotRebootModalOpen(true)) - dispatch(resetParamState()) - } - - useEffect(() => { - AddCommand("reboot_autopilot", rebootCallback) - }, []) - async function saveParamsToFile() { const options = { title: "Save parameters to a file", From a29a26f0f0b3556701b7101e7feafeeba3ca3e92 Mon Sep 17 00:00:00 2001 From: Ryan Turner <100864486+Turnlings@users.noreply.github.com> Date: Fri, 14 Nov 2025 12:44:24 +0000 Subject: [PATCH 03/10] Add reboot to dashboard actions --- .../tabsSectionTabs/actionTabsSection.jsx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/gcs/src/components/dashboard/tabsSectionTabs/actionTabsSection.jsx b/gcs/src/components/dashboard/tabsSectionTabs/actionTabsSection.jsx index fa779bc0c..8695c4b80 100644 --- a/gcs/src/components/dashboard/tabsSectionTabs/actionTabsSection.jsx +++ b/gcs/src/components/dashboard/tabsSectionTabs/actionTabsSection.jsx @@ -10,6 +10,11 @@ import { useEffect, useMemo, useState } from "react" import { Button, NumberInput, Popover, Select, Tabs } from "@mantine/core" import { useLocalStorage } from "@mantine/hooks" +// Styling imports +import resolveConfig from "tailwindcss/resolveConfig" +import tailwindConfig from "../../../../tailwind.config" +const tailwindColors = resolveConfig(tailwindConfig).theme.colors + // Mavlink import { getFlightModeMap } from "../../../helpers/mavlinkConstants" @@ -27,6 +32,7 @@ import { } from "../../../redux/slices/droneInfoSlice" import { NoConnectionMsg } from "../tabsSection" +import { useRebootCallback } from "../../../params" export default function ActionTabsSection({ connected, @@ -113,6 +119,7 @@ const ArmTakeoffLandAction = () => { defaultValue: 10, }) const isArmed = useSelector(selectArmed) + const rebootCallback = useRebootCallback() function armDisarm(arm, force = false) { // TODO: Add force arm ability @@ -165,6 +172,17 @@ const ArmTakeoffLandAction = () => { > Land + + {/** Reboot Button */} + ) From f37f70ecbae0b198f14581da018ca83a2e852ba9 Mon Sep 17 00:00:00 2001 From: Ryan Turner <100864486+Turnlings@users.noreply.github.com> Date: Fri, 14 Nov 2025 20:18:03 +0000 Subject: [PATCH 04/10] Hoist the reboot modal --- gcs/src/components/mainContent.jsx | 2 ++ gcs/src/params.jsx | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gcs/src/components/mainContent.jsx b/gcs/src/components/mainContent.jsx index 62e069ee1..61059dc8e 100644 --- a/gcs/src/components/mainContent.jsx +++ b/gcs/src/components/mainContent.jsx @@ -8,6 +8,7 @@ import { Route, Routes } from "react-router-dom" import SettingsModal from "./settingsModal" import { Commands } from "./spotlight/commandHandler" import Toolbar from "./toolbar/toolbar" +import AutopilotRebootModal from "./params/autopilotRebootModal.jsx" // Wrappers import { SettingsProvider } from "../helpers/settingsProvider" @@ -59,6 +60,7 @@ export default function AppContent() { } /> + diff --git a/gcs/src/params.jsx b/gcs/src/params.jsx index a06375b1c..b0d260ae4 100644 --- a/gcs/src/params.jsx +++ b/gcs/src/params.jsx @@ -22,7 +22,6 @@ const tailwindColors = resolveConfig(tailwindConfig).theme.colors // Custom components, helpers, and data import Layout from "./components/layout.jsx" import NoDroneConnected from "./components/noDroneConnected.jsx" -import AutopilotRebootModal from "./components/params/autopilotRebootModal.jsx" import ParamsToolbar from "./components/params/paramsToolbar.jsx" import { Row } from "./components/params/row.jsx" import { AddCommand } from "./components/spotlight/commandHandler" @@ -215,7 +214,6 @@ export default function Params() { return ( - {connected ? ( From 0dd19452a9a4af5f50822e47e7a0166d454df02b Mon Sep 17 00:00:00 2001 From: Ryan Turner <100864486+Turnlings@users.noreply.github.com> Date: Fri, 14 Nov 2025 20:29:41 +0000 Subject: [PATCH 05/10] lint and copilot --- gcs/src/components/spotlight/actions.js | 11 +++-------- gcs/src/params.jsx | 5 +---- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/gcs/src/components/spotlight/actions.js b/gcs/src/components/spotlight/actions.js index afef4683e..fc2f26478 100644 --- a/gcs/src/components/spotlight/actions.js +++ b/gcs/src/components/spotlight/actions.js @@ -135,11 +135,6 @@ AddSpotlightAction( RunCommand("new_preflight_checklist") }, ) -AddSpotlightAction( - "reboot_autopilot", - "Reboot Autopilot", - "command", - () => { - RunCommand("reboot_autopilot") - }, -) +AddSpotlightAction("reboot_autopilot", "Reboot Autopilot", "command", () => { + RunCommand("reboot_autopilot") +}) diff --git a/gcs/src/params.jsx b/gcs/src/params.jsx index b0d260ae4..aa9e4db7e 100644 --- a/gcs/src/params.jsx +++ b/gcs/src/params.jsx @@ -24,7 +24,6 @@ import Layout from "./components/layout.jsx" import NoDroneConnected from "./components/noDroneConnected.jsx" import ParamsToolbar from "./components/params/paramsToolbar.jsx" import { Row } from "./components/params/row.jsx" -import { AddCommand } from "./components/spotlight/commandHandler" // Redux import { useDispatch, useSelector } from "react-redux" @@ -79,6 +78,7 @@ export function useRebootCallback() { export default function Params() { const dispatch = useDispatch() const connected = useSelector(selectConnectedToDrone) + const rebootCallback = useRebootCallback() // Parameter states const hasFetchedOnce = useSelector(selectHasFetchedOnce) @@ -95,9 +95,6 @@ export default function Params() { const fetchingVars = useSelector(selectFetchingVars) const fetchingVarsProgress = useSelector(selectFetchingVarsProgress) - // - const rebootCallback = useRebootCallback() - // Reset state if we loose connection useEffect(() => { if (!connected) { From d68bf3ca9dd2de7c3452d3be63f419fea2deef3f Mon Sep 17 00:00:00 2001 From: Ryan Turner <100864486+Turnlings@users.noreply.github.com> Date: Fri, 14 Nov 2025 20:38:49 +0000 Subject: [PATCH 06/10] use const for reboot callback --- gcs/src/components/spotlight/commandHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcs/src/components/spotlight/commandHandler.js b/gcs/src/components/spotlight/commandHandler.js index 1832b732f..6d9eb461e 100644 --- a/gcs/src/components/spotlight/commandHandler.js +++ b/gcs/src/components/spotlight/commandHandler.js @@ -15,7 +15,7 @@ let commands = [] export function Commands() { let navigate = useNavigate() const [isMac, setIsMac] = useState(false) - let rebootCallback = useRebootCallback() + const rebootCallback = useRebootCallback() useEffect(() => { window.ipcRenderer.invoke("app:is-mac").then((result) => { From 0740ad86b3730fdf3cda91ec8d465964b14c8037 Mon Sep 17 00:00:00 2001 From: Ryan Turner <100864486+Turnlings@users.noreply.github.com> Date: Fri, 14 Nov 2025 21:06:25 +0000 Subject: [PATCH 07/10] Extract useRebootCallback into helper --- .../tabsSectionTabs/actionTabsSection.jsx | 2 +- .../components/spotlight/commandHandler.js | 2 +- gcs/src/helpers/useRebootCallback.js | 22 +++++++++++++++++++ gcs/src/params.jsx | 12 +--------- 4 files changed, 25 insertions(+), 13 deletions(-) create mode 100644 gcs/src/helpers/useRebootCallback.js diff --git a/gcs/src/components/dashboard/tabsSectionTabs/actionTabsSection.jsx b/gcs/src/components/dashboard/tabsSectionTabs/actionTabsSection.jsx index 8695c4b80..057d2e1c9 100644 --- a/gcs/src/components/dashboard/tabsSectionTabs/actionTabsSection.jsx +++ b/gcs/src/components/dashboard/tabsSectionTabs/actionTabsSection.jsx @@ -32,7 +32,7 @@ import { } from "../../../redux/slices/droneInfoSlice" import { NoConnectionMsg } from "../tabsSection" -import { useRebootCallback } from "../../../params" +import { useRebootCallback } from "../../../helpers/useRebootCallback" export default function ActionTabsSection({ connected, diff --git a/gcs/src/components/spotlight/commandHandler.js b/gcs/src/components/spotlight/commandHandler.js index 6d9eb461e..f56312074 100644 --- a/gcs/src/components/spotlight/commandHandler.js +++ b/gcs/src/components/spotlight/commandHandler.js @@ -8,7 +8,7 @@ import { useHotkeys } from "@mantine/hooks" import { useEffect, useState } from "react" import { useNavigate } from "react-router" import { useSettings } from "../../helpers/settings" -import { useRebootCallback } from "../../params" +import { useRebootCallback } from "../../helpers/useRebootCallback" let commands = [] diff --git a/gcs/src/helpers/useRebootCallback.js b/gcs/src/helpers/useRebootCallback.js new file mode 100644 index 000000000..b5900109c --- /dev/null +++ b/gcs/src/helpers/useRebootCallback.js @@ -0,0 +1,22 @@ +import { useDispatch} from "react-redux" +import { useCallback } from "react" + +import { + emitRebootAutopilot, + setAutoPilotRebootModalOpen, + resetParamState, +} from "../redux/slices/paramsSlice.js" + +/** + * Hook that returns a callback to repoot the autopilot. + * Displays reboot modal and resets params. + * @returns Callback to reboot autopilot + */ +export function useRebootCallback() { + const dispatch = useDispatch() + return useCallback(() => { + dispatch(emitRebootAutopilot()) + dispatch(setAutoPilotRebootModalOpen(true)) + dispatch(resetParamState()) + }, [dispatch]) +} diff --git a/gcs/src/params.jsx b/gcs/src/params.jsx index aa9e4db7e..cc5e38cfd 100644 --- a/gcs/src/params.jsx +++ b/gcs/src/params.jsx @@ -24,6 +24,7 @@ import Layout from "./components/layout.jsx" import NoDroneConnected from "./components/noDroneConnected.jsx" import ParamsToolbar from "./components/params/paramsToolbar.jsx" import { Row } from "./components/params/row.jsx" +import { useRebootCallback } from "./helpers/useRebootCallback.js" // Redux import { useDispatch, useSelector } from "react-redux" @@ -33,7 +34,6 @@ import { showErrorNotification } from "./helpers/notification.js" import { selectConnectedToDrone } from "./redux/slices/droneConnectionSlice.js" import { emitExportParamsToFile, - emitRebootAutopilot, emitRefreshParams, emitSetMultipleParams, resetParamState, @@ -45,7 +45,6 @@ import { selectParamSearchValue, selectShowModifiedParams, selectShownParams, - setAutoPilotRebootModalOpen, setFetchingVars, setHasFetchedOnce, setLoadedFileName, @@ -66,15 +65,6 @@ function cleanFloat(value, decimals = 5) { return value } -export function useRebootCallback() { - const dispatch = useDispatch() - return () => { - dispatch(emitRebootAutopilot()) - dispatch(setAutoPilotRebootModalOpen(true)) - dispatch(resetParamState()) - } -} - export default function Params() { const dispatch = useDispatch() const connected = useSelector(selectConnectedToDrone) From 384768730e507b6783d4a17e12de1d921312b1d8 Mon Sep 17 00:00:00 2001 From: Ryan Turner <100864486+Turnlings@users.noreply.github.com> Date: Fri, 14 Nov 2025 21:09:13 +0000 Subject: [PATCH 08/10] linting --- gcs/src/helpers/useRebootCallback.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcs/src/helpers/useRebootCallback.js b/gcs/src/helpers/useRebootCallback.js index b5900109c..8ac4063ee 100644 --- a/gcs/src/helpers/useRebootCallback.js +++ b/gcs/src/helpers/useRebootCallback.js @@ -1,4 +1,4 @@ -import { useDispatch} from "react-redux" +import { useDispatch } from "react-redux" import { useCallback } from "react" import { From ab2a2c0cbf90803626182de845dc1b554f030c9b Mon Sep 17 00:00:00 2001 From: Ryan Turner <100864486+Turnlings@users.noreply.github.com> Date: Fri, 14 Nov 2025 21:30:25 +0000 Subject: [PATCH 09/10] copilot --- .../dashboard/tabsSectionTabs/actionTabsSection.jsx | 4 +--- gcs/src/components/spotlight/commandHandler.js | 4 +--- gcs/src/helpers/useRebootCallback.js | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/gcs/src/components/dashboard/tabsSectionTabs/actionTabsSection.jsx b/gcs/src/components/dashboard/tabsSectionTabs/actionTabsSection.jsx index 057d2e1c9..2411ad462 100644 --- a/gcs/src/components/dashboard/tabsSectionTabs/actionTabsSection.jsx +++ b/gcs/src/components/dashboard/tabsSectionTabs/actionTabsSection.jsx @@ -175,9 +175,7 @@ const ArmTakeoffLandAction = () => { {/** Reboot Button */}