Exemple #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="fs"></param>
        public bool StartFlight()
        {
            try
            {
                PirepID = FlightDatabase.StartFlight(this);
                Telemetry.SetValue(FSUIPCOffsets.engine1, false);
                Telemetry.SetValue(FSUIPCOffsets.engine2, false);
                Telemetry.SetValue(FSUIPCOffsets.engine3, false);
                Telemetry.SetValue(FSUIPCOffsets.engine4, false);
                Telemetry.SetValue(FSUIPCOffsets.parkingBrake, true);

                Telemetry.SetValue(FSUIPCOffsets.environmentDateTimeHour, DateTime.UtcNow.Hour);
                Telemetry.SetValue(FSUIPCOffsets.environmentDateTimeMinute, DateTime.UtcNow.Minute);
                Telemetry.SetValue(FSUIPCOffsets.environmentDateTimeDayOfYear, DateTime.UtcNow.DayOfYear);
                Telemetry.SetValue(FSUIPCOffsets.environmentDateTimeYear, DateTime.UtcNow.Year);

                string Message = "Welcome to FlyAtlantic Acars";
                FSUIPCOffsets.messageWrite.Value    = Message;
                FSUIPCOffsets.messageDuration.Value = 10;
                FSUIPCConnection.Process();

                phase         = FlightPhases.PREFLIGHT;
                FlightRunning = true;
            }
            catch (Exception crap)
            {
                throw new Exception("Failed to start flight.", crap);
            }

            // TODO: do all stuff via telemetry to force desired values


            return(FlightRunning);
        }
Exemple #2
0
        public Flight(FlightPhases initialPhase = FlightPhases.PREFLIGHT)
        {
            #region Register Events
            activeEvents = new FlightEvent[] {
                new FlightEvent("2A", 5, "Bank Angle Exceeded", 30, 30, (t) => { return(t.Bank > 30); }),
                new FlightEvent("3A", 5, "Landing lights on above 10000 ft", 5, 5, (t) => { return(t.LandingLights && (t.Altitude > 10500)); }),
                new FlightEvent("3B", 5, "Landing lights off durring approach", 5, 5, (t) => { return(!t.LandingLights && (t.RadioAltitude < 2750 || t.Altitude < 2500) && phase == FlightPhases.APPROACH); }),
                new FlightEvent("3C", 5, "Speed above 250 IAS bellow 10000 ft", 10, 10, (t) => { return((t.IndicatedAirSpeed > 255) && (t.Altitude < 9500)); }),
                new FlightEvent("3D", 5, "High Speed On Taxi Out", 5, 5, (t) => { return((t.GroundSpeed > 30 && t.OnGround) && phase == FlightPhases.TAXIOUT); }),
                new FlightEvent("3E", 5, "High Speed On Taxi In", 5, 5, (t) => { return((t.GroundSpeed > 30 && t.OnGround) && phase == FlightPhases.TAXIIN); }),
                new FlightEvent("4A", 5, "Landing light on above 250 IAS", 5, 5, (t) => { return(t.LandingLights && t.IndicatedAirSpeed > 255); }),
                new FlightEvent("4B", 5, "Landing lights Off On TakeOff", 5, 5, (t) => { return(!t.LandingLights && phase == FlightPhases.TAKEOFF); }),
                new FlightEvent("4C", 5, "Pitch High Below 1500ft on Departure(Radio)", 10, 10, (t) => { return((t.RadioAltitude < 1500) && t.Pitch > 20); }),
                new FlightEvent("4D", 5, "Gear down above 250 IAS", 10, 30, (t) => { return(t.Gear && t.IndicatedAirSpeed > 255); }),
                new FlightEvent("6A", 1, "Maximum TakeOff Weight Excceded", 30, 30, (t) => { return(phase == FlightPhases.TAKEOFF && (t.GrossWeight > LoadedFlightPlan.Aircraft.MTW)); }),
                new FlightEvent("6B", 1, "Maximum Landing Weight Excceded", 30, 30, (t) => { return(phase == FlightPhases.LANDING && (t.GrossWeight > LoadedFlightPlan.Aircraft.MLW)); }),
                new FlightEvent("6C", 1, "Maximum Service Ceiling Excceded", 30, 30, (t) => { return(!t.OnGround && (t.Altitude > LoadedFlightPlan.Aircraft.Celling)); }),
                //new FlightEvent("6D", 1, "Maximum Speed Flap Excceded"             , 30, 30, (t) => {
                //    var flapSetting = LoadedFlightPlan.Aircraft.FlapSettings.OrderBy(x => x.Key).Where(x => x.Key < t.Flaps).FirstOrDefault().Value;
                //    return (!t.OnGround && (t.IndicatedAirSpeed > flapSetting.IASLimit));
                //}),

                new FlightEvent("6D", 1, "Maximum Speed Flap Excceded", 30, 30, (t) => { return(LoadedFlightPlan.Aircraft.FlapSettings.ContainsKey(t.Flaps) && (LoadedFlightPlan.Aircraft.FlapSettings[t.Flaps].IASLimit < t.IndicatedAirSpeed)); }),
                new FlightEvent("7B", 5, "Pitch too high", 30, 30, (t) => { return(t.Pitch > 30); })
            };
            #endregion Register Events

            phase         = initialPhase;
            FlightRunning = false;

            TelemetryLog = new List <Telemetry>();

            ActualArrivalTimeId   = -1;
            ActualDepartureTimeId = -1;

            LoadedFlightPlan = null;

            FinalScore = 100;

            Events = new List <EventOccurrence>();
        }
Exemple #3
0
        /// <summary>
        /// Handle flight phases
        /// </summary>
        public Telemetry HandleFlightPhases(Telemetry currentTelemetry = null)
        {
            if (currentTelemetry == null)
            {
                currentTelemetry = Telemetry.GetCurrent();
            }

            // handle switching phase
            switch (phase)
            {
            case FlightPhases.PREFLIGHT:
                if (currentTelemetry.Engine1 && !currentTelemetry.ParkingBrake)
                {
                    phase = FlightPhases.PUSHBACK;
                }
                break;

            case FlightPhases.PUSHBACK:
                if (currentTelemetry.Engine1 && !currentTelemetry.ParkingBrake && currentTelemetry.IndicatedAirSpeed >= 10)
                {
                    phase = FlightPhases.TAXIOUT;
                }
                break;

            case FlightPhases.TAXIOUT:
                if (currentTelemetry.Engine1 && currentTelemetry.IndicatedAirSpeed >= 30)
                {
                    ActualDepartureTimeId = TelemetryLog.Count;     // works because we will be inserting the current telemetry data to the TelemetryLog
                    phase = FlightPhases.TAKEOFF;
                }
                break;

            case FlightPhases.TAKEOFF:
                if (!currentTelemetry.OnGround)
                {
                    phase = FlightPhases.CLIMBING;
                }
                break;

            case FlightPhases.CLIMBING:
                if (currentTelemetry.VerticalSpeed <= 100 && currentTelemetry.VerticalSpeed >= -100 && !currentTelemetry.OnGround)
                {
                    phase = FlightPhases.CRUISE;
                }
                else if (currentTelemetry.VerticalSpeed <= -100 && !currentTelemetry.OnGround && LastTelemetry.Location.GetDistanceTo(LoadedFlightPlan.ArrivalAirfield.Position) > 18000)
                {
                    phase = FlightPhases.DESCENDING;
                }
                break;

            case FlightPhases.CRUISE:
                if (currentTelemetry.VerticalSpeed <= -100 && !currentTelemetry.OnGround && LastTelemetry.Location.GetDistanceTo(LoadedFlightPlan.ArrivalAirfield.Position) > 18000)
                {
                    phase = FlightPhases.DESCENDING;
                }
                else if (currentTelemetry.VerticalSpeed >= 100 && !currentTelemetry.OnGround)
                {
                    phase = FlightPhases.CLIMBING;
                }
                else if (!currentTelemetry.OnGround && currentTelemetry.IndicatedAirSpeed <= 200 && LastTelemetry.Location.GetDistanceTo(LoadedFlightPlan.ArrivalAirfield.Position) < 18000)
                {
                    phase = FlightPhases.APPROACH;
                }
                break;

            case FlightPhases.DESCENDING:
                if (!currentTelemetry.OnGround && currentTelemetry.IndicatedAirSpeed <= 200 && LastTelemetry.Location.GetDistanceTo(LoadedFlightPlan.ArrivalAirfield.Position) < 18000)
                {
                    phase = FlightPhases.APPROACH;
                }
                else if (currentTelemetry.VerticalSpeed >= 100 && !currentTelemetry.OnGround)
                {
                    phase = FlightPhases.CLIMBING;
                }
                else if (currentTelemetry.VerticalSpeed <= 100 && currentTelemetry.VerticalSpeed >= -100 && !currentTelemetry.OnGround)
                {
                    phase = FlightPhases.CRUISE;
                }
                break;

            case FlightPhases.APPROACH:
                if (currentTelemetry.OnGround)
                {
                    ActualArrivalTimeId = TelemetryLog.Count;     // again, works because we will be inserting the current telemetry data to the TelemetryLog
                    phase = FlightPhases.LANDING;
                }
                else if (currentTelemetry.VerticalSpeed >= 100)
                {
                    phase = FlightPhases.CLIMBING;
                }
                break;

            case FlightPhases.LANDING:
                if (currentTelemetry.IndicatedAirSpeed <= 40 && currentTelemetry.OnGround)
                {
                    phase = FlightPhases.TAXIIN;
                }
                break;

            case FlightPhases.TAXIIN:
                if (!currentTelemetry.Engine1 && !currentTelemetry.Engine2 && !currentTelemetry.Engine3 && !currentTelemetry.Engine4 && currentTelemetry.ParkingBrake)
                {
                    phase = FlightPhases.PARKING;
                }
                break;
            }
            currentTelemetry.FlightPhase = phase;
            return(currentTelemetry);
        }