Пример #1
0
        /// <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);
        }
Пример #2
0
        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;
            }
        }
Пример #3
0
 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);
 }
Пример #4
0
        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;
            }
        }
Пример #5
0
        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;
        }
Пример #6
0
        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();
        }