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); } });