Пример #1
0
        public void CruiseControlCallback(Multiplexer.Command cmd)
        {
            UpdateTimer.Reset();
            switch (cmd)
            {
            case Multiplexer.Command.Resume:
                RegisterTo <SASBlocker>();
                NeedCPSWhenMooving();
                break;

            case Multiplexer.Command.On:
                VSL.UpdateOnPlanetStats();
                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;
            }
        }
Пример #2
0
        public void CruiseControlCallback(Multiplexer.Command cmd)
        {
            UpdateTimer.Reset();
            switch (cmd)
            {
            case Multiplexer.Command.Resume:
                RegisterTo <SASBlocker>();
                NeedRadarWhenMooving();
                break;

            case Multiplexer.Command.On:
                VSL.UpdateOnPlanetStats();
                var nV = VSL.HorizontalSpeed.Absolute;
                if (nV < CC.MaxRevSpeed)
                {
                    nV = CC.MaxRevSpeed;
                }
                else if (nV > GLB.PN.MaxSpeed)
                {
                    nV = GLB.PN.MaxSpeed;
                }
                VSL.HorizontalSpeed.SetNeeded(VSL.HorizontalSpeed.Vector.normalized * nV);
                CFG.MaxNavSpeed = needed_velocity = nV;
                CFG.BR.OnIfNot(BearingMode.User);
                BRC.UpdateBearing((float)VSL.Physics.Bearing(VSL.HorizontalSpeed.Vector));
                goto case Multiplexer.Command.Resume;

            case Multiplexer.Command.Off:
                VSL.HorizontalSpeed.SetNeeded(Vector3d.zero);
                UnregisterFrom <SASBlocker>();
                UnregisterFrom <Radar>();
                CFG.BR.OffIfOn(BearingMode.User);
                break;
            }
        }
        public void ControlCallback(Multiplexer.Command cmd)
        {
            translation_pid.Reset();
            switch (cmd)
            {
            case Multiplexer.Command.Resume:
                RegisterTo <SASBlocker>();
                NeedRadarWhenMooving();
                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>();
                UnregisterFrom <Radar>();
                CFG.AT.OffIfOn(Attitude.Custom);
                CFG.BR.OffIfOn(BearingMode.Auto);
                EnableManualTranslation(false);
                break;
            }
        }
Пример #4
0
 void start_to(WayPoint wp)
 {
     VSL.UpdateOnPlanetStats();
     wp.Update(VSL);
     if (CFG.Nav[Navigation.GoToTarget] && wp.CloseEnough(VSL))
     {
         CFG.Nav.Off();
         return;
     }
     if (VSL.LandedOrSplashed)
     {
         CFG.AltitudeAboveTerrain = true;
         CFG.VF.OnIfNot(VFlight.AltitudeControl);
         CFG.DesiredAltitude = PN.TakeoffAltitude + VSL.Geometry.H;
     }
     else if (CFG.VTOLAssistON)
     {
         VSL.GearOn(false);
     }
     reset_formation();
     SetTarget(wp);
     DistancePID.Reset();
     LateralPID.Reset();
     CFG.HF.OnIfNot(HFlight.NoseOnCourse);
     RegisterTo <Radar>();
 }
 public void FixedUpdate()
 {
     if (VSL == null)
     {
         return;
     }
     //initialize systems
     VSL.UpdateState();
     State = TCAState.Disabled;
     if (!CFG.Enabled)
     {
         return;
     }
     State = TCAState.Enabled;
     if (!VSL.Info.ElectricChargeAvailible)
     {
         return;
     }
     SetState(TCAState.HaveEC);
     ClearFrameState();
     //update VSL
     VSL.UpdatePhysics();
     if (VSL.Engines.Check())
     {
         SetState(TCAState.HaveActiveEngines);
     }
     Actions["onActionUpdate"].actionGroup = VSL.Engines.ActionGroups;
     VSL.UpdateCommons();
     VSL.UpdateOnPlanetStats();
     //update modules
     ModulePipeline.ForEach(m => m.OnFixedUpdate());
     //handle engines
     VSL.Engines.Tune();
     if (VSL.Engines.NumActive > 0)
     {
         //:preset manual limits for translation if needed
         if (VSL.Controls.ManualTranslationSwitch.On)
         {
             ENG.PresetLimitsForTranslation(VSL.Engines.Manual, VSL.Controls.ManualTranslation);
             if (CFG.VSCIsActive)
             {
                 ENG.LimitInDirection(VSL.Engines.Manual, VSL.Physics.UpL);
             }
         }
         //:balance-only engines
         if (VSL.Engines.Balanced.Count > 0)
         {
             VSL.Torque.UpdateImbalance(VSL.Engines.Manual, VSL.Engines.UnBalanced);
             ENG.OptimizeLimitsForTorque(VSL.Engines.Balanced, Vector3.zero);
         }
         VSL.Torque.UpdateImbalance(VSL.Engines.Manual, VSL.Engines.UnBalanced, VSL.Engines.Balanced);
         //:optimize limits for steering
         ENG.PresetLimitsForTranslation(VSL.Engines.Maneuver, VSL.Controls.Translation);
         ENG.Steer();
     }
     RCS.Steer();
     VSL.Engines.SetControls();
 }
Пример #6
0
        public void VTOLCallback(Multiplexer.Command cmd)
        {
            switch (cmd)
            {
            case Multiplexer.Command.Resume:
                RegisterTo <SASBlocker>(vsl => vsl.OnPlanet);
                break;

            case Multiplexer.Command.On:
                VSL.UpdateOnPlanetStats();
                goto case Multiplexer.Command.Resume;

            case Multiplexer.Command.Off:
                UnregisterFrom <SASBlocker>();
                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;
            }
        }
Пример #8
0
 public void OnPreAutopilotUpdate(FlightCtrlState s)
 {
     if (!Valid)
     {
         return;
     }
     //initialize systems
     VSL.PreUpdateState(s);
     State = TCAState.Disabled;
     if (CFG.Enabled)
     {
         State             = TCAState.Enabled;
         localControlState = VesselControlState.None;
         if (!VSL.Info.ElectricChargeAvailible)
         {
             if (VSL.Controls.WarpToTime > 0)
             {
                 VSL.Controls.AbortWarp();
             }
             return;
         }
         localControlState = VesselControlState.ProbePartial;
         SetState(TCAState.HaveEC);
         ClearFrameState();
         //update VSL
         VSL.UpdatePhysics();
         if (VSL.Engines.Check())
         {
             SetState(TCAState.HaveActiveEngines);
         }
         Actions["onActionUpdate"].actionGroup = VSL.Engines.ActionGroups;
         VSL.UpdateCommons();
         VSL.UpdateOnPlanetStats();
         //update modules
         ModulePipeline.ForEach(m => m.OnFixedUpdate());
         VSL.OnModulesUpdated();
     }
 }
Пример #9
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;
                }
                VSL.UpdateOnPlanetStats();
                goto case Multiplexer.Command.Resume;

            case Multiplexer.Command.Off:
                UnregisterFrom <SASBlocker>();
                CFG.Anchor = null;
                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:
                VSL.UpdateOnPlanetStats();
                goto case Multiplexer.Command.Resume;

            case Multiplexer.Command.Off:
                StopUsingTarget();
                UnregisterFrom <SASBlocker>();
                break;
            }
        }
 public void FixedUpdate()
 {
     if (VSL == null)
     {
         return;
     }
     //initialize systems
     VSL.UpdateState();
     State = TCAState.Disabled;
     if (!CFG.Enabled)
     {
         return;
     }
     State             = TCAState.Enabled;
     localControlState = VesselControlState.None;
     if (!VSL.Info.ElectricChargeAvailible)
     {
         if (VSL.Controls.WarpToTime > 0)
         {
             VSL.Controls.AbortWarp();
         }
         return;
     }
     localControlState = VesselControlState.ProbePartial;
     SetState(TCAState.HaveEC);
     ClearFrameState();
     //update VSL
     VSL.UpdatePhysics();
     if (VSL.Engines.Check())
     {
         SetState(TCAState.HaveActiveEngines);
     }
     Actions["onActionUpdate"].actionGroup = VSL.Engines.ActionGroups;
     VSL.UpdateCommons();
     VSL.UpdateOnPlanetStats();
     //update modules
     ModulePipeline.ForEach(m => m.OnFixedUpdate());
     VSL.OnModulesUpdated();
     //handle engines
     VSL.Engines.Tune();
     if (VSL.Engines.NumActive > 0)
     {
         //:preset manual limits for translation if needed
         if (VSL.Controls.ManualTranslationSwitch.On)
         {
             ENG.PresetLimitsForTranslation(VSL.Engines.Active.Manual, VSL.Controls.ManualTranslation);
             if (CFG.VSCIsActive)
             {
                 ENG.LimitInDirection(VSL.Engines.Active.Manual, VSL.Physics.UpL);
             }
         }
         //:optimize limits for steering
         ENG.PresetLimitsForTranslation(VSL.Engines.Active.Maneuver, VSL.Controls.Translation);
         ENG.Steer();
     }
     RCS.Steer();
     VSL.Engines.SetControls();
     VSL.FinalUpdate();
     #if DEBUG
     TEST.OnFixedUpdate();
     #endif
 }