/// <summary> /// Update the current state of the spacecraft according to all inputs /// </summary> /// <param name="CurrentState">The current flight control state</param> public static void UpdateState(FlightCtrlState CurrentState) { // Go through all our axes to find the ones we need to update foreach (FieldInfo field in AxisFields) { if (Math.Abs((float)field.GetValue(CurrentState)) < Math.Abs((float)field.GetValue(UpdatedState))) { field.SetValue(CurrentState, (float)field.GetValue(UpdatedState)); // The throttles are a real PITA to override if (field.Name == "mainThrottle") { FlightInputHandler.state.mainThrottle = 0.0f; } else if (field.Name == "wheelThrottle") { FlightInputHandler.state.wheelThrottle = 0.0f; } } } // If SAS is on, we need to override it or else our changes are ignored VesselAutopilot.VesselSAS vesselSAS = FlightGlobals.ActiveVessel.Autopilot.SAS; Boolean overrideSAS = (Math.Abs(CurrentState.pitch) > vesselSAS.controlDetectionThreshold) || (Math.Abs(CurrentState.yaw) > vesselSAS.controlDetectionThreshold) || (Math.Abs(CurrentState.roll) > vesselSAS.controlDetectionThreshold); vesselSAS.ManualOverride(overrideSAS); }
public void Update(VesselAutopilot.VesselSAS sas) { PIDclamp[] sasPID = new PIDclamp[3]; sasPID[(int)SASList.Pitch] = sas.pidLockedPitch; sasPID[(int)SASList.Roll] = sas.pidLockedRoll; sasPID[(int)SASList.Yaw] = sas.pidLockedYaw; foreach (SASList s in Enum.GetValues(typeof(SASList))) { PIDGains[(int)s, 0] = sasPID[(int)s].kp; PIDGains[(int)s, 1] = sasPID[(int)s].ki; PIDGains[(int)s, 2] = sasPID[(int)s].kd; PIDGains[(int)s, 3] = sasPID[(int)s].clamp; } }
static bool Prefix(VesselAutopilot.VesselSAS __instance, Vessel ___vessel, ref bool __result) { if (FlightGlobals.ActiveVessel != ___vessel) { __result = false; // this is what VesselSAS does anyway, so no point in calling it return(false); } if (Mathf.Abs(AI_FlightControl.instance.ctrlState.roll) > __instance.controlDetectionThreshold) { __result = true; // short circuit the logic return(false); } // allow VesselSAS to check keyboard and other inputs return(true); }
public SASPreset(VesselAutopilot.VesselSAS sas, string Name) // used for adding a new stock preset { name = Name; PIDclamp[] sasPID = new PIDclamp[3]; sasPID[(int)SASList.Pitch] = sas.pidLockedPitch; sasPID[(int)SASList.Bank] = sas.pidLockedRoll; sasPID[(int)SASList.Hdg] = sas.pidLockedYaw; foreach (SASList s in Enum.GetValues(typeof(SASList))) { PIDGains[(int)s, 0] = sasPID[(int)s].kp; PIDGains[(int)s, 1] = sasPID[(int)s].ki; PIDGains[(int)s, 2] = sasPID[(int)s].kd; PIDGains[(int)s, 3] = sasPID[(int)s].clamp; } }
private void drawSASWindow(int id) { if (GUI.Button(new Rect(StockSASwindow.width - 16, 2, 14, 14), "")) { PilotAssistantFlightCore.bDisplaySAS = false; } bShowPresets = GUILayout.Toggle(bShowPresets, bShowPresets ? "Hide SAS Presets" : "Show SAS Presets"); VesselAutopilot.VesselSAS sas = vesModule.vesselRef.Autopilot.SAS; drawPIDValues(sas.pidLockedPitch, "Pitch", SASList.Pitch); drawPIDValues(sas.pidLockedRoll, "Roll", SASList.Bank); drawPIDValues(sas.pidLockedYaw, "Yaw", SASList.Hdg); GUI.DragWindow(); tooltip = GUI.tooltip; }
private void drawSASWindow(int id) { if (GUI.Button(new Rect(SASwindow.width - 16, 2, 14, 14), "")) { AppLauncherFlight.bDisplaySAS = false; } bShowPresets = GUILayout.Toggle(bShowPresets, bShowPresets ? "Hide SAS Presets" : "Show SAS Presets"); bStockSAS = GUILayout.Toggle(bStockSAS, bStockSAS ? "Mode: Stock SAS" : "Mode: SSAS"); if (!bStockSAS) { GUI.backgroundColor = GeneralUI.HeaderButtonBackground; if (GUILayout.Button(bArmed ? "Disarm SAS" : "Arm SAS")) { bArmed = !bArmed; if (!bArmed) { ActivitySwitch(false); } if (bArmed) { Messaging.statusMessage(8); } else { Messaging.statusMessage(9); } } GUI.backgroundColor = GeneralUI.stockBackgroundGUIColor; if (bArmed) { Utils.GetSAS(SASList.Pitch).SetPoint = Utils.Clamp((float)GeneralUI.TogPlusNumBox("Pitch:", ref bActive[(int)SASList.Pitch], FlightData.pitch, Utils.GetSAS(SASList.Pitch).SetPoint, 80), -90, 90); Utils.GetSAS(SASList.Yaw).SetPoint = GeneralUI.TogPlusNumBox("Heading:", ref bActive[(int)SASList.Yaw], FlightData.heading, Utils.GetSAS(SASList.Yaw).SetPoint, 80, 60, 360, 0); if (!rollState) // editable { Utils.GetSAS(SASList.Roll).SetPoint = GeneralUI.TogPlusNumBox("Roll:", ref bActive[(int)SASList.Roll], FlightData.roll, Utils.GetSAS(SASList.Roll).SetPoint, 80, 60, 180, -180); } else // not editable b/c vector mode { GUILayout.BeginHorizontal(); bActive[(int)SASList.Roll] = GUILayout.Toggle(bActive[(int)SASList.Roll], "Roll:", GeneralUI.toggleButton, GUILayout.Width(80)); GUILayout.TextField(FlightData.roll.ToString("N2"), GUILayout.Width(60)); GUILayout.EndHorizontal(); } GUILayout.Box("", GUILayout.Height(10)); drawPIDValues(SASList.Pitch, "Pitch"); drawPIDValues(SASList.Roll, "Roll"); drawPIDValues(SASList.Yaw, "Yaw"); } } else { VesselAutopilot.VesselSAS sas = FlightData.thisVessel.Autopilot.SAS; drawPIDValues(sas.pidLockedPitch, "Pitch", SASList.Pitch); drawPIDValues(sas.pidLockedRoll, "Roll", SASList.Roll); drawPIDValues(sas.pidLockedYaw, "Yaw", SASList.Yaw); } GUI.DragWindow(); }