public virtual void StartSending() { lastPosition = Vector3.Zero; lastFrameValid = false; lastVelocity = Vector3.Zero; lastWorldVelocity = Vector3.Zero; lastRawPos = Vector3.Zero; filteredData = new CMCustomUDPData(); filteredData.Init(); rawData = new CMCustomUDPData(); rawData.Init(); fillMMF = MainConfig.Instance.configData.fillMMF; sendUDP = MainConfig.Instance.configData.sendUDP; if (sendUDP) { telemetrySender.StartSending(MainConfig.Instance.configData.udpIP, MainConfig.Instance.configData.udpPort); } IsStopped = false; }
/// <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; }