Ejemplo n.º 1
0
        private void Run()
        {
            F12019NewTelemetryData data;     // Exposes only data for interest to SimFeedback
            PacketMotionData       packData; // Raw data as received from game

            Session   session = new Session();
            Stopwatch sw      = new Stopwatch();

            sw.Start();

            UdpClient socket = new UdpClient();

            socket.ExclusiveAddressUse = false;
            socket.Client.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), PORTNUM));

            Log("Listener started (port: " + PORTNUM.ToString() + ") F12019NewTelemetryProvider.Thread");

            while (!isStopped)
            {
                try
                {
                    // get data from game,
                    if (socket.Available == 0)
                    {
                        if (sw.ElapsedMilliseconds > 500)
                        {
                            IsRunning   = false;
                            IsConnected = false;
                            Thread.Sleep(1000);
                        }
                        continue;
                    }
                    else
                    {
                        IsConnected = true;
                    }


                    Byte[] received = socket.Receive(ref _senderIP);
                    LogDebug($"Packet size: '{received.Length}'");

                    if (received.Length == bytesInTelemetryPacket2019 || received.Length == bytesInTelemetryPacket2018)
                    {
                        // Unfortunately we need to "digest" the car telemetry data just to get the RPMs out of it.
                        // Storing the RPMs in class variable for easier access when adding it to our SFB exposed telemetry data
                        var telemData = new PacketCarTelemetryData(received);
                        if (received.Length == bytesInTelemetryPacket2019)
                        {
                            lastRPMs = telemData.m_carTelemetryData2019[0].m_engineRPM;
                        }
                        else
                        {
                            lastRPMs = telemData.m_carTelemetryData2018[0].m_engineRPM;
                        }
                        LogDebug($"Got RPMs: '{lastRPMs}'");
                    }
                    else if (received.Length == bytesInMotionPacket2019 || received.Length == bytesInMotionPacket2019 - 2)
                    {
                        packData = new PacketMotionData(received);

                        if (packData.m_header.m_packetId == 0) // should always be the case if the # of bytes received match
                        {
                            data = new F12019NewTelemetryData(packData);

                            LogDebug($"Got longitudal g force: '{data.gForceLongitudinal}'");

                            IsRunning = true;

                            TelemetryEventArgs args = new TelemetryEventArgs(
                                new F12019NewTelemetryInfo(data, session));
                            RaiseEvent(OnTelemetryUpdate, args);
                        }
                        else
                        {
                            LogDebug("Received packet has expected number of bytes but is not a motion packet. This should not happen.");
                            IsRunning = false;
                            lastRPMs  = 0;
                        }
                    }
                    else if (received.Length == bytesInParticipantPacket2019 || received.Length == bytesInParticipantPacket2018)
                    {
                        var participantData = new ParticpantData(received);
                        LogDebug($"Got human driver index '{participantData.humanDriver}'");
                        humanDriver = participantData.humanDriver;
                    }
                    else if (received.Length == bytesInSessionData2019 || received.Length == bytesInSessionData2018)
                    {
                        var sessionData = new SessionData(received);
                        LogDebug($"Got watched driver index '{sessionData.m_spectatorCarIndex}'");
                        spectatorCarIndex = sessionData.m_spectatorCarIndex;
                    }

                    sw.Restart();
                    //Thread.Sleep(SamplePeriod);
                }
                catch (Exception e)
                {
                    IsConnected = false;
                    IsRunning   = false;
                    lastRPMs    = 0;
                    LogDebug($"Caught Exception while unmarshalling data '{e.Message}'");
                    Thread.Sleep(1000);
                }
            }

            socket.Close();
            IsConnected = false;
            IsRunning   = false;
        }
 public F12019NewTelemetryInfo(F12019NewTelemetryData data, Session session)
 {
     telemetryData = data;
     this.session  = session;
 }