Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 5
0
 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);
 }
Ejemplo n.º 6
0
 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);
 }
Ejemplo n.º 7
0
        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;
            }
        }
Ejemplo n.º 8
0
        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;
            }
        }
Ejemplo n.º 9
0
        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;
            }
        }
Ejemplo n.º 14
0
 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;
     }
Ejemplo n.º 15
0
        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;
            }
        }
Ejemplo n.º 16
0
        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;
            }
        }
Ejemplo n.º 17
0
        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;
            }
        }
Ejemplo n.º 18
0
        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;
            }
        }
Ejemplo n.º 19
0
        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;
            }
        }
Ejemplo n.º 20
0
        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;
            }
        }
Ejemplo n.º 21
0
		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;
            }
        }
Ejemplo n.º 23
0
        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;
            }
        }
Ejemplo n.º 24
0
        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;
            }
        }
Ejemplo n.º 25
0
        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;
            }
        }