Skip to content

Commit 6e2434f

Browse files
authored
Dashboard.jsx change for redux (#617)
* Fixed store, setup sockets, and started on dashboard * Dashboard basically done * Fixed map and refactored * Cleaned up code and fixed mission items * Fixes * fixed linting * AI Fixes * Moved gps out and fixed messages - more to move still * Updated messages * More moving of variables/cleaning up * Moved more things around :D * formatted D: * Fixed drone connection issues and states * formatted * FIXED IT WOOO * formatted * Kush fixes
1 parent 98df64e commit 6e2434f

25 files changed

Lines changed: 411 additions & 547 deletions

.vscode/settings.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"cSpell.words": [
3+
"ardupilot",
34
"ARSP",
45
"centered",
56
"Crosshair",

gcs/src/components/dashboard/floatingToolbar.jsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,25 @@ import {
1515
IconSunOff,
1616
} from "@tabler/icons-react"
1717

18+
// Redux
19+
import { useSelector } from "react-redux"
20+
import { selectGPS } from "../../redux/slices/droneInfoSlice"
21+
import { selectCurrentMissionItems } from "../../redux/slices/missionSlice"
22+
1823
// Helper Functions
1924
import { filterMissionItems } from "../../helpers/filterMissions"
2025
import GetOutsideVisibilityColor from "../../helpers/outsideVisibility"
2126

2227
export default function FloatingToolbar({
23-
missionItems,
2428
centerMapOnDrone,
25-
gpsData,
2629
followDrone,
2730
setFollowDrone,
2831
mapRef,
2932
}) {
30-
const filteredMissionItems = filterMissionItems(missionItems.mission_items)
33+
const gpsData = useSelector(selectGPS)
34+
const missionItems = useSelector(selectCurrentMissionItems)
35+
36+
const filteredMissionItems = filterMissionItems(missionItems.missionItems)
3137
const [outsideVisibility, setOutsideVisibility] = useLocalStorage({
3238
key: "outsideVisibility",
3339
defaultValue: false,

gcs/src/components/dashboard/map.jsx

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,18 @@ import {
2020
import "maplibre-gl/dist/maplibre-gl.css"
2121
import Map from "react-map-gl/maplibre"
2222

23+
// Redux
24+
import { useSelector } from "react-redux"
25+
import {
26+
selectFlightModeString,
27+
selectGPS,
28+
selectNavController,
29+
} from "../../redux/slices/droneInfoSlice"
30+
import {
31+
selectCurrentMissionItems,
32+
selectHomePosition,
33+
} from "../../redux/slices/missionSlice"
34+
2335
// Helper scripts
2436
import { intToCoord } from "../../helpers/dataFormatters"
2537
import { filterMissionItems } from "../../helpers/filterMissions"
@@ -47,17 +59,17 @@ const tailwindColors = resolveConfig(tailwindConfig).theme.colors
4759

4860
const coordsFractionDigits = 7
4961

50-
function MapSectionNonMemo({
51-
passedRef,
52-
data,
53-
heading,
54-
desiredBearing,
55-
missionItems,
56-
homePosition,
57-
onDragstart,
58-
getFlightMode,
59-
mapId = "dashboard",
60-
}) {
62+
function MapSectionNonMemo({ passedRef, onDragstart, mapId = "dashboard" }) {
63+
// Redux
64+
const gpsData = useSelector(selectGPS)
65+
const navControllerOutputData = useSelector(selectNavController)
66+
const missionItems = useSelector(selectCurrentMissionItems)
67+
const homePosition = useSelector(selectHomePosition)
68+
const flightMode = useSelector(selectFlightModeString)
69+
const data = gpsData
70+
const heading = gpsData.hdg ? gpsData.hdg / 100 : 0
71+
const desiredBearing = navControllerOutputData.navBearing
72+
6173
const [connected] = useSessionStorage({
6274
key: "connectedToDrone",
6375
defaultValue: false,
@@ -129,7 +141,7 @@ function MapSectionNonMemo({
129141
let lon = intToCoord(data.lon)
130142
setPosition({ latitude: lat, longitude: lon })
131143

132-
if (!firstCenteredToDrone) {
144+
if (!firstCenteredToDrone && passedRef.current !== null) {
133145
passedRef.current.getMap().flyTo({
134146
center: [lon, lat],
135147
zoom: initialViewState.zoom,
@@ -269,7 +281,7 @@ function MapSectionNonMemo({
269281
)
270282
})}
271283

272-
{getFlightMode() === "Guided" && guidedModePinData !== null && (
284+
{flightMode === "Guided" && guidedModePinData !== null && (
273285
<MarkerPin
274286
lat={guidedModePinData.lat}
275287
lon={guidedModePinData.lon}

gcs/src/components/dashboard/tabsSection.jsx

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,25 @@
66
// 3rd Party Imports
77
import { Tabs } from "@mantine/core"
88

9-
// Tab Componenents
9+
// Tab Components
1010
import CameraTabsSection from "./tabsSectionTabs/cameraTabsSection"
1111
import ActionTabsSection from "./tabsSectionTabs/actionTabsSection"
1212
import MissionTabsSection from "./tabsSectionTabs/missionTabsSection"
1313
import DataTabsSection from "./tabsSectionTabs/dataTabsSection"
1414
import PreFlightChecklistTab from "./tabsSectionTabs/preFlightChecklistSection"
1515

16-
export default function TabsSection({
17-
connected,
18-
aircraftType,
19-
getIsArmed,
20-
currentFlightModeNumber,
21-
currentMissionData,
22-
navControllerOutputData,
23-
displayedData,
24-
setDisplayedData,
25-
}) {
16+
// Redux
17+
import { useSelector } from "react-redux"
18+
import {
19+
selectAircraftType,
20+
selectNavController,
21+
} from "../../redux/slices/droneInfoSlice"
22+
import { selectConnectedToDrone } from "../../redux/slices/droneConnectionSlice"
23+
24+
export default function TabsSection({ currentFlightModeNumber }) {
25+
const connected = useSelector(selectConnectedToDrone)
26+
const aircraftType = useSelector(selectAircraftType)
27+
const navControllerOutputData = useSelector(selectNavController)
2628
const tabPadding = "pt-6 pb-4"
2729

2830
return (
@@ -36,26 +38,20 @@ export default function TabsSection({
3638
</Tabs.List>
3739

3840
{/* Data */}
39-
<DataTabsSection
40-
tabPadding={tabPadding}
41-
displayedData={displayedData}
42-
setDisplayedData={setDisplayedData}
43-
/>
41+
<DataTabsSection tabPadding={tabPadding} />
4442

4543
{/* Actions */}
4644
<ActionTabsSection
4745
connected={connected}
4846
tabPadding={tabPadding}
4947
currentFlightModeNumber={currentFlightModeNumber}
5048
aircraftType={aircraftType}
51-
getIsArmed={getIsArmed}
5249
></ActionTabsSection>
5350

5451
{/* Mission */}
5552
<MissionTabsSection
5653
connected={connected}
5754
tabPadding={tabPadding}
58-
currentMissionData={currentMissionData}
5955
navControllerOutputData={navControllerOutputData}
6056
currentFlightModeNumber={currentFlightModeNumber}
6157
aircraftType={aircraftType}

gcs/src/components/dashboard/tabsSectionTabs/actionTabsSection.jsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@ import {
1919
// Helper
2020
import { socket } from "../../../helpers/socket"
2121
import { NoConnectionMsg } from "../tabsSection"
22+
import { useSelector } from "react-redux"
23+
import { selectArmed } from "../../../redux/slices/droneInfoSlice"
2224

2325
export default function ActionTabsSection({
2426
connected,
2527
tabPadding,
2628
currentFlightModeNumber,
2729
aircraftType,
28-
getIsArmed,
2930
}) {
3031
return (
3132
<Tabs.Panel value="actions">
@@ -40,7 +41,7 @@ export default function ActionTabsSection({
4041
currentFlightModeNumber={currentFlightModeNumber}
4142
/>
4243
{/** Arm / Takeoff / Landing */}
43-
<ArmTakeoffLandAction getIsArmed={getIsArmed} />
44+
<ArmTakeoffLandAction />
4445
</div>
4546
)}
4647
</div>
@@ -99,11 +100,12 @@ const FlightModeAction = ({ aircraftType, currentFlightModeNumber }) => {
99100
)
100101
}
101102

102-
const ArmTakeoffLandAction = ({ getIsArmed }) => {
103+
const ArmTakeoffLandAction = () => {
103104
const [takeoffAltitude, setTakeoffAltitude] = useLocalStorage({
104105
key: "takeoffAltitude",
105106
defaultValue: 10,
106107
})
108+
const isArmed = useSelector(selectArmed)
107109

108110
function armDisarm(arm, force = false) {
109111
// TODO: Add force arm ability
@@ -123,11 +125,11 @@ const ArmTakeoffLandAction = ({ getIsArmed }) => {
123125
<div className="flex flex-wrap flex-cols gap-2">
124126
<Button
125127
onClick={() => {
126-
armDisarm(!getIsArmed())
128+
armDisarm(!isArmed)
127129
}}
128130
className="grow"
129131
>
130-
{getIsArmed() ? "Disarm" : "Arm"}
132+
{isArmed ? "Disarm" : "Arm"}
131133
</Button>
132134

133135
{/** Takeoff button with popover */}

gcs/src/components/dashboard/tabsSectionTabs/dataTabsSection.jsx

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,19 @@ import { IconInfoCircle } from "@tabler/icons-react"
1818

1919
// Helper
2020
import { DataMessage } from "../../../helpers/dataDisplay"
21+
import { useDispatch, useSelector } from "react-redux"
22+
import {
23+
changeExtraData,
24+
selectExtraDroneData,
25+
} from "../../../redux/slices/droneInfoSlice"
2126

22-
export default function DataTabsSection({
23-
tabPadding,
24-
displayedData,
25-
setDisplayedData,
26-
}) {
27+
export default function DataTabsSection({ tabPadding }) {
2728
const [selectedBox, setSelectedBox] = useState(null)
2829
const [opened, { open, close }] = useDisclosure(false)
2930

31+
const dispatch = useDispatch()
32+
const selectedData = useSelector(selectExtraDroneData)
33+
3034
const handleDoubleClick = (box) => {
3135
setSelectedBox(box)
3236
open()
@@ -35,17 +39,16 @@ export default function DataTabsSection({
3539
const handleCheckboxChange = (key, subkey, subvalue, boxId, isChecked) => {
3640
// Update wantedData on checkbox change
3741
if (isChecked) {
38-
const newDisplay = displayedData.map((item, index) => {
39-
if (index === boxId) {
40-
return {
41-
...item,
42+
dispatch(
43+
changeExtraData({
44+
index: boxId,
45+
data: {
4246
currently_selected: `${key}.${subkey}`,
4347
display_name: subvalue,
44-
}
45-
}
46-
return item
47-
})
48-
setDisplayedData(newDisplay)
48+
value: 0,
49+
},
50+
}),
51+
)
4952
close()
5053
}
5154
}
@@ -54,8 +57,8 @@ export default function DataTabsSection({
5457
<Tabs.Panel value="data">
5558
<div className={tabPadding}>
5659
<Grid className="cursor-pointer select-none">
57-
{displayedData.length > 0 ? (
58-
displayedData.map((data) => (
60+
{selectedData.length > 0 ? (
61+
selectedData.map((data) => (
5962
<Grid.Col
6063
span={6}
6164
key={data.boxId}

gcs/src/components/dashboard/tabsSectionTabs/missionTabsSection.jsx

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ import {
1717
// Helper
1818
import { socket } from "../../../helpers/socket"
1919
import { NoConnectionMsg } from "../tabsSection"
20+
import { useSelector } from "react-redux"
21+
import { selectCurrentMission } from "../../../redux/slices/missionSlice"
2022

2123
export default function MissionTabsSection({
2224
connected,
2325
tabPadding,
24-
currentMissionData,
2526
navControllerOutputData,
2627
currentFlightModeNumber,
2728
aircraftType,
@@ -34,10 +35,7 @@ export default function MissionTabsSection({
3435
) : (
3536
<div className="flex flex-col gap-4">
3637
{/** Mission Information */}
37-
<MissionInfo
38-
currentMissionData={currentMissionData}
39-
navControllerOutputData={navControllerOutputData}
40-
/>
38+
<MissionInfo navControllerOutputData={navControllerOutputData} />
4139

4240
{/** Auto, Start and Restart Mission */}
4341
<AutoStartRestartMission
@@ -51,18 +49,19 @@ export default function MissionTabsSection({
5149
)
5250
}
5351

54-
const MissionInfo = ({ currentMissionData, navControllerOutputData }) => {
52+
const MissionInfo = ({ navControllerOutputData }) => {
53+
const currentMission = useSelector(selectCurrentMission)
5554
return (
5655
<>
5756
{/** Mission Information */}
5857
<div className="text-lg">
5958
<p>
6059
<span className="font-bold"> Mission State:</span>{" "}
61-
{MISSION_STATES[currentMissionData.mission_state]}
60+
{MISSION_STATES[currentMission.mission_state]}
6261
</p>
6362
<p>
64-
<span className="font-bold"> Waypoint: </span>{" "}
65-
{currentMissionData.seq}/{currentMissionData.total}
63+
<span className="font-bold"> Waypoint: </span> {currentMission.seq}/
64+
{currentMission.total}
6665
</p>
6766
<p>
6867
<span className="font-bold">Distance to WP: </span>{" "}

0 commit comments

Comments
 (0)