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