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