From c7df38e6ce38578acf1c7e863864839165d1124c Mon Sep 17 00:00:00 2001 From: ThePetrovich Date: Fri, 27 Jun 2025 18:23:50 +0800 Subject: [PATCH] Refactor of map & other components --- .prettierrc | 6 + src/lib/prediction.ts | 91 ++------ src/lib/stores.ts | 23 ++ src/lib/telemetry.ts | 37 +--- src/lib/types.ts | 91 ++++++++ src/routes/ControlPanel.svelte | 376 ++++++++++++++++++++------------ src/routes/map.svelte | 333 +++++++++++----------------- src/routes/predict/+page.svelte | 30 +-- src/routes/track/+page.svelte | 4 +- static/css/custom.css | 7 + 10 files changed, 532 insertions(+), 466 deletions(-) create mode 100644 .prettierrc create mode 100644 src/lib/stores.ts create mode 100644 src/lib/types.ts diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..d10f057 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "tabWidth": 4, + "endOfLine": "lf", + "printWidth": 120, + "useTabs": false +} diff --git a/src/lib/prediction.ts b/src/lib/prediction.ts index e9c9b26..cdda7a3 100644 --- a/src/lib/prediction.ts +++ b/src/lib/prediction.ts @@ -1,62 +1,10 @@ -import { writable } from "svelte/store" +import { writable } from "svelte/store"; import type { LatLngExpression } from "leaflet"; import L from "leaflet"; import { getCsrfToken } from "./auth"; - - -interface TrajectoryPoint { - altitude: number; - datetime: string; - latitude: number; - longitude: number; -} - -interface PredictionStage { - stage: string; - trajectory: TrajectoryPoint[]; -} - -interface ParsedPrediction { - flight_path: [number, number, number][]; - launch: { - latlng: LatLngExpression; - datetime: Date; - }; - burst: { - latlng: LatLngExpression; - datetime: Date; - }; - landing: { - latlng: LatLngExpression; - datetime: Date; - }; - profile: string; - flight_time: number; -} - - -export const latestPrediction = writable({ - metadata: { - complete_datetime: "", - start_datetime: "" - }, - prediction: [ - { - stage: "", - trajectory: [ - { - altitude: 0.0, - datetime: "", - latitude: 0.0, - longitude: 0.0 - } - ] - } - ] -}); - -export const latestPredictionParsed = writable({} as ParsedPrediction); +import type { PredictionStage, Prediction, ParsedPrediction } from "./types"; +import { latestPrediction, latestPredictionParsed } from "./stores"; function getLatestDataset() { const now = new Date(); @@ -72,22 +20,22 @@ function getLatestDataset() { // Subtract 6 hours to account for the lag roundedDate.setUTCHours(roundedDate.getUTCHours() - 6); - return roundedDate.toISOString(); + return roundedDate.toISOString(); } function formatLaunchDateTime(dateObj: string | Date, timeStr: string): string { // Ensure date is a Date object const date = new Date(dateObj); - + // Extract date components const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); + const month = String(date.getMonth() + 1).padStart(2, "0"); + const day = String(date.getDate()).padStart(2, "0"); // Format time (ensure it has seconds) let formattedTime = timeStr; - if (timeStr.split(':').length === 2) { - formattedTime += ':00'; // Add seconds if missing + if (timeStr.split(":").length === 2) { + formattedTime += ":00"; // Add seconds if missing } // Combine into ISO string @@ -96,12 +44,11 @@ function formatLaunchDateTime(dateObj: string | Date, timeStr: string): string { return isoString; } -export const getForecast = async (flightParameters: Record, startDate: string, startTime: string): Promise => { - const launch_datetime = formatLaunchDateTime(startDate, startTime); - +export const getForecast = async ( + flightParameters: Record, +): Promise => { // Create request object flightParameters.dataset = getLatestDataset(); - flightParameters.launch_datetime = launch_datetime; console.log("Sending request:", flightParameters); @@ -109,17 +56,17 @@ export const getForecast = async (flightParameters: Record, startDa // Example POST request - replace with your actual API endpoint const csrfToken = await getCsrfToken(); if (!csrfToken) { - throw new Error('CSRF token not found'); + throw new Error("CSRF token not found"); } - const response = await fetch('http://localhost:8000/api/predictions', { - method: 'POST', + const response = await fetch("http://localhost:8000/api/predictions", { + method: "POST", headers: { - 'Content-Type': 'application/json', - 'X-CSRFToken': csrfToken + "Content-Type": "application/json", + "X-CSRFToken": csrfToken, }, body: JSON.stringify(flightParameters), - credentials: 'include' + credentials: "include", }); if (!response.ok) { @@ -133,7 +80,7 @@ export const getForecast = async (flightParameters: Record, startDa latestPredictionParsed.set(parsePrediction(data.result.prediction)); alert("Forecast request successful!"); - // Handle the response data as needed + // Handle the response data as needed } catch (error) { console.error("Error sending forecast request:", error); alert("Error getting forecast: " + error); diff --git a/src/lib/stores.ts b/src/lib/stores.ts new file mode 100644 index 0000000..4e30cff --- /dev/null +++ b/src/lib/stores.ts @@ -0,0 +1,23 @@ +import { writable } from "svelte/store"; +import type { FlightParameters, Telemetry, ParsedTelemetry } from "./types"; +import type { Prediction, ParsedPrediction } from "./types"; + +export const flightParametersStore = writable({ + ascent_rate: 5.0, + burst_altitude: 30000.0, + dataset: "", + descent_rate: 5.0, + format: "json", + launch_altitude: 0.0, + launch_datetime: "", + launch_latitude: 62.1234, + launch_longitude: 129.1234, + profile: "standard_profile", + version: 2, +}); + +export const latestTelemetry = writable({} as Telemetry); +export const latestTelemetryParsed = writable({} as ParsedTelemetry); + +export const latestPrediction = writable({} as Prediction); +export const latestPredictionParsed = writable({} as ParsedPrediction); diff --git a/src/lib/telemetry.ts b/src/lib/telemetry.ts index fb2e525..906d144 100644 --- a/src/lib/telemetry.ts +++ b/src/lib/telemetry.ts @@ -1,42 +1,7 @@ import { writable } from "svelte/store" -import type { LatLngExpression } from "leaflet"; - import L from "leaflet"; -interface TelemetryPoint { - altitude: number; - datetime: string; - latitude: number; - longitude: number; - payload: string; -} - -interface ParsedTelemetry { - flight_path: [number, number, number][]; - launch: { - latlng: LatLngExpression; - datetime: Date; - }; - datapoints: TelemetryPoint[]; -} - -export const latestTelemetry = writable({ - metadata: { - complete_datetime: "", - start_datetime: "" - }, - telemetry: [ - { - altitude: 0.0, - datetime: "", - latitude: 0.0, - longitude: 0.0, - payload: "" - } - ] -}); - -export const latestTelemetryParsed = writable({} as ParsedTelemetry); +import type { TelemetryPoint, ParsedTelemetry } from "./types"; export function parseTelemetry(telemetry: TelemetryPoint[]): ParsedTelemetry { const flight_path: [number, number, number][] = telemetry.map((point) => [ diff --git a/src/lib/types.ts b/src/lib/types.ts new file mode 100644 index 0000000..fc0f6d4 --- /dev/null +++ b/src/lib/types.ts @@ -0,0 +1,91 @@ +import type { LatLngExpression } from "leaflet"; + +export const PROFILE_MAP = { + Normal: "standard_profile", + Float: "float_profile", + Reverse: "reverse_profile", + Custom: "custom_profile", +}; + +export type ProfileName = keyof typeof PROFILE_MAP; + +export interface FlightParameters { + ascent_rate: number; + burst_altitude: number; + dataset: string; + descent_rate: number; + format: "json"; + launch_altitude: number; + launch_datetime: string; + launch_latitude: number; + launch_longitude: number; + profile: (typeof PROFILE_MAP)[ProfileName]; + version: number; +} + +export interface TelemetryPoint { + altitude: number; + datetime: string; + latitude: number; + longitude: number; + payload: string; +} + +export interface ParsedTelemetry { + flight_path: [number, number, number][]; + launch: { + latlng: LatLngExpression; + datetime: Date; + }; + datapoints: TelemetryPoint[]; +} + +export interface ParsedTelemetryMetadata { + complete_datetime: string; + start_datetime: string; +} + +export interface Telemetry { + metadata: ParsedTelemetryMetadata; + telemetry: TelemetryPoint[]; +} + +export interface TrajectoryPoint { + altitude: number; + datetime: string; + latitude: number; + longitude: number; +} + +export interface PredictionStage { + stage: string; + trajectory: TrajectoryPoint[]; +} + +export interface ParsedPrediction { + flight_path: [number, number, number][]; + launch: { + latlng: LatLngExpression; + datetime: Date; + }; + burst: { + latlng: LatLngExpression; + datetime: Date; + }; + landing: { + latlng: LatLngExpression; + datetime: Date; + }; + profile: string; + flight_time: number; +} + +export interface ParsedPredictionMetadata { + complete_datetime: string; + start_datetime: string; +} + +export interface Prediction { + metadata: ParsedPredictionMetadata; + prediction: PredictionStage[]; +} \ No newline at end of file diff --git a/src/routes/ControlPanel.svelte b/src/routes/ControlPanel.svelte index b4adb66..3e08f65 100644 --- a/src/routes/ControlPanel.svelte +++ b/src/routes/ControlPanel.svelte @@ -1,170 +1,270 @@ - -
-
-
Параметры прогнозирования
- -
+ {#if !isCollapsed} -
-
- -
- + {#each Object.keys(PROFILE_MAP) as profileName} + + {/each} + + + + + + + + + - - -
-
+ + + -
- -
- - / - - -
-
+ + + + + / + + + + -
- -
+ + + -
- - + + + + + +
+ + + + + + + +
-
- - -
-
- - -
+ + + + + + + +
-
-
- - -
-
- - -
-
- -
- - -
- -
- -
- - -
-
+ + + +
- - - + + +
-
+ {/if} -
- - + diff --git a/src/routes/map.svelte b/src/routes/map.svelte index f2c756b..af0222b 100644 --- a/src/routes/map.svelte +++ b/src/routes/map.svelte @@ -1,239 +1,173 @@ -
-
+
-

Lat: {mouseLat}, Lon: {mouseLng}

+

+ Lat: + {mouseLat.toFixed(6)}, + Lon: + {mouseLng.toFixed(6)} +

- +
-
-
- {#if map} - - {/if} + {#if map} + + {/if}
\ No newline at end of file + diff --git a/src/routes/predict/+page.svelte b/src/routes/predict/+page.svelte index 28445e4..9ea74b4 100644 --- a/src/routes/predict/+page.svelte +++ b/src/routes/predict/+page.svelte @@ -1,26 +1,26 @@ -
- - +
\ No newline at end of file diff --git a/src/routes/track/+page.svelte b/src/routes/track/+page.svelte index 29a0867..d056932 100644 --- a/src/routes/track/+page.svelte +++ b/src/routes/track/+page.svelte @@ -1,5 +1,5 @@