public void CruiseControlCallback(Multiplexer.Command cmd) { UpdateTimer.Reset(); switch (cmd) { case Multiplexer.Command.Resume: RegisterTo <SASBlocker>(); NeedCPSWhenMooving(); break; case Multiplexer.Command.On: var nV = VSL.HorizontalSpeed.Absolute; if (nV > PointNavigator.C.MaxSpeed) { nV = PointNavigator.C.MaxSpeed; } var nVdir = nV > C.MaxIdleSpeed? (Vector3)VSL.HorizontalSpeed.Vector.normalized : VSL.OnPlanetParams.Fwd; CFG.BR.OnIfNot(BearingMode.User); BRC.UpdateBearing((float)VSL.Physics.Bearing(nVdir)); VSL.HorizontalSpeed.SetNeeded(nVdir * nV); CFG.MaxNavSpeed = needed_velocity = nV; goto case Multiplexer.Command.Resume; case Multiplexer.Command.Off: VSL.HorizontalSpeed.SetNeeded(Vector3d.zero); UnregisterFrom <SASBlocker>(); ReleaseCPS(); CFG.BR.OffIfOn(BearingMode.User); break; } }
public void ControlCallback(Multiplexer.Command cmd) { translation_pid.Reset(); needed_thrust_pid.Reset(); switch (cmd) { case Multiplexer.Command.Resume: RegisterTo <SASBlocker>(); NeedCPSWhenMooving(); break; case Multiplexer.Command.On: VSL.UpdateOnPlanetStats(); if (CFG.HF[HFlight.Stop]) { VSL.HorizontalSpeed.SetNeeded(Vector3d.zero); CFG.Nav.Off(); //any kind of navigation conflicts with the Stop program; obviously. } else if (CFG.HF[HFlight.NoseOnCourse]) { CFG.BR.OnIfNot(BearingMode.Auto); } CFG.AT.OnIfNot(Attitude.Custom); goto case Multiplexer.Command.Resume; case Multiplexer.Command.Off: UnregisterFrom <SASBlocker>(); ReleaseCPS(); CFG.AT.OffIfOn(Attitude.Custom); CFG.BR.OffIfOn(BearingMode.Auto); EnableManualThrust(false); break; } }
public void ManeuverCallback(Multiplexer.Command cmd) { switch (cmd) { case Multiplexer.Command.Resume: case Multiplexer.Command.On: ManeuverStage = Stage.WAITING; if (!TCAScenario.HavePatchedConics) { Status("yellow", "WARNING: maneuver nodes are not yet available. Upgrade the Tracking Station."); CFG.AP1.Off(); return; } if (!VSL.HasManeuverNode) { CFG.AP1.Off(); return; } VSL.Controls.StopWarp(); CFG.AT.On(Attitude.ManeuverNode); update_maneuver_node(); THR.Throttle = 0; CFG.DisableVSC(); break; case Multiplexer.Command.Off: VSL.Controls.StopWarp(); if (!CFG.WarpToNode && TimeWarp.CurrentRateIndex > 0) { TimeWarp.SetRate(0, false); } CFG.AT.On(Attitude.KillRotation); Reset(); break; } }
public void RendezvousCallback(Multiplexer.Command cmd) { switch (cmd) { case Multiplexer.Command.Resume: if (!check_patched_conics()) { CFG.AP2.Off(); break; } UseTarget(); NeedRadarWhenMooving(); switch (stage) { case Stage.None: case Stage.ComputeRendezvou: stage = Stage.Start; break; case Stage.Launch: if (VSL.LandedOrSplashed) { stage = Stage.Start; } else { resume_to_orbit(); } break; case Stage.ToOrbit: resume_to_orbit(); break; } if (VSL.HasManeuverNode) { CFG.AP1.OnIfNot(Autopilot1.Maneuver); } break; case Multiplexer.Command.On: reset(); if (setup()) { goto case Multiplexer.Command.Resume; } CFG.AP2.Off(); break; case Multiplexer.Command.Off: CFG.AT.On(Attitude.KillRotation); UnregisterFrom <Radar>(); StopUsingTarget(); reset(); break; } }
public void AnchorHereCallback(Multiplexer.Command cmd) { if (cmd == Multiplexer.Command.On) { CFG.Anchor = new WayPoint(VSL.Body.GetLatitude(VSL.Physics.wCoM), VSL.Body.GetLongitude(VSL.Physics.wCoM)); } AnchorCallback(cmd); }
public void AnchorHereCallback(Multiplexer.Command cmd) { if (cmd == Multiplexer.Command.On) { CFG.Anchor = new WayPoint(VSL.Physics.wCoM, VSL.Body); CFG.Anchor.Movable = true; } AnchorCallback(cmd); }
public void RendezvousCallback(Multiplexer.Command cmd) { switch (cmd) { case Multiplexer.Command.Resume: // LogFST("Resuming: stage {}", stage);//debug if (!check_patched_conics()) { return; } NeedRadarWhenMooving(); switch (stage) { case Stage.None: case Stage.ComputeRendezvou: stage = Stage.Start; break; case Stage.Launch: if (VSL.LandedOrSplashed) { stage = Stage.Start; } else { resume_to_orbit(); } break; case Stage.ToOrbit: resume_to_orbit(); break; } if (VSL.HasManeuverNode) { CFG.AP1.OnIfNot(Autopilot1.Maneuver); } break; case Multiplexer.Command.On: reset(); if (setup()) { stage = Stage.Start; goto case Multiplexer.Command.Resume; } CFG.AP2.Off(); return; case Multiplexer.Command.Off: UnregisterFrom <Radar>(); SetTarget(); reset(); break; } }
public void DeorbitCallback(Multiplexer.Command cmd) { switch (cmd) { case Multiplexer.Command.Resume: if (stage == Stage.None && !landing) { goto case Multiplexer.Command.On; } if (!check_patched_conics()) { return; } UseTarget(); NeedCPSWhenMooving(); if (trajectory == null) { update_trajectory(); } if (VSL.HasManeuverNode) { CFG.AP1.OnIfNot(Autopilot1.Maneuver); } break; case Multiplexer.Command.On: Reset(); if (!check_patched_conics()) { return; } if (!setup()) { Disable(); return; } UseTarget(); NeedCPSWhenMooving(); if (VesselOrbit.PeR < Body.Radius) { Status("red", "Already deorbiting. Trying to correct course and land."); fine_tune_approach(); } else { compute_initial_eccentricity(); } break; case Multiplexer.Command.Off: ReleaseCPS(); StopUsingTarget(); Reset(); break; } }
public void ToOrbitCallback(Multiplexer.Command cmd) { switch (cmd) { case Multiplexer.Command.Resume: if (!check_patched_conics()) { return; } ToOrbit = new ToOrbitExecutor(TCA); ToOrbit.CorrectOnlyAltitude = true; ToOrbit.Target = Target; break; case Multiplexer.Command.On: Reset(); if (!check_patched_conics()) { return; } Vector3d hVdir; if (TargetOrbit.Inclination.Range > 1e-5f) { var angle = Utils.Clamp((TargetOrbit.Inclination.Value - TargetOrbit.Inclination.Min) / TargetOrbit.Inclination.Range * 180, 0, 180); if (TargetOrbit.DescendingNode) { angle = -angle; } hVdir = QuaternionD.AngleAxis(angle, VesselOrbit.pos) * Vector3d.Cross(Vector3d.forward, VesselOrbit.pos).normalized; } else { hVdir = Vector3d.Cross(VesselOrbit.pos, Body.orbit.vel).normalized; } if (TargetOrbit.RetrogradeOrbit) { hVdir *= -1; } var ApR0 = Utils.ClampH(ApR, MinPeR + ORB.RadiusOffset); var ascO = AscendingOrbit(ApR0, hVdir, Mathf.Lerp(ORB.MinSlope, ORB.MaxSlope, TargetOrbit.Slope.Value / 100)); Target = ascO.getRelativePositionAtUT(VSL.Physics.UT + ascO.timeToAp); stage = Stage.Start; goto case Multiplexer.Command.Resume; case Multiplexer.Command.Off: Reset(); break; } }
public void VTOLCallback(Multiplexer.Command cmd) { switch (cmd) { case Multiplexer.Command.Resume: RegisterTo <SASBlocker>(vsl => vsl.OnPlanet); break; case Multiplexer.Command.On: goto case Multiplexer.Command.Resume; case Multiplexer.Command.Off: UnregisterFrom <SASBlocker>(); break; } }
public void ToOrbitCallback(Multiplexer.Command cmd) { switch (cmd) { case Multiplexer.Command.Resume: if (!check_patched_conics()) { return; } ToOrbit.CorrectOnlyAltitude = true; break; case Multiplexer.Command.On: Reset(); if (!check_patched_conics()) { return; } Vector3d hVdir; if (TargetOrbit.Inclination.Range > 1e-5f) { var angle = Utils.Clamp((TargetOrbit.Inclination.Value - TargetOrbit.Inclination.Min) / TargetOrbit.Inclination.Range * 180, 0, 180); if (TargetOrbit.DescendingNode) { angle = -angle; } hVdir = QuaternionD.AngleAxis(angle, VesselOrbit.pos) * Vector3d.Cross(VesselOrbit.pos, Body.zUpAngularVelocity).normalized; } else { hVdir = Vector3d.Cross(VesselOrbit.pos, Body.orbit.vel).normalized; } if (TargetOrbit.RetrogradeOrbit) { hVdir *= -1; } var ApR0 = Utils.ClampH(ApR, ToOrbit.MaxApR); var ascO = AscendingOrbit(ApR0, hVdir, C.LaunchSlope); ToOrbit.Target = ascO.getRelativePositionAtUT(VSL.Physics.UT + ascO.timeToAp); stage = Stage.Start; goto case Multiplexer.Command.Resume; case Multiplexer.Command.Off: Reset(); break; } }
public void MatchVelCallback(Multiplexer.Command cmd) { switch (cmd) { case Multiplexer.Command.Resume: case Multiplexer.Command.On: Working = false; THR.Throttle = 0; Target = VSL.TargetVessel; CFG.AT.On(Attitude.KillRotation); break; case Multiplexer.Command.Off: CFG.AT.On(Attitude.KillRotation); reset(); break; } }
public void Enable(Multiplexer.Command cmd) { reset(); switch (cmd) { case Multiplexer.Command.Resume: VSL.Controls.StopWarp(); RegisterTo <SASBlocker>(); break; case Multiplexer.Command.On: VSL.UpdateOnPlanetStats(); goto case Multiplexer.Command.Resume; case Multiplexer.Command.Off: UnregisterFrom <SASBlocker>(); break; } }
public void AnchorHereCallback(Multiplexer.Command cmd) { if (cmd == Multiplexer.Command.On) { CFG.Anchor = new WayPoint(VSL.Physics.wCoM, VSL.Body); if (Physics.Raycast(VSL.Physics.wCoM, -VSL.Physics.Up, out var raycast, (float)VSL.Body.Radius, raycastMask)) { CFG.Anchor.Pos.Alt = VSL.Body.GetAltitude(raycast.point); } else { CFG.Anchor.Pos.SetAlt2Surface(VSL.Body); } CFG.Anchor.Movable = true; }
public void BallisticJumpCallback(Multiplexer.Command cmd) { switch (cmd) { case Multiplexer.Command.Resume: if (!check_patched_conics()) { return; } UseTarget(); NeedCPSWhenMooving(); if (VSL.HasManeuverNode) { CFG.AP1.OnIfNot(Autopilot1.Maneuver); } if (stage == Stage.None && !landing) { stage = Stage.Start; } else if (stage == Stage.Accelerate && trajectory == null) { compute_initial_trajectory(); } break; case Multiplexer.Command.On: Reset(); if (setup()) { SaveGame("before_jump"); goto case Multiplexer.Command.Resume; } Disable(); return; case Multiplexer.Command.Off: ReleaseCPS(); SetTarget(); Reset(); break; } }
public void ControlCallback(Multiplexer.Command cmd) { Reset(); switch (cmd) { case Multiplexer.Command.Resume: case Multiplexer.Command.On: RegisterTo <SASBlocker>(); NeedCPSWhenMooving(); ForwardDirection = VSL.OnPlanetParams.Fwd; Bearing.Value = (float)VSL.Physics.Bearing(ForwardDirection); break; case Multiplexer.Command.Off: DirectionOverride = Vector3d.zero; UnregisterFrom <SASBlocker>(); UnregisterFrom <Radar>(); break; } }
public void MatchVelCallback(Multiplexer.Command cmd) { switch (cmd) { case Multiplexer.Command.Resume: case Multiplexer.Command.On: Working = false; THR.Throttle = 0; stage = Stage.Start; SetTarget(VSL.TargetAsWP); CFG.AT.On(Attitude.KillRotation); break; case Multiplexer.Command.Off: CFG.AT.On(Attitude.KillRotation); StopUsingTarget(); Reset(); break; } }
public void FollowPathCallback(Multiplexer.Command cmd) { switch (cmd) { case Multiplexer.Command.Resume: case Multiplexer.Command.On: if (CFG.Path.Count > 0) { start_to(CFG.Path.Peek()); } else { finish(); } break; case Multiplexer.Command.Off: finish(); break; } }
public void BallisticJumpCallback(Multiplexer.Command cmd) { switch (cmd) { case Multiplexer.Command.Resume: // LogFST("Resuming: stage {}, landing_stage {}, landing {}", stage, landing_stage, landing);//debug if (!check_patched_conics()) { return; } UseTarget(); NeedRadarWhenMooving(); if (VSL.HasManeuverNode) { CFG.AP1.OnIfNot(Autopilot1.Maneuver); } if (stage == Stage.None && !landing) { stage = Stage.Start; } break; case Multiplexer.Command.On: reset(); if (setup()) { SaveGame("before_jump"); goto case Multiplexer.Command.Resume; } CFG.AP2.Off(); return; case Multiplexer.Command.Off: UnregisterFrom <Radar>(); SetTarget(); reset(); break; } }
public void AnchorCallback(Multiplexer.Command cmd) { pid.Reset(); switch (cmd) { case Multiplexer.Command.Resume: RegisterTo <SASBlocker>(); break; case Multiplexer.Command.On: if (CFG.Anchor == null) { return; } goto case Multiplexer.Command.Resume; case Multiplexer.Command.Off: UnregisterFrom <SASBlocker>(); CFG.Anchor = null; break; } }
public void DeorbitCallback(Multiplexer.Command cmd) { switch(cmd) { case Multiplexer.Command.Resume: if(!check_patched_conics()) return; UseTarget(); NeedRadarWhenMooving(); if(trajectory == null) update_trajectory(); if(stage == Stage.None && !landing) goto case Multiplexer.Command.On; if(VSL.HasManeuverNode) CFG.AP1.OnIfNot(Autopilot1.Maneuver); break; case Multiplexer.Command.On: reset(); if(!check_patched_conics()) return; if(!setup()) { CFG.AP2.Off(); return; } if(VesselOrbit.PeR < Body.Radius) { Status("red", "Already deorbiting. Trying to correct course and land."); fine_tune_approach(); } else { eccentricity_calculator = compute_initial_eccentricity(); stage = Stage.Precalculate; } goto case Multiplexer.Command.Resume; case Multiplexer.Command.Off: UnregisterFrom<Radar>(); StopUsingTarget(); reset(); break; } }
public void AltitudeControlCallback(Multiplexer.Command cmd) { Falling.Reset(); switch (cmd) { case Multiplexer.Command.Resume: NeedCPSWhenMooving(); break; case Multiplexer.Command.On: VSL.Altitude.Update(); CFG.DesiredAltitude = VSL.LandedOrSplashed? -10f : VSL.Altitude.Relative; if (!CFG.AltitudeAboveTerrain) { CFG.DesiredAltitude += VSL.Altitude.TerrainAltitude; } goto case Multiplexer.Command.Resume; case Multiplexer.Command.Off: ReleaseCPS(); break; } }
public void Enable(Multiplexer.Command cmd) { Reset(); switch (cmd) { case Multiplexer.Command.Resume: if (CFG.AT.Any(Attitude.AntiRelVel, Attitude.RelVel, Attitude.Target, Attitude.TargetCorrected, Attitude.AntiTarget)) { SetTarget(VSL.TargetAsWP); } RegisterTo <SASBlocker>(); break; case Multiplexer.Command.On: goto case Multiplexer.Command.Resume; case Multiplexer.Command.Off: StopUsingTarget(); UnregisterFrom <SASBlocker>(); break; } }
public void LandCallback(Multiplexer.Command cmd) { stage = Stage.None; scanner = null; NextNode = null; FlattestNodeTired = null; Nodes = null; StopTimer.Reset(); CutoffTimer.Reset(); switch (cmd) { case Multiplexer.Command.On: case Multiplexer.Command.Resume: if (VSL.LandedOrSplashed) { CFG.AP1.Off(); break; } CFG.HF.On(HFlight.Stop); set_initial_altitude(); UseTarget(); TriedNodes = new HashSet <SurfaceNode>(new SurfaceNode.Comparer((VSL.Geometry.R * Mathf.Rad2Deg / VSL.Body.Radius))); break; case Multiplexer.Command.Off: if (!VSL.LandedOrSplashed) { CFG.VF.On(VFlight.AltitudeControl); CFG.DesiredAltitude = VSL.Altitude; } StartNode = null; ClearStatus(); SetTarget(); break; } }
public void DeorbitCallback(Multiplexer.Command cmd) { switch (cmd) { case Multiplexer.Command.Resume: // Utils.Log("Resuming: stage {}, landing_stage {}, landing {}", stage, landing_stage, landing);//debug if (!check_patched_conics()) { return; } NeedRadarWhenMooving(); if (stage == Stage.None && !landing) { goto case Multiplexer.Command.On; } else if (VSL.HasManeuverNode) { CFG.AP1.OnIfNot(Autopilot1.Maneuver); } break; case Multiplexer.Command.On: reset(); if (!check_patched_conics()) { return; } if (!setup()) { CFG.AP2.Off(); return; } if (VesselOrbit.PeR < Body.Radius) { Status("red", "Already deorbiting. Trying to correct course and land."); fine_tune_approach(); } else { // Log("Calculating initial orbit eccentricity...");//debug var tPos = CFG.Target.RelOrbPos(Body); var UT = VSL.Physics.UT + AngleDelta(VesselOrbit, tPos, VSL.Physics.UT) / 360 * VesselOrbit.period; var vPos = VesselOrbit.getRelativePositionAtUT(UT); var dir = Vector3d.Exclude(vPos, tPos - vPos); var ini_orb = CircularOrbit(dir, UT); var ini_dV = ini_orb.getOrbitalVelocityAtUT(UT) - VesselOrbit.getOrbitalVelocityAtUT(UT) + dV4Pe(ini_orb, Body.Radius * 0.9, UT); var trj = new LandingTrajectory(VSL, ini_dV, UT, CFG.Target, TargetAltitude); var dV = 10.0; dir = -dir.normalized; while (trj.Orbit.eccentricity < DEO.StartEcc) { // Log("\ndV: {}m/s\nini trj:\n{}", dV, trj);//debug if (trj.DeltaR > 0) { break; } trj = new LandingTrajectory(VSL, ini_dV + dir * dV, UT, CFG.Target, trj.TargetAltitude); dV += 10; } if (trj.Orbit.eccentricity > DEO.StartEcc) { currentEcc = DEO.StartEcc; if (Body.atmosphere) { currentEcc = Utils.ClampH(currentEcc * (2.1 - Utils.ClampH(VSL.Torque.MaxPossible.AngularDragResistance / Body.atmDensityASL * DEO.AngularDragF, 1)), DEO.MaxEcc); } } else { currentEcc = Utils.ClampL(trj.Orbit.eccentricity - DEO.dEcc, DEO.dEcc); } // Log("currentEcc: {}, dEcc {}", currentEcc, DEO.dEcc);//debug if (Globals.Instance.AutosaveBeforeLanding) { Utils.SaveGame(VSL.vessel.vesselName.Replace(" ", "_") + "-before_landing"); } compute_landing_trajectory(); } goto case Multiplexer.Command.Resume; case Multiplexer.Command.Off: UnregisterFrom <Radar>(); reset(); break; } }