public static byte[] ToR3EDash(IGameTelemetry gt) { using (var stream = new MemoryStream()) { using (var writer = new Utf8JsonWriter(stream, JsonWriterOptions)) { WriteR3EDash(writer, gt); } return(stream.ToArray()); } }
private static void WriteR3EDash(Utf8JsonWriter w, IGameTelemetry gt) { w.WriteObject(_ => { w.WriteNumber("VersionMajor", MajorVersion); w.WriteNumber("VersionMinor", MinorVersion); // AllDriversOffset // DriverDataSize // GamePaused w.WriteNumber("GameInMenus", gt.Session is null ? -1 : MatchAsInt32(gt.GameState, GameState.Menu)); w.WriteNumber("GameInReplay", gt.Session is null ? -1 : MatchAsInt32(gt.GameState, GameState.Replay)); w.WriteNumber("GameUsingVr", gt.Session is null ? -1 : ToInt32(gt.UsingVR)); w.WriteObject("Player", _ => { // Player.GameSimulationTicks // Player.GameSimulationTime w.WriteCoordinates("Position", gt.Player?.CgLocation, d => d.M); // Player.Velocity.X // Player.Velocity.Y // Player.Velocity.Z // Player.LocalVelocity.X // Player.LocalVelocity.Y // Player.LocalVelocity.Z // Player.Acceleration.X // Player.Acceleration.Y // Player.Acceleration.Z w.WriteCoordinates("LocalAcceleration", gt.Player?.LocalAcceleration, a => a.MPS2); // Player.Orientation.X // Player.Orientation.Y // Player.Orientation.Z // Player.Rotation.X // Player.Rotation.Y // Player.Rotation.Z // Player.AngularAcceleration.X // Player.AngularAcceleration.Y // Player.AngularAcceleration.Z // Player.AngularVelocity.X // Player.AngularVelocity.Y // Player.AngularVelocity.Z // Player.LocalAngularVelocity.X // Player.LocalAngularVelocity.Y // Player.LocalAngularVelocity.Z w.WriteCoordinates("LocalGforce", gt.Player?.LocalAcceleration, a => a.ApproxG); // Player.SteeringForce // Player.SteeringForcePercentage // Player.EngineTorque // Player.CurrentDownforce // Player.Voltage // Player.ErsLevel // Player.PowerMguH // Player.PowerMguK // Player.TorqueMguK // Player.SuspensionDeflection.FrontLeft // Player.SuspensionDeflection.FrontRight // Player.SuspensionDeflection.RearLeft // Player.SuspensionDeflection.RearRight // Player.SuspensionVelocity.FrontLeft // Player.SuspensionVelocity.FrontRight // Player.SuspensionVelocity.RearLeft // Player.SuspensionVelocity.RearRight // Player.Camber.FrontLeft // Player.Camber.FrontRight // Player.Camber.RearLeft // Player.Camber.RearRight // Player.RideHeight.FrontLeft // Player.RideHeight.FrontRight // Player.RideHeight.RearLeft // Player.RideHeight.RearRight // Player.FrontWingHeight // Player.FrontRollAngle // Player.RearRollAngle // Player.thirdSpringSuspensionDeflectionFront // Player.thirdSpringSuspensionVelocityFront // Player.thirdSpringSuspensionDeflectionRear // Player.thirdSpringSuspensionVelocityRear }); // TrackName // LayoutName // TrackId // LayoutId w.WriteRoundedNumber("LayoutLength", (gt.Event?.Track.Length?.M) ?? -1.0); w.WriteSectors("SectorStartFactors", gt.Event?.Track.SectorsEnd, st => st.Fraction); // RaceSessionLaps.Race1 // RaceSessionLaps.Race2 // RaceSessionLaps.Race3 // RaceSessionMinutes.Race1 // RaceSessionMinutes.Race2 // RaceSessionMinutes.Race3 // EventIndex w.WriteNumber("SessionType", gt.Session?.Type switch { SessionType.Practice => 0, SessionType.Qualify => 1, SessionType.Race => 2, SessionType.Warmup => 3, _ => - 1 }); // SessionIteration // SessionLengthFormat w.WriteNumber("SessionLengthFormat", gt.Session?.Length switch { TimeDuration => 0, LapsDuration => 1, TimePlusLapsDuration => 2, _ => - 1 });