void OnUdpData(IAsyncResult result)
        {
            UdpClient  socket = result.AsyncState as UdpClient;
            IPEndPoint source = new IPEndPoint(0, 0);

            byte[] message = socket.EndReceive(result, ref source);

            var ph = new PacketHeader(message);

            switch (ph.m_packetId)
            {
            //case 1:
            //    var sessionData = new PacketSessionData();
            //    sessionData.RawData = ph.RawData;
            //    sessionData.LoadData();
            //    break;
            case 2:
                var lapData = new PacketLapData();
                lapData.RawData = ph.RawData;
                lapData.LoadData();

                currentLap = lapData.m_lapData[lapData.m_header.m_playerCarIndex].m_currentLapNum.ToString();
                var lastLapTS = TimeSpan.FromSeconds(lapData.m_lapData[lapData.m_header.m_playerCarIndex].m_lastLapTime);
                lastLap = $"{ lastLapTS.Minutes }:{ lastLapTS.Seconds }.{ lastLapTS.Milliseconds }";

                if (lapData.m_lapData[lapData.m_header.m_playerCarIndex].m_lapDistance > 0)
                {
                    if (lastLapDistance < 0)
                    {
                        //NEW LAP
                        MediaPlayer.Play(larry);
                        StartNewLap();
                    }
                    else
                    {
                        var diff = lastLapDistance - lapData.m_lapData[lapData.m_header.m_playerCarIndex].m_lapDistance;
                        if (diff > 1000)
                        {
                            //NEW LAP

                            MediaPlayer.Play(larry);
                            StartNewLap();
                        }
                    }
                }

                if (currentLapTiming == null)
                {
                    currentLapTiming = new List <Tuple <float, float> >();
                }

                currentLapTiming.Add(new Tuple <float, float>(lapData.m_lapData[lapData.m_header.m_playerCarIndex].m_lapDistance, lapData.m_lapData[lapData.m_header.m_playerCarIndex].m_currentLapTime));



                lastLapDistance = lapData.m_lapData[lapData.m_header.m_playerCarIndex].m_lapDistance;

                //lastLap = lapData.m_lapData[0].m_lapDistance
                //lastLap = lapData.m_lapData[0].m_lapDistance.ToString();
                //Task.Run(() => WriteTextAsync(@"C:\Users\Andrew\Desktop\f1\output.txt", lapData.m_lapData[0].m_lapDistance.ToString() + Environment.NewLine));

                packetCount++;
                break;

            case 6:
                var tele = new PacketCarTelemetryData();
                tele.RawData = ph.RawData;
                tele.LoadData();
                currentGear = tele.m_carTelemetryData[tele.m_header.m_playerCarIndex].m_gear.ToString();
                currentRPM  = tele.m_carTelemetryData[tele.m_header.m_playerCarIndex].m_engineRPM;
                var rpm = tele.m_carTelemetryData[tele.m_header.m_playerCarIndex].m_revLightsPercent;
                rpmPercent   = rpm.ToString();
                ledRPMStrip1 = false;
                ledRPMStrip2 = false;
                ledRPMStrip3 = false;

                if (rpm > 25)
                {
                    ledRPMStrip1 = true;
                }

                if (rpm > 50)
                {
                    ledRPMStrip2 = true;
                }

                if (rpm > 75)
                {
                    ledRPMStrip3 = true;
                }

                //lastTelemetry = tele;
                break;
            }

            socket.BeginReceive(new AsyncCallback(OnUdpData), socket);
        }