public async Task StartAsync() { while (true) { var result = await client.ReceiveAsync(); var data = Encoding.UTF8.GetString(result.Buffer); //XGPSPrepar3D v4,103.701,1.574,3046.8,317.99,45.9 //XATTPrepar3D v4,-42.187,3.928,-1.788 var tokens = data.Split(','); var type = tokens[0].Substring(0, 4); var software = tokens[0].Substring(4, tokens[0].Length - 4); switch (type) { case "XGPS": if (currentInfo == null) { currentInfo = new FlightStatus(); } currentInfo.Longitude = double.Parse(tokens[1]); currentInfo.Latitude = double.Parse(tokens[2]); currentInfo.Altitude = double.Parse(tokens[3]); currentInfo.Heading = double.Parse(tokens[4]); currentInfo.IndicatedAirSpeed = double.Parse(tokens[5]); break; case "XATT": if (currentInfo == null) { currentInfo = new FlightStatus(); } currentInfo.TrueHeading = double.Parse(tokens[1]); currentInfo.Pitch = double.Parse(tokens[2]); currentInfo.Bank = double.Parse(tokens[3]); break; } if (currentInfo != null) { FlightStatusUpdated?.Invoke(this, new FlightStatusUpdatedEventArgs(currentInfo)); } } }
private async void simconnect_OnRecvSimobjectDataBytypeAsync(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE data) { // Must be general SimObject information switch (data.dwRequestID) { case (uint)DATA_REQUESTS.FLIGHT_STATUS: { var flightStatus = data.dwData[0] as FlightStatusStruct?; if (flightStatus.HasValue) { logger.LogDebug("Get Flight status"); FlightStatusUpdated?.Invoke(this, new FlightStatusUpdatedEventArgs( new FlightStatus { //SimTime = flightStatus.Value.SimTime, //SimRate = flightStatus.Value.SimRate, Latitude = flightStatus.Value.Latitude, Longitude = flightStatus.Value.Longitude, Altitude = flightStatus.Value.Altitude, AltitudeAboveGround = flightStatus.Value.AltitudeAboveGround, Pitch = flightStatus.Value.Pitch, Bank = flightStatus.Value.Bank, Heading = flightStatus.Value.MagneticHeading, TrueHeading = flightStatus.Value.TrueHeading, GroundSpeed = flightStatus.Value.GroundSpeed, IndicatedAirSpeed = flightStatus.Value.IndicatedAirSpeed, VerticalSpeed = flightStatus.Value.VerticalSpeed, FuelTotalQuantity = flightStatus.Value.FuelTotalQuantity, IsOnGround = flightStatus.Value.IsOnGround == 1, StallWarning = flightStatus.Value.StallWarning == 1, OverspeedWarning = flightStatus.Value.OverspeedWarning == 1, IsAutopilotOn = flightStatus.Value.IsAutopilotOn == 1 })); } else { // Cast failed logger.LogError("Cannot cast to FlightStatusStruct!"); } } break; } }
private async void simconnect_OnRecvSimobjectDataBytypeAsync(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE data) { // Must be general SimObject information switch (data.dwRequestID) { case (uint)DATA_REQUESTS.AIRCRAFT_DATA: { var aircraftData = data.dwData[0] as AircraftDataStruct?; if (aircraftData.HasValue) { var dto = new AircraftData { Title = aircraftData.Value.Title, Type = aircraftData.Value.AtcType, Model = aircraftData.Value.AtcModel, TailNumber = aircraftData.Value.AtcId, Airline = aircraftData.Value.AtcAirline, FlightNumber = aircraftData.Value.AtcFlightNumber }; AircraftDataUpdated?.Invoke(this, new AircraftDataUpdatedEventArgs(dto)); } else { // Cast failed logger.LogError("Cannot cast to AircraftDataStruct!"); } } break; case (uint)DATA_REQUESTS.FLIGHT_PLAN_STATUS: { var flightPlan = data.dwData[0] as FlightPlanStruct?; } break; case (uint)DATA_REQUESTS.FLIGHT_STATUS: { var flightStatus = data.dwData[0] as FlightStatusStruct?; if (flightStatus.HasValue) { FlightStatusUpdated?.Invoke(this, new FlightStatusUpdatedEventArgs( new ClientFlightStatus { SimTime = flightStatus.Value.SimTime, SimRate = flightStatus.Value.SimRate, Latitude = flightStatus.Value.Latitude, Longitude = flightStatus.Value.Longitude, Altitude = flightStatus.Value.Altitude, AltitudeAboveGround = flightStatus.Value.AltitudeAboveGround, Pitch = flightStatus.Value.Pitch, Bank = flightStatus.Value.Bank, Heading = flightStatus.Value.MagneticHeading, TrueHeading = flightStatus.Value.TrueHeading, GroundSpeed = flightStatus.Value.GroundSpeed, IndicatedAirSpeed = flightStatus.Value.IndicatedAirSpeed, VerticalSpeed = flightStatus.Value.VerticalSpeed, FuelTotalQuantity = flightStatus.Value.FuelTotalQuantity, IsOnGround = flightStatus.Value.IsOnGround == 1, StallWarning = flightStatus.Value.StallWarning == 1, OverspeedWarning = flightStatus.Value.OverspeedWarning == 1, IsAutopilotOn = flightStatus.Value.IsAutopilotOn == 1 })); } else { // Cast failed logger.LogError("Cannot cast to FlightStatusStruct!"); } await Task.Delay(StatusDelayMilliseconds); simconnect?.RequestDataOnSimObjectType(DATA_REQUESTS.FLIGHT_STATUS, DEFINITIONS.FlightStatus, 0, SIMCONNECT_SIMOBJECT_TYPE.USER); } break; } }