public virtual void HandleTelemetryPaused() { filteredData.paused = rawData.paused = telemetryPaused ? 1 : 0; if (telemetryPausedTimer > 0.0f || telemetryPaused) { if (telemetryPaused) { filteredData.Copy(lastFilteredData); } telemetryPausedTimer = Math.Max(0.0f, telemetryPausedTimer - dt); float lerp = telemetryPausedTimer / telemetryPausedTime; filteredData.LerpAllFromZero(telemetryPaused ? lerp : 1.0f - lerp); } }
/// <summary> /// The thread funktion to poll the telemetry data and send TelemetryUpdated events. /// </summary> private void Run() { isStopped = false; smoothInTimer = 0.0f; startWaitTimer = startWaitTime; CMCustomUDPData telemetryData = new CMCustomUDPData(); CMCustomUDPData.formatFilename = "CMCustomUDP/CMCustomUDPFormat.xml"; telemetryData.Init(); Stopwatch sw = new Stopwatch(); sw.Start(); Stopwatch processSW = new Stopwatch(); int readSize = telemetryData.GetSize(); byte[] readBuffer; UdpClient socket = null; if (config.receiveUDP) { socket = new UdpClient(); socket.ExclusiveAddressUse = false; socket.Client.Bind(new IPEndPoint(IPAddress.Any, config.udpPort)); } MemoryMappedFile mmf = null; while (!isStopped) { try { float dt = (float)sw.ElapsedMilliseconds / 1000.0f; if (config.receiveUDP) { while (true) { if (socket.Available == 0) { if (sw.ElapsedMilliseconds > 500) { Thread.Sleep(1000); } continue; } else { break; } } } else { while (true) { try { mmf = MemoryMappedFile.OpenExisting("GenericTelemetryProviderFiltered"); if (mmf != null) { break; } else { Thread.Sleep(1000); } } catch (FileNotFoundException) { Thread.Sleep(1000); } } } if (config.receiveUDP) { readBuffer = socket.Receive(ref senderIP); } else { Mutex mutex = Mutex.OpenExisting("GenericTelemetryProviderMutex"); mutex.WaitOne(); using (MemoryMappedViewStream stream = mmf.CreateViewStream()) { BinaryReader reader = new BinaryReader(stream); readBuffer = reader.ReadBytes(readSize); } mutex.ReleaseMutex(); } telemetryData.FromBytes(readBuffer); CMCustomUDPData telemetryToSend = new CMCustomUDPData(); telemetryToSend.Copy(telemetryData); //wait for start because there is a delay between when telem starts sending and platform is updated if (startWaitTimer > 0.0f) { startWaitTimer -= dt; telemetryToSend.LerpAllFromZero(0.0f); //done, so smooth in if (startWaitTimer <= 0.0f) { smoothInTimer = smoothInTime; } } else //smooth start transition if (smoothInTimer > 0.0f) { float lerp = 1.0f - (smoothInTimer / smoothInTime); smoothInTimer -= dt; telemetryToSend.LerpAllFromZero(lerp); } IsConnected = true; if (IsConnected) { IsRunning = true; sw.Restart(); TelemetryEventArgs args = new TelemetryEventArgs( new GTPTelemetryInfo(telemetryToSend)); RaiseEvent(OnTelemetryUpdate, args); bool sleep = true; if (config.receiveUDP) { if (socket.Available != 0) { sleep = false; } } if (sleep) { using (var sleeper = new ManualResetEvent(false)) { int processTime = (int)processSW.ElapsedMilliseconds; sleeper.WaitOne(Math.Max(0, 10 - processTime)); } processSW.Restart(); } } else if (sw.ElapsedMilliseconds > 500) { IsRunning = false; } } catch (Exception e) { LogError("GTPTelemetryProvider Exception while processing data", e); mmf.Dispose(); IsConnected = false; IsRunning = false; Thread.Sleep(1000); } } if (socket != null) { socket.Close(); } if (mmf != null) { mmf.Dispose(); } IsConnected = false; IsRunning = false; }