private void timer1_Tick(object sender, EventArgs e) { var packet = new TelemetryPacket(); var byteMessage = PacketUtilities.ConvertPacketToByteArray(packet); udpClient.Send(byteMessage, byteMessage.Length); }
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); }
public bool HasSectorChanged(TelemetryPacket newPacket, TelemetryPacket previousPacket) { var previousSector = (int)previousPacket.Sector; var newSector = (int)newPacket.Sector; return(newSector != previousSector); }
public void AddPacket(TelemetryPacket packet) { lock (syncLock) { Packets.Add(packet); //while (_packets.Any() && _packets.First().Distance < 0) // _packets.Remove(_packets.First()); } }
private void CheckCircuit(TelemetryPacket packet) { var circuit = CircuitRepository.GetByTrackLength(packet.TrackLength); if (circuit.Name != _currectCircuit.Name || _lapType != packet.SessionTypeName) { this.ChangeCircuit(circuit, packet.SessionTypeName); } }
protected void OnPacketProcessed(TelemetryPacket packet) { logger.Debug(packet.ToString()); if (PacketProcessed != null) { PacketProcessed(this, new PacketEventArgs { Packet = packet }); } }
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; }
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); }
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); }
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()); } }
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); }
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); }
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()); }
protected void OnDebugPacketProcessed(TelemetryPacket packet) { #if DEBUG logger.Debug(packet.ToString()); #endif if (DebugPacketProcessed != null) DebugPacketProcessed(this, new PacketEventArgs { Packet = packet }); }
public bool HasSectorChanged(TelemetryPacket newPacket, TelemetryPacket previousPacket) { var previousSector = (int) previousPacket.Sector; var newSector = (int) newPacket.Sector; return (newSector != previousSector); }
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 }
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(); }
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; }
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); } }
protected void OnPacketProcessed(TelemetryPacket packet) { if (PacketProcessed != null) PacketProcessed(this, new PacketEventArgs { Packet = packet }); }
protected void OnPacketProcessed(TelemetryPacket packet) { logger.Debug(packet.ToString()); if (PacketProcessed != null) PacketProcessed(this, new PacketEventArgs { Packet = packet }); }
public void AddPacket(TelemetryPacket packet) { Packets.Add(packet); //while (_packets.Any() && _packets.First().Distance < 0) // _packets.Remove(_packets.First()); }
// 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(); } }
public void SpeedInKmPerHour_is_correct() { var packet = new TelemetryPacket {Speed = 100f }; Assert.AreEqual(360, packet.SpeedInKmPerHour); }