Esempio n. 1
0
        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;
        }