void start_to(WayPoint wp) { 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 = C.TakeoffAltitude + VSL.Geometry.H; } else if (CFG.VTOLAssistON) { VSL.GearOn(false); } max_speed.Set(CFG.MaxNavSpeed); reset_formation(); SetTarget(wp); DistancePID.Reset(); LateralPID.Reset(); CorrectionPID.Reset(); CFG.HF.OnIfNot(HFlight.NoseOnCourse); NeedCPS(); }
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 ToOrbitExecutor(ModuleTCA tca) : base(tca) { InitModuleFields(); Executor = new ManeuverExecutor(tca); GearAction.action = () => VSL.GearOn(false); ErrorThreshold.Lower = 2 * GLB.ORB.Dtol; ErrorThreshold.Upper = 4 * GLB.ORB.Dtol; GravityTurnStart = 0; }
public virtual void AttachTCA(ModuleTCA tca) { if (TCA == null) { TCA = tca; InitModuleFields(); GearAction.action = () => VSL.GearOn(false); TimeToApA.Value = Mathf.Max(TimeToApA, VSL.Torque.MaxCurrent.TurnTime); } }
protected override void Update() { //update state if (was_landed && !VSL.LandedOrSplashed) { stage = Stage.JustTookoff; GearTimer.Reset(); StopAction.Reset(); } else if (VSL.LandedOrSplashed && !was_landed) { stage = Stage.JustLanded1; } was_landed = VSL.LandedOrSplashed; switch (stage) { case Stage.JustLanded1: working(); srf_normal = Vector3.zero; CFG.HF.OnIfNot(HFlight.Level); VSL.BrakesOn(); LandedTimer.RunIf(() => stage = Stage.JustLanded2, VSL.HorizontalSpeed < C.MinHSpeed); break; case Stage.JustLanded2: if (ATC != null) { if (srf_normal.IsZero()) { RaycastHit hit; if (Physics.Raycast(VSL.Physics.wCoM, -VSL.Physics.Up, out hit, VSL.Geometry.D, Radar.RadarMask)) { if (hit.collider != null && !hit.normal.IsZero()) { srf_normal = -hit.normal; break; } } stage = Stage.Landed; break; } working(); CFG.HF.Off(); CFG.AT.OnIfNot(Attitude.Custom); ATC.SetThrustDirW(srf_normal); LandedTimer.RunIf(() => { stage = Stage.Landed; CFG.AT.Off(); }, VSL.Physics.NoRotation || VSL.Controls.AttitudeError < 1); break; } stage = Stage.Landed; break; case Stage.JustTookoff: working(); StopAction.Run(); GearTimer.RunIf(() => { VSL.BrakesOn(false); VSL.GearOn(false); stage = Stage.Flying; }, VSL.Altitude.Relative > 2 * VSL.Geometry.H); break; case Stage.Landed: if (CFG.VerticalCutoff <= 0) { working(false); } else { var avSqr = VSL.vessel.angularVelocity.sqrMagnitude; if (VSL.HorizontalSpeed < C.MaxHSpeed && avSqr > C.MinAngularVelocity) { working(); CFG.HF.OnIfNot(HFlight.Level); if (avSqr > C.GearOffAngularVelocity && VSL.OnPlanetParams.DTWR > C.MinDTWR) { VSL.GearOn(false); } } else { working(false); } } break; case Stage.Flying: working(false); if (!VSL.vessel.ActionGroups[KSPActionGroup.Gear]) { if (VSL.VerticalSpeed.Relative < 0 && VSL.HorizontalSpeed < C.GearOnMaxHSpeed && (!CFG.AT || !VSL.Altitude.AboveGround || VSL.Engines.Thrust.IsZero()) && VSL.Altitude.Relative + VSL.VerticalSpeed.Relative * (VSL.OnPlanetParams.GearDeployTime + C.GearOnTime) < C.GearOnAtH * VSL.Geometry.H) { VSL.GearOn(); VSL.BrakesOn(); } } else if (VSL.OnPlanetParams.GearDeploying) { if (VSC != null) { VSC.SetpointOverride = Utils.ClampH((C.GearOnAtH * VSL.Geometry.H - VSL.Altitude.Relative) / (VSL.OnPlanetParams.GearDeployTime + C.GearOnTime), 0); } } else { GearTimer.RunIf(() => { VSL.GearOn(false); VSL.BrakesOn(false); }, VSL.VerticalSpeed.Relative > 5 || VSL.HorizontalSpeed > C.GearOnMaxHSpeed || VSL.VerticalSpeed.Relative > 0 && VSL.Altitude.Relative > VSL.Geometry.H * 5); } break; } }
protected override void Update() { if (!IsActive) { return; } //update state if (last_state && !VSL.LandedOrSplashed) { tookoff = true; landed = false; GearTimer.Reset(); StopAction.Reset(); } else if (VSL.LandedOrSplashed && !last_state) { landed = true; tookoff = false; } last_state = VSL.LandedOrSplashed; //just landed if (landed) { working(); CFG.HF.OnIfNot(HFlight.Level); VSL.BrakesOn(); LandedTimer.RunIf(() => landed = false, VSL.HorizontalSpeed < TLA.MinHSpeed); } //just took off else if (tookoff) { working(); StopAction.Run(); GearTimer.RunIf(() => { VSL.BrakesOn(false); VSL.GearOn(false); tookoff = false; }, VSL.Altitude.Relative > TLA.GearOnAtH + VSL.Geometry.H); } //moving on the ground else if (VSL.LandedOrSplashed) { var avSqr = VSL.vessel.angularVelocity.sqrMagnitude; if (VSL.HorizontalSpeed < TLA.MaxHSpeed && avSqr > TLA.MinAngularVelocity) { working(); CFG.HF.OnIfNot(HFlight.Level); if (avSqr > TLA.GearOffAngularVelocity && VSL.OnPlanetParams.DTWR > TLA.MinDTWR) { VSL.GearOn(false); } } else { working(false); } } //if flying, check if trying to land and deploy the gear else { working(false); //if the gear is on, nothing to do; and autopilot takes precedence if (!VSL.vessel.ActionGroups[KSPActionGroup.Gear]) { //check boundary conditions GearTimer.RunIf(() => { VSL.GearOn(); VSL.BrakesOn(); }, VSL.VerticalSpeed.Relative < 0 && VSL.HorizontalSpeed < TLA.GearOnMaxHSpeed && VSL.Altitude.Relative + VSL.VerticalSpeed.Relative * (TLA.GearOnTime + TLA.GearTimer) < TLA.GearOnAtH * VSL.Geometry.H); } else { GearTimer.RunIf(() => { VSL.GearOn(false); VSL.BrakesOn(false); }, VSL.VerticalSpeed.Relative > 5 || VSL.HorizontalSpeed > TLA.GearOnMaxHSpeed || VSL.VerticalSpeed.Relative > 0 && VSL.Altitude.Relative > VSL.Geometry.H * 5); } } }