コード例 #1
0
        private void timer1_Tick(object sender, EventArgs e)
        {
            var packet = new TelemetryPacket();
            var byteMessage = PacketUtilities.ConvertPacketToByteArray(packet);

            udpClient.Send(byteMessage, byteMessage.Length);
        }
コード例 #2
0
        public void GetPacketClosestTo_returns_packet_closest_to_supplied_packet()
        {
            var tLap = new TelemetryLap(Circuit.NullCircuit, "LapType");
            tLap.AddPacket(new TelemetryPacket{ LapDistance = 0.529f});
            tLap.AddPacket(new TelemetryPacket { LapDistance = 1.875f });
            tLap.AddPacket(new TelemetryPacket { LapDistance = 3.221f });
            tLap.AddPacket(new TelemetryPacket { LapDistance = 4.567f });
            tLap.AddPacket(new TelemetryPacket { LapDistance = 5.931f });
            tLap.AddPacket(new TelemetryPacket { LapDistance = 7.262f });  // should be closest to this
            tLap.AddPacket(new TelemetryPacket { LapDistance = 8.611f });
            tLap.AddPacket(new TelemetryPacket { LapDistance = 9.961f });
            tLap.AddPacket(new TelemetryPacket { LapDistance = 11.311f });
            tLap.AddPacket(new TelemetryPacket { LapDistance = 12.661f });
            tLap.AddPacket(new TelemetryPacket { LapDistance = 14.013f });
            tLap.AddPacket(new TelemetryPacket { LapDistance = 15.365f });
            tLap.AddPacket(new TelemetryPacket { LapDistance = 16.715f });
            tLap.AddPacket(new TelemetryPacket { LapDistance = 18.067f });
            tLap.AddPacket(new TelemetryPacket { LapDistance = 19.419f });

            var tPacketCompare = new TelemetryPacket { LapDistance = 7.811f };

            var foundPacket = tLap.GetPacketClosestTo(tPacketCompare);

            Assert.AreEqual(7.262f,foundPacket.LapDistance);
        }
コード例 #3
0
ファイル: TelemetryLapManager.cs プロジェクト: trv/F1Speed
        public bool HasSectorChanged(TelemetryPacket newPacket, TelemetryPacket previousPacket)
        {
            var previousSector = (int)previousPacket.Sector;
            var newSector      = (int)newPacket.Sector;

            return(newSector != previousSector);
        }
コード例 #4
0
ファイル: TelemetryLap.cs プロジェクト: trv/F1Speed
 public void AddPacket(TelemetryPacket packet)
 {
     lock (syncLock)
     {
         Packets.Add(packet);
         //while (_packets.Any() && _packets.First().Distance < 0)
         //    _packets.Remove(_packets.First());
     }
 }
コード例 #5
0
ファイル: TelemetryLapManager.cs プロジェクト: trv/F1Speed
        private void CheckCircuit(TelemetryPacket packet)
        {
            var circuit = CircuitRepository.GetByTrackLength(packet.TrackLength);

            if (circuit.Name != _currectCircuit.Name || _lapType != packet.SessionTypeName)
            {
                this.ChangeCircuit(circuit, packet.SessionTypeName);
            }
        }
コード例 #6
0
ファイル: TelemetryLapManager.cs プロジェクト: trv/F1Speed
        protected void OnPacketProcessed(TelemetryPacket packet)
        {
            logger.Debug(packet.ToString());

            if (PacketProcessed != null)
            {
                PacketProcessed(this, new PacketEventArgs {
                    Packet = packet
                });
            }
        }
コード例 #7
0
        public static byte[] ConvertPacketToByteArray(TelemetryPacket packet)
        {
            int size = Marshal.SizeOf(packet);
            byte[] arr = new byte[size];
            IntPtr ptr = Marshal.AllocHGlobal(size);

            Marshal.StructureToPtr(packet, ptr, true);
            Marshal.Copy(ptr, arr, 0, size);
            Marshal.FreeHGlobal(ptr);

            return arr;
        }
コード例 #8
0
        public void HasStartLinePacket_is_true_when_first_packet_time_is_less_than_one_sixtieth_of_second()
        {
            const float cutoff = (1000 / 60000f) + 0.001f;

            // Samples are taken 60 times per second, so first sample must be < 0.018 into the lap.
            // time differs slightly because last sample of last lap might have been nearly 0.017 before end of that lap.
            var tPacket = new TelemetryPacket() {LapTime = cutoff * 0.95f };
            var tLap = new TelemetryLap(Circuit.NullCircuit, "LapType");
            tLap.AddPacket(tPacket);

            Assert.IsTrue(tLap.IsFirstPacketStartLine);
        }
コード例 #9
0
ファイル: PacketUtilities.cs プロジェクト: trv/F1Speed
        public static byte[] ConvertPacketToByteArray(TelemetryPacket packet)
        {
            int size = Marshal.SizeOf(packet);

            byte[] arr = new byte[size];
            IntPtr ptr = Marshal.AllocHGlobal(size);

            Marshal.StructureToPtr(packet, ptr, true);
            Marshal.Copy(ptr, arr, 0, size);
            Marshal.FreeHGlobal(ptr);

            return(arr);
        }
コード例 #10
0
ファイル: TelemetryLap.cs プロジェクト: trv/F1Speed
        public TelemetryPacket GetPacketClosestTo(TelemetryPacket packet)
        {
            lock (syncLock)
            {
                if (!Packets.Any())
                {
                    return(packet);
                }

                var closestPackets = Packets.OrderBy(p => Math.Abs(p.LapDistance - packet.LapDistance)).Take(10);

                return(closestPackets.First());
            }
        }
コード例 #11
0
ファイル: TelemetryLapManager.cs プロジェクト: trv/F1Speed
        protected bool HasLapChanged(TelemetryPacket packet)
        {
            if (CurrentLap == null)
            {
                logger.Info("Lap has changed.  No previous lap");
                return(true);
            }

            if (packet.Lap > CurrentLap.LapNumber || packet.Lap < CurrentLap.LapNumber ||
                (Math.Abs(packet.Lap - CurrentLap.LapNumber) < Constants.Epsilon && CurrentLap.Distance < 0 && packet.Distance > 0))
            {
                logger.Info("Lap has changed - current lap number changed");
                return(true);
            }

            return(packet.LapTime <= 0 && LatestPacket.LapTime > 0);
        }
コード例 #12
0
        public void Returning_to_pits_does_not_set_previous_lap_as_fastest()
        {
            // set outlap
            var manager = new TelemetryLapManager();
            foreach (var packet in TelemetryLapHelper.CreateOutLap().Packets) manager.ProcessIncomingPacket(packet);

            // Add nearly all of a lap
            var firstLap = TelemetryLapHelper.CreatePopulatedLap(lapNumber: 1f, completeLap: true);
            for (var i = 0; i < firstLap.Packets.Count - 2; i++) manager.ProcessIncomingPacket(firstLap.Packets[i]);

            Assert.IsNull(manager.FastestLap);

            var garagePacket = new TelemetryPacket {Lap = 0f, Speed = 0f, LapDistance = -0.001f};
            Assert.IsTrue(garagePacket.IsSittingInPits);
            manager.ProcessIncomingPacket(garagePacket);

            Assert.IsNull(manager.FastestLap);
        }
コード例 #13
0
        public void AddPacket(TelemetryPacket packet)
        {
            Packets.Add(packet);

            if (packet.SpeedInKmPerHour > _topSpeed)
                _topSpeed = packet.SpeedInKmPerHour;

                _gearChanges+=packet.Gear;
                _timeBraking += packet.Brake;

            //while (_packets.Any() && _packets.First().Distance < 0)
            //    _packets.Remove(_packets.First());
        }
コード例 #14
0
        protected void OnDebugPacketProcessed(TelemetryPacket packet)
        {
            #if DEBUG
            logger.Debug(packet.ToString());
            #endif

            if (DebugPacketProcessed != null)
                DebugPacketProcessed(this, new PacketEventArgs { Packet = packet });
        }
コード例 #15
0
        public bool HasSectorChanged(TelemetryPacket newPacket, TelemetryPacket previousPacket)
        {
            var previousSector = (int) previousPacket.Sector;
            var newSector = (int) newPacket.Sector;

            return (newSector != previousSector);
        }
コード例 #16
0
ファイル: TelemetryLapManager.cs プロジェクト: trv/F1Speed
        public void ProcessIncomingPacket(TelemetryPacket packet)
        {
            lock (syncLock)
            {
                HasDataBeenReceived = true;
                if (F1SpeedSettings.LogPacketData)
                {
                    OnPacketProcessed(packet);
                }

                CheckCircuit(packet);

                if (HasLapChanged(packet))
                {
                    if (!packet.IsInPitLane)
                    {
                        _lastLapTime = packet.PreviousLapTime;
                        _lastLapFuel = packet.FuelRemaining;
                        CurrentLap.MarkLapCompleted();
                    }
                    else
                    {
                        OnReturnedToGarage(CurrentLap);
                    }

                    if (CurrentLap.IsCompleteLap && (int)packet.Lap != 0 && (int)packet.Lap > CurrentLap.LapNumber)
                    {
                        if (string.IsNullOrEmpty(CurrentLap.CircuitName) && string.IsNullOrEmpty(CurrentLap.LapType))
                        {
                            CurrentLap.LapType = _lapType;
                        }

                        foreach (var exporter in _currentLapExporters)
                        {
                            exporter.Save(CurrentLap);
                        }

                        if (IsCurrentLapFastestLap)
                        {
                            OnSetFastestLap(new LapEventArgs {
                                Lap = CurrentLap
                            }, FastestLap);

                            FastestLap = CurrentLap;
                            SaveFastestLap();
                        }

                        OnCompletedFullLap(new CompletedFullLapEventArgs {
                            CompletedLap      = CurrentLap,
                            CurrentLapNumber  = (int)packet.Lap,
                            PreviousLapNumber = CurrentLap.LapNumber
                        });
                    }
                    else
                    {
                        if (CurrentLap.IsOutLap)
                        {
                            OnFinishedOutLap(CurrentLap);
                        }

                        // Lap is invalid
                        //_laps.Remove(CurrentLap);

                        //OnRemovedLap(CurrentLap);
                    }

                    // Start new current lap
                    _laps.Add(new TelemetryLap(_currectCircuit, _lapType));
                    CurrentLap.AddPacket(packet);
                    OnStartedLap(CurrentLap);
                }
                else
                {
                    CurrentLap.AddPacket(packet);
                }
            }  // end lock
        }
コード例 #17
0
        public TelemetryPacket GetPacketClosestTo(TelemetryPacket packet)
        {
            if (!Packets.Any())
                return packet;

            var closestPackets = Packets.OrderBy(p => Math.Abs(p.LapDistance - packet.LapDistance)).Take(10);

            return closestPackets.First();
        }
コード例 #18
0
        protected bool HasLapChanged(TelemetryPacket packet)
        {
            if (CurrentLap == null)
            {
                logger.Info("Lap has changed.  No previous lap");
                return true;
            }

            if (packet.Lap > CurrentLap.LapNumber || packet.Lap < CurrentLap.LapNumber ||
                (Math.Abs(packet.Lap - CurrentLap.LapNumber) < Constants.Epsilon && CurrentLap.Distance < 0 && packet.Distance > 0))
            {
                logger.Info("Lap has changed - current lap number changed");
                return true;
            }

            return packet.LapTime <= 0 && LatestPacket.LapTime > 0;
        }
コード例 #19
0
 private void CheckCircuit(TelemetryPacket packet)
 {
     var circuit = CircuitRepository.GetByTrackLength(packet.TrackLength);
     if (circuit.Name != _currectCircuit.Name || _lapType != packet.SessionTypeName)
     {
         this.ChangeCircuit(circuit, packet.SessionTypeName);
     }
 }
コード例 #20
0
        public void ProcessIncomingPacket(TelemetryPacket packet)
        {
            lock (syncLock)
            {
                HasDataBeenReceived = true;
                if (F1SpeedSettings.LogPacketData)
                    OnPacketProcessed(packet);

                CheckCircuit(packet);

                if (HasLapChanged(packet))
                {
                    if (!packet.IsInPitLane)
                        CurrentLap.MarkLapCompleted();
                    else
                        OnReturnedToGarage(CurrentLap);

                    if (CurrentLap.IsCompleteLap)
                    {
                        if (string.IsNullOrEmpty(CurrentLap.CircuitName))

                            if (string.IsNullOrEmpty(CurrentLap.LapType))
                                CurrentLap.LapType = _lapType;

                        foreach (var exporter in _currentLapExporters) exporter.Save(CurrentLap);

                        if (FastestLap == null || CurrentLap.LapTime < FastestLap.LapTime)
                        {
                            OnSetFastestLap(new LapEventArgs {Lap = CurrentLap}, FastestLap);

                            FastestLap = CurrentLap;
                            SaveFastestLap();
                        }

                        OnCompletedFullLap(new CompletedFullLapEventArgs
                            {
                                CompletedLap = CurrentLap,
                                CurrentLapNumber = (int) packet.Lap,
                                PreviousLapNumber = CurrentLap.LapNumber
                            });
                    }
                    else
                    {
                        if (CurrentLap.IsOutLap)
                            OnFinishedOutLap(CurrentLap);

                        // Lap is invalid
                        _laps.Remove(CurrentLap);

                        OnRemovedLap(CurrentLap);
                    }

                    // Start new current lap
                    _laps.Add(new TelemetryLap(_currectCircuit, _lapType));
                }

                CurrentLap.AddPacket(packet);
            }
        }
コード例 #21
0
 protected void OnPacketProcessed(TelemetryPacket packet)
 {
     if (PacketProcessed != null)
         PacketProcessed(this, new PacketEventArgs { Packet = packet });
 }
コード例 #22
0
        protected void OnPacketProcessed(TelemetryPacket packet)
        {
            logger.Debug(packet.ToString());

            if (PacketProcessed != null)
                PacketProcessed(this, new PacketEventArgs { Packet = packet });
        }
コード例 #23
0
ファイル: TelemetryLap.cs プロジェクト: Ensi-Ferrum/F1Speed
 public void AddPacket(TelemetryPacket packet)
 {
     Packets.Add(packet);
     //while (_packets.Any() && _packets.First().Distance < 0)
     //    _packets.Remove(_packets.First());
 }
コード例 #24
0
ファイル: Form1.cs プロジェクト: Ensi-Ferrum/F1Speed
        // This method runs continously in the data collection thread.  It
        // waits to receive UDP packets from the game, converts them and writes
        // them to the shared struct variable.
        private void FetchData()
        {
            while (true)
            {
                // Get the data (this will block until we get a packet)
                Byte[] receiveBytes = udpSocket.Receive(ref senderIP);

                // Lock access to the shared struct
                syncMutex.WaitOne();

                TransmissionLabel.BackColor = Color.Green;

                // Convert the bytes received to the shared struct
                latestData = PacketUtilities.ConvertToPacket(receiveBytes);
                manager.ProcessIncomingPacket(latestData);

                //TransmissionLabel.BackColor = Color.Red;

                // Release the lock again
                syncMutex.ReleaseMutex();
            }
        }
コード例 #25
0
        public void SpeedInKmPerHour_is_correct()
        {
            var packet = new TelemetryPacket {Speed = 100f };

            Assert.AreEqual(360, packet.SpeedInKmPerHour);
        }