private static void UnitTest() { var testfileName = "unittest.data"; Stream fOut = new FileStream(testfileName, FileMode.Create, FileAccess.Write); bool waar = true; int drie = 3; bool onwaar = false; float vloot = 17.5f; PacketHelper.SafeWrite <bool>(fOut, waar, PacketSize.BoolSize); PacketHelper.SafeWrite <bool>(fOut, onwaar, PacketSize.BoolSize); PacketHelper.SafeWrite <int>(fOut, drie, PacketSize.IntSize); PacketHelper.SafeWrite <float>(fOut, vloot, PacketSize.FloatSize); PacketHelper.SafeWrite <bool>(fOut, waar, PacketSize.BoolSize); PacketHelper.SafeWrite <bool>(fOut, onwaar, PacketSize.BoolSize); fOut.Close(); Stream fIn = new FileStream(testfileName, FileMode.Open, FileAccess.Read); waar = PacketHelper.SafeRead <bool>(fIn, PacketSize.BoolSize); if (waar != true) { throw new Exception("fout"); } ; onwaar = PacketHelper.SafeRead <bool>(fIn, PacketSize.BoolSize); if (onwaar != false) { throw new Exception("fout"); } ; drie = PacketHelper.SafeRead <int>(fIn, PacketSize.IntSize); if (drie != 3) { throw new Exception("fout"); } ; vloot = PacketHelper.SafeRead <float>(fIn, PacketSize.FloatSize); if (vloot != 17.5f) { throw new Exception("fout"); } ; waar = PacketHelper.SafeRead <bool>(fIn, PacketSize.BoolSize); if (waar != true) { throw new Exception("fout"); } ; onwaar = PacketHelper.SafeRead <bool>(fIn, PacketSize.BoolSize); if (onwaar != false) { throw new Exception("fout"); } ; fIn.Close(); }
public CompletedLap(string filename) { Stream fData = new FileStream(filename, FileMode.Open, FileAccess.Read); byte[] data = new byte[fData.Length]; long totalRead = 0; while (totalRead < fData.Length) { totalRead += fData.Read(data, (int)totalRead, (int)fData.Length); } MemoryStream fIn = new MemoryStream(data); int version = PacketHelper.SafeRead <int>(fIn, PacketSize.IntSize); if (version != 211) { // Invalid; return; } lap = new LapRecording() { lapTelemetry = new List <TelemetryInContext>(), lapMotion = new List <MotionInContext>(), lapData = new List <LapDataInContext>() }; circuitInfo = PacketHelper.SafeRead <PacketSessionData>(fIn, PacketSize.PacketSessionDataSize); playerInfo = PacketHelper.SafeRead <ParticipantData>(fIn, PacketSize.ParticipantDataSize); lap.complete = PacketHelper.SafeRead <bool>(fIn, PacketSize.BoolSize); lap.FirstTiming = PacketHelper.SafeRead <LapData>(fIn, PacketSize.LapDataSize); if (version == 210) { var lapTimeAsFloat = PacketHelper.SafeRead <float>(fIn, PacketSize.FloatSize); lap.lapTimeInMs = (UInt32)Math.Round(lapTimeAsFloat * 1000f, 0); } else { lap.lapTimeInMs = PacketHelper.SafeRead <UInt32>(fIn, PacketSize.UInt32Size); } lap.started = PacketHelper.SafeRead <bool>(fIn, PacketSize.BoolSize); lap.valid = PacketHelper.SafeRead <bool>(fIn, PacketSize.BoolSize); lap.Setup = PacketHelper.SafeRead <CarSetupData>(fIn, PacketSize.CarSetupDataSize); var timingCount = PacketHelper.SafeRead <int>(fIn, PacketSize.IntSize); for (int i = 0; i < timingCount; i++) { lap.lapMotion.Add(PacketHelper.SafeRead <MotionInContext>(fIn, PacketSize.MotionInContextSize)); } var telemetryCount = PacketHelper.SafeRead <int>(fIn, PacketSize.IntSize); for (int i = 0; i < telemetryCount; i++) { lap.lapTelemetry.Add(PacketHelper.SafeRead <TelemetryInContext>(fIn, PacketSize.TelemetryInContextSize)); } var lapDataCount = PacketHelper.SafeRead <int>(fIn, PacketSize.IntSize); for (int i = 0; i < lapDataCount; i++) { lap.lapData.Add(PacketHelper.SafeRead <LapDataInContext>(fIn, PacketSize.LapDataInContextSize)); } fIn.Close(); }
void HandlePacket(Stream fIn, CancellationToken token) { // read Header var packet = new PacketInfo() { sequence = packetCount }; packet.header = PacketHelper.SafeRead <PacketHeader>(fIn, PacketSize.PacketHeaderSize); if (fIn.Position == fIn.Length) { // No more data return; } // callBack.Log($"{packet.header.frameIdentifier}-"); while (packet.header.frameIdentifier == 0 && packet.header.packetFormat != 2021) { // empty packet? packet.header = PacketHelper.SafeRead <PacketHeader>(fIn, PacketSize.PacketHeaderSize); } //if (packet.header.packetFormat != 2020 && packet.header.packetFormat != 2021) //{ // callBack.LogLine($"FATAL: Invalid packet format: last Packet {packet.header.packetFormat}"); // //throw new Exception($"Invalid packet format: last Packet {packet.header.packetFormat}"); //} if (ReaderMode == ReaderMode.rmReplay) { // Simulate time if (Starttijd == DateTime.MinValue) { Starttijd = DateTime.Now.Add(TimeSpan.FromSeconds(-packet.header.sessionTime)); } else { bool inPause = callBack.IsPausing(); DateTime startPause = DateTime.Now; while (!token.IsCancellationRequested && (callBack.IsPausing() || (Starttijd.Add(TimeSpan.FromSeconds(packet.header.sessionTime)) > DateTime.Now))) { Thread.Sleep(1); } if (inPause) { Starttijd = Starttijd.Add(DateTime.Now - startPause); } } } switch (packet.header.packetId) { case 0: // Motion { if (logPackets) { callBack.Log("."); // Motion info } packet.details = PacketHelper.SafeRead <PacketMotionData>(fIn, PacketSize.PacketMotionDataSize); callBack.UpdateMotion(packet.header, (PacketMotionData)packet.details); break; } case 1: // Session { if (logPackets) { callBack.Log($"1S"); // Data about the session – track, time left } packet.details = PacketHelper.SafeRead <PacketSessionData>(fIn, PacketSize.PacketSessionDataSize); callBack.UpdateSession(packet.header, (PacketSessionData)packet.details); break; } case 2: // Lap { if (logPackets) { callBack.Log($"2L"); // Data about all the lap times of cars in the session } packet.details = PacketHelper.SafeRead <PacketLapData>(fIn, PacketSize.PacketLapDataSize); callBack.UpdateLapdata(packet.header, (PacketLapData)packet.details); break; } case 3: // Event { if (logPackets) { callBack.Log($"3E"); } var ped = new PacketEventData() { eventStringCode = PacketHelper.GetEventType(fIn), eventDetails = null }; packet.details = ped; // Depending on type of event the contents may differ. In C++ this is a union. Therefore the largest packetsize is the size. byte[] data = new byte[PacketSize.FlashbackSize]; if (fIn.Read(data, 0, PacketSize.FlashbackSize) != PacketSize.FlashbackSize) { throw new Exception("Size error"); } // Read all the remaining bytes into a memory stream to be able to proces them later MemoryStream ms = new MemoryStream(data); switch (ped.eventStringCode) { case EventType.Unknown: break; case EventType.SessionStarted: callBack.StartSession(packet.header); break; case EventType.SessionEnded: callBack.EndSession(packet.header); SaveData(); break; case EventType.FastestLap: ped.eventDetails = PacketHelper.SafeRead <FastestLap>(ms, PacketSize.FastestLapSize); break; case EventType.Retirement: ped.eventDetails = PacketHelper.SafeRead <Retirement>(ms, PacketSize.RetirementSize); break; case EventType.DRSEnabled: break; case EventType.DRSDisabled: break; case EventType.TeammateInPits: ped.eventDetails = PacketHelper.SafeRead <TeamMateInPits>(ms, PacketSize.TeamMateInPitsSize); break; case EventType.CheckeredFlag: break; case EventType.RaceWinner: ped.eventDetails = PacketHelper.SafeRead <RaceWinner>(ms, PacketSize.RaceWinnerSize); break; case EventType.PenaltyIssued: ped.eventDetails = PacketHelper.SafeRead <Penalty>(ms, PacketSize.PenaltySize); break; case EventType.SpeedTrapTriggered: ped.eventDetails = PacketHelper.SafeRead <SpeedTrap>(ms, PacketSize.SpeedTrapSize); break; default: break; } if (logPackets) { Console.Write("Evt "); // Various notable events that happen during a session } break; } case 4: // Participants { if (logPackets) { callBack.Log($"4P"); /// List of participants in the session, mostly relevant for multiplayer } packet.details = PacketHelper.SafeRead <PacketParticipantsData>(fIn, PacketSize.PacketParticipantsDataSize); Task t = new Task(() => { callBack.UpdatePaticipants((PacketParticipantsData)packet.details); }); t.Start(); break; } case 5: // Car Setup { if (logPackets) { callBack.Log("5C"); } packet.details = PacketHelper.SafeRead <PacketCarSetupData>(fIn, PacketSize.PacketCarSetupDataSize); Console.Write("Setup "); /// Packet detailing car setups for cars in the race callBack.UpdateSetup(packet.header, (PacketCarSetupData)packet.details); break; } case 6: // Car telemetry { if (logPackets) { callBack.Log("6T"); /// Telemetry data for all carsbreak; } packet.details = PacketHelper.SafeRead <PacketCarTelemetryData>(fIn, PacketSize.PacketCarTelemetryDataSize); callBack.UpdateTelemetry(packet.header, (PacketCarTelemetryData)packet.details); break; } case 7: // Car Status { if (logPackets) { callBack.Log("7ST"); } packet.details = PacketHelper.SafeRead <PacketCarStatusData>(fIn, PacketSize.PacketCarStatusDataSize); break; } case 8: // Final classification { if (logPackets) { callBack.Log("8F"); } packet.details = PacketHelper.SafeRead <PacketFinalClassificationData>(fIn, PacketSize.PacketFinalClassificationDataSize); break; } case 9: // Lobby { if (logPackets) { callBack.Log("9L"); } packet.details = PacketHelper.SafeRead <PacketLobbyInfoData>(fIn, PacketSize.PacketLobbyInfoDataSize); break; } case 10: // Car Damage { if (logPackets) { callBack.Log("10L"); } packet.details = PacketHelper.SafeRead <PacketCarDamageData>(fIn, PacketSize.PacketCarDamageDataSize); break; } case 11: // Session history { if (logPackets) { callBack.Log("11L"); } packet.details = PacketHelper.SafeRead <PacketSessionHistoryData>(fIn, PacketSize.PacketSessionHistoryDataSize); break; } default: { Console.Write($"??? Unknown packet type: {packet.header.packetId}"); callBack.LogLine($"??? Unknown packet type: {packet.header.packetId}"); break; } } // notificate UI of packet callBack.AddPacket(packet); lastPacket = packet; }