From 64ce25423922052ed4092c0722bf30b7e232db17 Mon Sep 17 00:00:00 2001 From: PxlLoewe <72106766+PxlLoewe@users.noreply.github.com> Date: Wed, 21 May 2025 14:48:07 -0700 Subject: [PATCH] addd HPG state --- apps/dispatch-server/routes/mission.ts | 73 +++++++++++++++++- .../socket-events/connect-desktop.ts | 25 +++++- apps/dispatch/app/_components/Audio.tsx | 12 +++ .../app/_components/QueryProvider.tsx | 3 +- apps/dispatch/app/_store/audioStore.ts | 2 +- .../_components/pannel/MissionForm.tsx | 41 +++++++--- grafana/grafana.db | Bin 1122304 -> 1122304 bytes .../database/prisma/schema/mission.prisma | 37 ++++++--- 8 files changed, 165 insertions(+), 28 deletions(-) diff --git a/apps/dispatch-server/routes/mission.ts b/apps/dispatch-server/routes/mission.ts index f1599890..cede9fa8 100644 --- a/apps/dispatch-server/routes/mission.ts +++ b/apps/dispatch-server/routes/mission.ts @@ -1,4 +1,4 @@ -import { prisma } from "@repo/db"; +import { HpgValidationState, Prisma, prisma } from "@repo/db"; import { Router } from "express"; import { io } from "../index"; import { sendNtfyMission } from "modules/ntfy"; @@ -203,4 +203,75 @@ router.post("/:id/send-alert", async (req, res) => { } }); +router.post("/:id/validate-hpg", async (req, res) => { + try { + const { id } = req.params; + const mission = await prisma.mission.findFirstOrThrow({ + where: { + id: Number(id), + }, + }); + + const activeAircraftinMission = await prisma.connectedAircraft.findFirst({ + where: { + stationId: { + in: mission?.missionStationIds, + }, + posH145active: true, + logoutTime: null, + }, + include: { + Station: true, + }, + }); + + /* if (activeAircraftinMission.length === 0) { + res.status(400).json({ error: "No active aircraft in mission" }); + return; + } */ + + res.json({ + message: "HPG validation started", + }); + + io.to(`desktop:${activeAircraftinMission}`).emit( + "hpg-validation", + { + hpgMissionType: mission?.hpgMissionString, + lat: mission?.addressLat, + lng: mission?.addressLng, + }, + async (result: { + state: HpgValidationState; + lat: number; + lng: number; + }) => { + console.log("response from user:", result); + + const newMission = await prisma.mission.update({ + where: { id: Number(id) }, + data: { + // save position of new mission + addressLat: + result.state === "POSITION_AMANDED" + ? result.lat + : mission.addressLat, + addressLng: + result.state === "POSITION_AMANDED" + ? result.lng + : mission.addressLng, + hpgLocationLat: result.lat, + hpgLocationLng: result.lng, + hpgValidationState: result.state, + }, + }); + io.to("dispatchers").emit("update-mission", newMission); + }, + ); + } catch (error) { + console.error(error); + res.json({ error: (error as Error).message || "Failed to validate HPG" }); + } +}); + export default router; diff --git a/apps/dispatch-server/socket-events/connect-desktop.ts b/apps/dispatch-server/socket-events/connect-desktop.ts index 7be52449..5c10e93a 100644 --- a/apps/dispatch-server/socket-events/connect-desktop.ts +++ b/apps/dispatch-server/socket-events/connect-desktop.ts @@ -1,13 +1,34 @@ -import { User } from "@repo/db"; +import { prisma, User } from "@repo/db"; import { Socket, Server } from "socket.io"; export const handleConnectDesktop = (socket: Socket, io: Server) => () => { const user = socket.data.user as User; - console.log("connect-desktop", user.publicId); + + const connectedAircraft = prisma.connectedAircraft.findFirst({ + where: { + userId: user.id, + logoutTime: null, + }, + include: { + Station: true, + }, + }); + + const conenctedDispatchers = prisma.connectedDispatcher.findFirst({ + where: { + userId: user.id, + logoutTime: null, + }, + }) + socket.join(`user:${user.id}`); socket.join(`desktop:${user.id}`); socket.on("ptt", (data) => { socket.to(`user:${user.id}`).emit("ptt", data); + socket.to("pilots").emit("other-ptt", { + publicUser: user.publicId, + source: + }) }); }; diff --git a/apps/dispatch/app/_components/Audio.tsx b/apps/dispatch/app/_components/Audio.tsx index 89df26b3..f0cc5dea 100644 --- a/apps/dispatch/app/_components/Audio.tsx +++ b/apps/dispatch/app/_components/Audio.tsx @@ -21,6 +21,8 @@ import { ROOMS } from "_data/livekitRooms"; export const Audio = () => { const connection = usePilotConnectionStore(); + const [showSource, setShowSource] = useState(false); + const { isTalking, toggleTalking, @@ -31,9 +33,16 @@ export const Audio = () => { remoteParticipants, room, message, + source, } = useAudioStore(); const [selectedRoom, setSelectedRoom] = useState("LST_01"); + useEffect(() => { + setShowSource(true); + setTimeout(() => { + setShowSource(false); + }, 2000); + }, [source, isTalking]); useEffect(() => { const joinRoom = async () => { if (connection.status != "connected") return; @@ -55,6 +64,9 @@ export const Audio = () => { {state === "error" && (
{message}
)} + {showSource && source && ( +
{source}
+ )}