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 */}