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; } }
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; } }
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(); }
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; } }
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(); } }
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 }