93 lines
5.7 KiB
TypeScript
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);
|
|
}
|
|
});
|
|
|