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;
            }
        }
示例#3
0
        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;
            }
        }