2026-04-01 00:03:49 +02:00

93 lines
5.7 KiB
TypeScript

import { getPlanetByName, Kerbol } from "./calculations/constants";
import { DefaultShipParameters } from "./calculations/orbit-calculations";
import { createLabel, createRadioButton, DefaultLandingParameters, DefaultOrbitalParameters, encodeJsonObject, getDecoderFunction } from "./gui/common";
import { decodeTargetOrbitChoice, InterceptTargetGui } from "./gui/intercept";
import { DefaultInterpolationParameters } from "./gui/interpolate";
import { LandingGui } from "./gui/landing";
import { OrbitalParametersGui } from "./gui/orbit";
import { PlanetGui } from "./gui/planet";
import { SimplePlaneChangeGui } from "./gui/simpleplanechange";
import { TargetOrbitGui } from "./gui/targetorbit";
import { TimeGui } from "./gui/time";
import { ChangingStorageValue } from "./storage";
type CalculationType = "planeChange" | "targetOrbit" | "intercept" | "landing";
function decodeCalculationType(input: string): CalculationType {
let calculationType = input as CalculationType;
if (calculationType !== undefined) {
return calculationType;
}
return "planeChange";
}
let currentTime = new ChangingStorageValue(0, "currentTime", parseInt, n => n.toString());
let body = new ChangingStorageValue(Kerbol, "planet", s => getPlanetByName(s), p => p.planetName);
let orbitalParameters = new ChangingStorageValue(DefaultOrbitalParameters, "orbitalParameters", getDecoderFunction(DefaultOrbitalParameters), encodeJsonObject);
let calculationType = new ChangingStorageValue("planeChange", "calculationType", decodeCalculationType, s => s);
let targetOrbitalParameters = new ChangingStorageValue(DefaultOrbitalParameters, "targetOrbitalParameters", getDecoderFunction(DefaultOrbitalParameters), encodeJsonObject);
let circularizeOrbit = new ChangingStorageValue(false, "circularizeOrbit", s => s == "true", b => b ? "true" : "false");
let targetOrbitChoice = new ChangingStorageValue("KnownOrbit", "targetOrbitChoice", decodeTargetOrbitChoice, s => s);
let interpolationParameters = new ChangingStorageValue(DefaultInterpolationParameters, "InterpolationParameters", getDecoderFunction(DefaultInterpolationParameters), encodeJsonObject);
let additionalInterceptTrueanomaly = new ChangingStorageValue(0, "additionalTrueAnomaly", parseFloat, s => s.toString());
let shipParameters = new ChangingStorageValue(DefaultShipParameters, "shipParameters", getDecoderFunction(DefaultShipParameters), encodeJsonObject);
let landingParameters = new ChangingStorageValue(DefaultLandingParameters, "landingParameters", getDecoderFunction(DefaultLandingParameters), encodeJsonObject);
let dateGui = new TimeGui(currentTime, true);
let currentTimeDiv = document.getElementById("currentTimeDiv");
currentTimeDiv?.appendChild(dateGui.parentDiv);
let planetGui = new PlanetGui(body);
let planetsDiv = document.getElementById("planetsDiv");
planetsDiv?.appendChild(planetGui.parentDiv);
let orbitalParametersGui = new OrbitalParametersGui(orbitalParameters);
let orbitalParametersDiv = document.getElementById("orbitalParametersDiv");
orbitalParametersDiv?.appendChild(orbitalParametersGui.parentDiv);
let simplePlaneChangeGui = new SimplePlaneChangeGui(currentTime, body, orbitalParameters, targetOrbitalParameters, circularizeOrbit);
let targetOrbitGui = new TargetOrbitGui(currentTime, body, orbitalParameters, targetOrbitalParameters);
let interceptTargetGui = new InterceptTargetGui(currentTime, body, orbitalParameters, targetOrbitalParameters, additionalInterceptTrueanomaly, targetOrbitChoice, interpolationParameters);
let landingGui = new LandingGui(currentTime, body, orbitalParameters, shipParameters, landingParameters);
let calculationChoiceDiv = document.getElementById("calculationChoice");
let simplePlaneChangeButton = createRadioButton("calculationChoice", "simplePlaneChange");
simplePlaneChangeButton.addEventListener("change", () => calculationType.set("planeChange", "main"));
let simplePlaneChangeLabel = createLabel("simplePlaneChange", "Simple plane change");
[simplePlaneChangeButton, simplePlaneChangeLabel].forEach(child => calculationChoiceDiv?.appendChild(child));
let targetOrbitButton = createRadioButton("calculationChoice", "targetOrbit");
targetOrbitButton.addEventListener("change", () => calculationType.set("targetOrbit", "main"));
let targetOrbitLabel = createLabel("targetOrbit", "Target orbit");
[targetOrbitButton, targetOrbitLabel].forEach(child => calculationChoiceDiv?.appendChild(child));
let interceptTargetButton = createRadioButton("calculationChoice", "interceptTarget");
interceptTargetButton.addEventListener("change", () => calculationType.set("intercept", "main"));
let interceptTargetLabel = createLabel("interceptTarget", "Intercept target");
[interceptTargetButton, interceptTargetLabel].forEach(child => calculationChoiceDiv?.appendChild(child));
let landingButton = createRadioButton("calculationChoice", "landing");
landingButton.addEventListener("change", () => calculationType.set("landing", "main"));
let landingLabel = createLabel("landing", "Landing");
[landingButton, landingLabel].forEach(child => calculationChoiceDiv?.appendChild(child));
let calculationsDiv = document.getElementById("calculation") as HTMLDivElement;
calculationType.listenToValue((_, value) => {
calculationsDiv.innerHTML = "";
if (value == "planeChange") {
simplePlaneChangeButton.setAttribute("checked", "");
calculationsDiv.appendChild(simplePlaneChangeGui.parentDiv);
} else if (value == "targetOrbit") {
targetOrbitButton.setAttribute("checked", "");
calculationsDiv.appendChild(targetOrbitGui.parentDiv);
} else if (value == "intercept") {
interceptTargetButton.setAttribute("checked", "");
calculationsDiv.appendChild(interceptTargetGui.parentDiv);
} else if (value == "landing") {
landingButton.setAttribute("checked", "");
calculationsDiv.appendChild(landingGui.parentDiv);
}
});