private void UpdateNetworkAircraftInSim(NetworkAircraft aircraft, NetworkAircraftState State)
        {
            dynamic data = new ExpandoObject();

            data.Callsign         = aircraft.Callsign;
            data.Latitude         = State.Location.Lat;
            data.Longitude        = State.Location.Lon;
            data.Altitude         = State.Altitude;
            data.Bank             = State.Bank;
            data.Pitch            = State.Pitch;
            data.Heading          = State.Heading;
            data.GroundSpeed      = State.GroundSpeed;
            data.TransponderCode  = State.Transponder.TransponderCode;
            data.TransponderModeC = State.Transponder.TransponderModeC;
            data.TransponderIdent = State.Transponder.TransponderIdent;
            data.Origin           = aircraft.OriginAirport;
            data.Destination      = aircraft.DestinationAirport;

            XplaneConnect xp = new XplaneConnect
            {
                Type      = XplaneConnect.MessageType.PositionUpdate,
                Timestamp = DateTime.Now,
                Data      = data
            };

            XPlaneEventPosted?.Invoke(this, new ClientEventArgs <string>(xp.ToJSON()));
        }
        private void NetworkAircraftUpdateReceived(string from, NetworkAircraftState state)
        {
            NetworkAircraft aircraft = mNetworkAircraft.FirstOrDefault(a => a.Callsign == from);

            if (aircraft == null)
            {
                ProcessNewAircraft(from, state);
            }
            else
            {
                UpdateExistingNetworkAircraft(aircraft, state);
            }
        }
Esempio n. 3
0
 private void FSD_PilotPositionReceived(object sender, DataReceivedEventArgs <PDUPilotPosition> e)
 {
     if (!mConnectInfo.ObserverMode || !Regex.IsMatch(mConnectInfo.Callsign, "^" + Regex.Escape(e.PDU.From) + "[A-Z]$"))
     {
         NetworkAircraftState aircraftState = new NetworkAircraftState();
         aircraftState.Transponder.TransponderCode  = e.PDU.SquawkCode;
         aircraftState.Transponder.TransponderIdent = e.PDU.IsIdenting;
         aircraftState.Transponder.TransponderModeC = e.PDU.IsSquawkingModeC;
         aircraftState.Altitude    = e.PDU.TrueAltitude;
         aircraftState.Bank        = e.PDU.Bank;
         aircraftState.Pitch       = e.PDU.Pitch;
         aircraftState.Heading     = e.PDU.Heading;
         aircraftState.GroundSpeed = e.PDU.GroundSpeed;
         aircraftState.Location    = new WorldPoint(e.PDU.Lon, e.PDU.Lat);
         AircraftUpdateReceived?.Invoke(this, new AircraftUpdateReceivedEventArgs(e.PDU.From, aircraftState));
     }
 }
        private void UpdateExistingNetworkAircraft(NetworkAircraft aircraft, NetworkAircraftState state)
        {
            if (aircraft != null && aircraft.UpdateCount >= 2 && string.IsNullOrEmpty(aircraft.TypeCode))
            {
                Console.WriteLine($"Still no type code received for {aircraft.Callsign} after position update #{aircraft.UpdateCount} - requesting aircraft info");
                mFsdManager.RequestPlaneInformation(aircraft.Callsign);
            }

            double diff = (DateTime.Now - aircraft.LastUpdated).TotalSeconds;

            aircraft.VerticalSpeed = (int)((aircraft.CurrentPosition.Altitude - aircraft.PreviousPosition.Altitude) / (diff / 60.0));
            aircraft.LastUpdated   = DateTime.Now;
            aircraft.StateHistory.Add(state);
            aircraft.Transponder = state.Transponder;
            aircraft.UpdateCount++;

            while (aircraft.StateHistory.Count > 2)
            {
                aircraft.StateHistory.RemoveAt(0);
            }

            UpdateNetworkAircraftInSim(aircraft, state);

            if (aircraft.Status == AircraftStatus.Active)
            {
                if (!aircraft.SupportsConfigurationProtocol)
                {
                    UpdateLegacyAircraftConfig(aircraft);
                }
                else
                {
                    while (aircraft.PendingAircraftConfiguration.Count > 0)
                    {
                        var cfg = aircraft.PendingAircraftConfiguration.Pop();
                        ProcessAircraftConfig(aircraft, cfg);
                    }
                }

                if ((DateTime.Now - aircraft.LastFlightPlanFetch).TotalMinutes >= 5)
                {
                    mFsdManager.RequestRemoteFlightPlan(aircraft.Callsign);
                    aircraft.LastFlightPlanFetch = DateTime.Now;
                }
            }
        }
        private void ProcessNewAircraft(string from, NetworkAircraftState state)
        {
            NetworkAircraft aircraft = new NetworkAircraft
            {
                Callsign    = from,
                LastUpdated = DateTime.Now,
                UpdateCount = 1,
                Status      = AircraftStatus.New
            };

            aircraft.StateHistory.Add(state);
            mNetworkAircraft.Add(aircraft);

            Console.WriteLine($"Aircraft discovered: {aircraft.Callsign} - requesting CAPS, sending CAPS, requesting aircraft info");
            mFsdManager.RequestClientCapabilities(aircraft.Callsign);
            mFsdManager.SendClientCaps(aircraft.Callsign);
            mFsdManager.RequestPlaneInformation(aircraft.Callsign);
        }
 public AircraftUpdateReceivedEventArgs(string from, NetworkAircraftState aircraftState) : base(from, null)
 {
     State = aircraftState;
 }