private void AddPlayerCarInfo(rF2VehicleTelemetry data, SimulatorDataSet simData) { CarInfo playerCar = simData.PlayerInfo.CarInfo; int totalDent = data.mDentSeverity.Aggregate((x, y) => (byte)(x + y)); int maxDent = data.mDentSeverity.Max(); playerCar.CarDamageInformation.Bodywork.Damage = totalDent / 16.0; if (maxDent == 1) { playerCar.CarDamageInformation.Bodywork.MediumDamageThreshold = playerCar.CarDamageInformation.Bodywork.Damage; } else if (maxDent == 2) { playerCar.CarDamageInformation.Bodywork.MediumDamageThreshold = 0; playerCar.CarDamageInformation.Bodywork.HeavyDamageThreshold = playerCar.CarDamageInformation.Bodywork.Damage; } if (data.mOverheating == 1) { playerCar.CarDamageInformation.Engine.Damage = 1; } /*playerCar.WorldOrientation = new Orientation() * { * Yaw = Angle.GetFromRadians(Math.Atan2(data.mOri[2].x, data.mOri[2].z)), * };*/ playerCar.SpeedLimiterEngaged = data.mSpeedLimiter == 1; playerCar.FrontDownForce = Force.GetFromNewtons(data.mFrontDownforce); playerCar.RearDownForce = Force.GetFromNewtons(data.mRearDownforce); }
private void AddTyresAndFuelInfo(SimulatorDataSet simData, rF2VehicleTelemetry playerVehicleTelemetry) { simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.TyrePressure = Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mPressure); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.TyrePressure = Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mPressure); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.TyrePressure = Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mPressure); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.TyrePressure = Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mPressure); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.TyreWear = 1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mWear; simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.TyreWear = 1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mWear; simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.TyreWear = 1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mWear; simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.TyreWear = 1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mWear; // Front Left Tyre Temps simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.LeftTyreTemp = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mTemperature[0]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.RightTyreTemp = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mTemperature[2]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.CenterTyreTemp = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mTemperature[1]); // Front Right Tyre Temps simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.LeftTyreTemp = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mTemperature[0]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.RightTyreTemp = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mTemperature[2]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.CenterTyreTemp = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mTemperature[1]); // Rear Left Tyre Temps simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.LeftTyreTemp = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mTemperature[0]); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.RightTyreTemp = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mTemperature[2]); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.CenterTyreTemp = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mTemperature[1]); // Rear Right Tyre Temps simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.LeftTyreTemp = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mTemperature[0]); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.RightTyreTemp = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mTemperature[2]); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.CenterTyreTemp = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mTemperature[1]); // Fuel System simData.PlayerInfo.CarInfo.FuelSystemInfo.FuelCapacity = Volume.FromLiters(playerVehicleTelemetry.mFuelCapacity); simData.PlayerInfo.CarInfo.FuelSystemInfo.FuelRemaining = Volume.FromLiters(playerVehicleTelemetry.mFuel); }
private void FillPlayerCarInfo(rF2VehicleTelemetry playerVehicleTelemetry, SimulatorDataSet simData) { TimeSpan playerSessionTime = TimeSpan.FromSeconds(playerVehicleTelemetry.mElapsedTime); //simData.SessionInfo.SessionTime = playerSessionTime; /*if (playerSessionTime > simData.SessionInfo.SessionTime && playerSessionTime > _lastPlayerTime) * { * simData.SessionInfo.SessionTime = playerSessionTime; * _lastPlayerTime = playerSessionTime; * } * else * { * playerSessionTime = TimeSpan.Zero; * }*/ simData.PlayerInfo.CarInfo.EngineRpm = (int)playerVehicleTelemetry.mEngineRPM; switch (playerVehicleTelemetry.mGear) { case 0: simData.PlayerInfo.CarInfo.CurrentGear = "N"; break; case -1: simData.PlayerInfo.CarInfo.CurrentGear = "R"; break; case -2: simData.PlayerInfo.CarInfo.CurrentGear = string.Empty; break; default: simData.PlayerInfo.CarInfo.CurrentGear = playerVehicleTelemetry.mGear.ToString(); break; } }
private static void AddPedalInfo(rF2VehicleTelemetry playerVehicleTelemetry, SimulatorDataSet simData) { simData.InputInfo.ThrottlePedalPosition = playerVehicleTelemetry.mUnfilteredThrottle; simData.InputInfo.BrakePedalPosition = playerVehicleTelemetry.mUnfilteredBrake; simData.InputInfo.ClutchPedalPosition = playerVehicleTelemetry.mUnfilteredClutch; simData.InputInfo.SteeringInput = playerVehicleTelemetry.mUnfilteredSteering; }
private static void AddBrakesInfo(rF2VehicleTelemetry playerVehicleTelemetry, SimulatorDataSet simData) { simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.BrakeTemperature = Temperature.FromKelvin( playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mBrakeTemp); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.BrakeTemperature = Temperature.FromKelvin( playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mBrakeTemp); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.BrakeTemperature = Temperature.FromKelvin( playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mBrakeTemp); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.BrakeTemperature = Temperature.FromKelvin( playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mBrakeTemp); }
public SimulatorDataSet CreateSimulatorDataSet(Rf2FullData rfData) { SimulatorDataSet simData = new SimulatorDataSet("Rfactor 2"); simData.SimulatorSourceInfo.HasLapTimeInformation = true; simData.SimulatorSourceInfo.SimNotReportingEndOfOutLapCorrectly = true; simData.SimulatorSourceInfo.SectorTimingSupport = DataInputSupport.FULL; FillSessionInfo(rfData, simData); AddDriversData(simData, rfData); if (_lastPlayerId == -1) { return(simData); } try { rF2VehicleTelemetry playerF2VehicleTelemetry = rfData.telemetry.mVehicles.First(x => x.mID == _lastPlayerId); FillPlayersGear(playerF2VehicleTelemetry, simData); // PEDAL INFO AddPedalInfo(playerF2VehicleTelemetry, simData); // WaterSystemInfo AddWaterSystemInfo(playerF2VehicleTelemetry, simData); // OilSystemInfo AddOilSystemInfo(playerF2VehicleTelemetry, simData); // Brakes Info AddBrakesInfo(playerF2VehicleTelemetry, simData); // Tyre Pressure Info AddTyresAndFuelInfo(simData, playerF2VehicleTelemetry); // Acceleration AddAcceleration(simData, playerF2VehicleTelemetry); currentlyIgnoredPackage = 0; } catch (ArgumentException) { } return(simData); }
public static rF2VehicleTelemetry GetPlayerTelemetry(int id, ref rF2Telemetry telemetry) { var playerVehTelemetry = new rF2VehicleTelemetry(); for (int i = 0; i < telemetry.mNumVehicles; ++i) { var vehicle = telemetry.mVehicles[i]; if (vehicle.mID == id) { playerVehTelemetry = vehicle; break; } } return(playerVehTelemetry); }
private static void FillPlayersGear(rF2VehicleTelemetry playerVehicleTelemetry, SimulatorDataSet simData) { switch (playerVehicleTelemetry.mGear) { case 0: simData.PlayerInfo.CarInfo.CurrentGear = "N"; break; case -1: simData.PlayerInfo.CarInfo.CurrentGear = "R"; break; case -2: simData.PlayerInfo.CarInfo.CurrentGear = String.Empty; break; default: simData.PlayerInfo.CarInfo.CurrentGear = playerVehicleTelemetry.mGear.ToString(); break; } }
private static void AddWaterSystemInfo(rF2VehicleTelemetry playerVehicleTelemetry, SimulatorDataSet simData) { simData.PlayerInfo.CarInfo.WaterSystemInfo.WaterTemperature = Temperature.FromCelsius(playerVehicleTelemetry.mEngineWaterTemp); }
public async Task Run(CancellationToken token) { var hubConnection = await _connectionManager.Connect(); var telemetry = new rF2Telemetry(); var scoring = new rF2Scoring(); var playerScoring = new rF2VehicleScoring(); var playerTelemetry = new rF2VehicleTelemetry(); while (true) { await Task.Delay(200); try { _scoringBuffer.GetMappedDataPartial(ref scoring); _telemetryBuffer.GetMappedDataPartial(ref telemetry); } catch (Exception) { await _connectionManager.Disconnect(hubConnection); return; } if (telemetry.mNumVehicles != 0 && scoring.mScoringInfo.mNumVehicles != 0 && (rFactor2Constants.rF2GamePhase)scoring.mScoringInfo.mGamePhase == rFactor2Constants.rF2GamePhase.GreenFlag) { var mappedIds = MapmIdToPositionInArray(ref telemetry); foreach (var scoringVehicle in scoring.mVehicles) { switch ((rFactor2Constants.rF2Control)scoringVehicle.mControl) { case rFactor2Constants.rF2Control.AI: case rFactor2Constants.rF2Control.Player: case rFactor2Constants.rF2Control.Remote: if (scoringVehicle.mIsPlayer == 1) { playerScoring = scoringVehicle; } break; default: continue; } if (playerScoring.mIsPlayer == 1) { break; } } var playerTelemetryId = -1; if (mappedIds.TryGetValue(playerScoring.mID, out playerTelemetryId)) { playerTelemetry = telemetry.mVehicles[playerTelemetryId]; } else { continue; } var telemetryToSend = new Test { Telemetry = new Telemetry(ref playerTelemetry) }; await hubConnection.SendAsync("Send", telemetryToSend); } } }
ApiResponse getData() { ApiResponse res = new ApiResponse(); Console.Clear(); Program.extendedBuffer.GetMappedData(ref Program.extended); Program.scoringBuffer.GetMappedData(ref Program.scoring); Program.telemetryBuffer.GetMappedData(ref Program.telemetry); Program.rulesBuffer.GetMappedData(ref Program.rules); var scoring = Program.scoring; var telemetry = Program.telemetry; var rules = Program.rules; res.Session = new LiveTiming.Session { MaxLaps = scoring.mScoringInfo.mMaxLaps, MaxTime = scoring.mScoringInfo.mEndET - Constants.MAXTIMECOUNTDOWN, // I assume that the seconds are just becaus of the red light countdown until the lights go on CurrentTime = Math.Floor(scoring.mScoringInfo.mCurrentET), CurrentLaps = 0, YellowFlags = new bool[3], IsRace = scoring.mScoringInfo.mSession >= 10 && scoring.mScoringInfo.mSession <= 13, IsSessionStarted = scoring.mScoringInfo.mGamePhase == 5, IsVCY = scoring.mScoringInfo.mGamePhase == 6 }; for (int i = 0; i < 3; i++) { int raw = Convert.ToInt32(scoring.mScoringInfo.mSectorFlag[i]); res.Session.YellowFlags[i] = raw != 11; } foreach (sbyte flag in scoring.mScoringInfo.mSectorFlag) { rF2YellowFlagState state = (rF2YellowFlagState)flag; Console.WriteLine("Flag {0}", (rF2YellowFlagState)flag); } List <Entry> entries = new List <Entry>(); for (int i = 0; i < scoring.mScoringInfo.mNumVehicles; ++i) { rF2VehicleScoring vehicle = scoring.mVehicles[i]; rF2VehicleTelemetry vehicleTelementry = telemetry.mVehicles[i]; dynamic foo = vehicle.mTrackEdge; //?? Console.WriteLine(foo); rF2TrackRulesParticipant participant = rules.mParticipants[i]; String[] nameParts = this.GetStringFromBytes(vehicle.mDriverName).Split(' '); String vehicleName = this.GetStringFromBytes(vehicleTelementry.mVehicleName); String[] vehicleNameParts = vehicleName.Split('#'); int number = 999; try { number = Convert.ToInt32(vehicleNameParts[1]); } catch (Exception) { } String teamName = this.GetStringFromBytes(vehicle.mPitGroup); String format = "{0}"; foreach (JObject driverEntry in this.entries.Children()) { if (driverEntry["driverNumber"].ToString() == number.ToString()) { teamName = driverEntry["teamName"].ToString(); format = driverEntry["driverNumberFormat"].ToString(); } } TimeSpan diff = TimeSpan.FromSeconds(vehicle.mTimeBehindNext); String diffString = diff.ToString(); String bestLapString = TimeSpan.FromSeconds(vehicle.mBestLapTime).ToString(@"mm\:ss\:fff"); String lastLapString = TimeSpan.FromSeconds(vehicle.mLastLapTime).ToString(@"mm\:ss\:fff"); if (diff.TotalHours < 1) { if (diff.TotalMinutes < 1) { diffString = diff.ToString(@"ss\:fff"); } else { diffString = diff.ToString(@"mm\:ss\:fff"); } } diffString = String.Format("+ {0}", diffString); int positionDifference = Program.lastResponse != null ? vehicle.mPlace - Program.lastResponse.Drivers.First(d => d.SlotID == vehicle.mID).Position : 0; Console.Write(positionDifference); Entry entry = new Entry { SlotID = vehicle.mID, TeamName = teamName, VehicleName = vehicleNameParts.Length > 1 ? vehicleNameParts[0] : vehicleName, NumberFormat = format, Number = number, FormattedNumber = String.Format(format, number), FirstName = nameParts.Length > 1 ? nameParts[0] : "", LastName = nameParts.Length > 1 ? nameParts[1] : nameParts[0], Position = vehicle.mPlace, EntryClass = this.GetStringFromBytes(vehicle.mVehicleClass), FrontTires = this.GetStringFromBytes(vehicleTelementry.mFrontTireCompoundName), RearTires = this.GetStringFromBytes(vehicleTelementry.mRearTireCompoundName), PitState = Constants.PitStates[vehicle.mPitState], TimeBehind = vehicle.mTimeBehindNext, TimeBehindString = diffString, LapsBehind = vehicle.mLapsBehindNext, Stops = vehicle.mNumPitstops, Status = Constants.Status[vehicle.mFinishStatus], HasHeatingProblem = vehicleTelementry.mOverheating != 0, HasLostParts = vehicleTelementry.mDetached != 0, CurrentLapString = TimeSpan.FromSeconds(res.Session.CurrentTime - vehicleTelementry.mLapStartET).ToString(@"mm\:ss\:fff"), PositionDifference = vehicle.mQualification - vehicle.mPlace, LastSectorTimes = new double[] { vehicle.mLastSector1, vehicle.mLastSector2, vehicle.mLastLapTime - vehicle.mLastSector2 }, BestSectorTimes = new double[] { vehicle.mBestSector1, vehicle.mBestSector2, vehicle.mBestLapTime - vehicle.mBestSector2 }, BestLap = vehicle.mBestLapTime, LastLap = vehicle.mLastLapTime, LastLapString = lastLapString, BestLapString = bestLapString, Laps = vehicle.mTotalLaps, CurrentSessionPositionDifference = positionDifference }; if (entry.Position == 1) { res.Session.CurrentLaps = entry.Laps; } entries.Add(entry); } // Set fastest lap Entry fastestDriver = entries.First(d => d.BestLap == entries.Min(e => e.BestLap)); entries.ForEach(e => { e.BestLapDelta = e.BestLap - fastestDriver.BestLap; TimeSpan diff = TimeSpan.FromSeconds(e.BestLapDelta); if (diff.TotalMinutes < 1.0) { e.BestLapDeltaString = "+ " + diff.ToString(@"ss\:fff"); } else { e.BestLapDeltaString = "+ " + diff.ToString(@"mm\:ss\:fff"); } }); if (res.Session.MaxLaps == int.MaxValue) { TimeSpan current = TimeSpan.FromSeconds(Math.Floor(scoring.mScoringInfo.mCurrentET)); TimeSpan max = TimeSpan.FromSeconds(Math.Floor(scoring.mScoringInfo.mEndET - Constants.MAXTIMECOUNTDOWN)); res.Session.SessionLeftString = String.Format("{0}/ {1}", current, max); } else { res.Session.CurrentLaps = entries.Max(e => e.Laps); res.Session.SessionLeftString = String.Format("{0}/ {1}", res.Session.CurrentLaps, res.Session.MaxLaps); } res.Drivers = entries.ToArray(); res.RaceOverlayControlSet = this.parsedJSON["controlSet"].ToString(); res.CommandId = Convert.ToInt32(this.parsedJSON["commandId"]); res.Session.IsSessionPaused = res.RaceOverlayControlSet.IndexOf("pause") != -1; // Translate the slot id (wich means the position) to the proper rfactor 2 id: bool driverFound = false; if (res.RaceOverlayControlSet.IndexOf("currentDriver") != -1) { String driverName = JObject.Parse(res.RaceOverlayControlSet)["currentDriver"].ToString(); foreach (Entry driver in res.Drivers) { if (driver.FirstName + " " + driver.LastName == driverName) { res.SlotId = driver.SlotID; driverFound = true; break; } } } else { foreach (Entry driver in res.Drivers) { if (driver.Position == Convert.ToInt32(this.parsedJSON["slotId"].ToString())) { res.SlotId = driver.SlotID; driverFound = true; break; } } } res.SlotId = Program.lastResponse != null && res.SlotId == 0 ? Program.lastResponse.SlotId : res.SlotId; res.CameraId = Convert.ToInt32(this.parsedJSON["cameraId"].ToString()); if (!driverFound && Program.lastResponse != null) { res.SlotId = Program.lastResponse.SlotId; res.CameraId = Program.lastResponse.CameraId; res.CommandId = Program.lastResponse.CameraId; } // Write control file for rfactor plugin // TODO: ADD A PROPER TIMEOUT try { if (Program.lastResponse == null || Program.lastResponse.CameraId != res.CameraId || Program.lastResponse.SlotId != res.SlotId) { string[] lines = { res.SlotId.ToString(), res.CameraId.ToString() }; String path = Path.Combine(Path.GetTempPath(), "cameraslots.txt"); System.IO.File.WriteAllLines(path, lines); } } catch { } Program.lastResponse = res; return(res); }
private void AddTyresAndFuelInfo(SimulatorDataSet simData, rF2VehicleTelemetry playerVehicleTelemetry) { simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.TyrePressure.ActualQuantity = Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mPressure); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.TyrePressure.ActualQuantity = Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mPressure); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.TyrePressure.ActualQuantity = Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mPressure); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.TyrePressure.ActualQuantity = Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mPressure); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.Detached = playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mDetached == 1 || playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mFlat == 1; simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.Detached = playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mDetached == 1 || playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mFlat == 1; simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.Detached = playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mDetached == 1 || playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mFlat == 1; simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.Detached = playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mDetached == 1 || playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mFlat == 1; simData.PlayerInfo.CarInfo.RearHeight = Distance.FromMeters(playerVehicleTelemetry.mRearRideHeight); simData.PlayerInfo.CarInfo.FrontHeight = Distance.FromMeters(playerVehicleTelemetry.mFrontWingHeight); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.Camber = Angle.GetFromRadians(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mCamber); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.Camber = Angle.GetFromRadians(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mCamber); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.Camber = Angle.GetFromRadians(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mCamber); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.Camber = Angle.GetFromRadians(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mCamber); //Tyre RPS simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.Rps = -playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mRotation; simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.Rps = -playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mRotation; simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.Rps = -playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mRotation; simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.Rps = -playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mRotation; //Ride Tyre Height simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.RideHeight = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mRideHeight); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.RideHeight = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mRideHeight); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.RideHeight = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mRideHeight); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.RideHeight = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mRideHeight); //Suspension Deflection simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.SuspensionTravel = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mSuspensionDeflection); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.SuspensionTravel = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mSuspensionDeflection); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.SuspensionTravel = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mSuspensionDeflection); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.SuspensionTravel = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mSuspensionDeflection); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.TyreWear.ActualWear = 1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mWear; simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.TyreWear.ActualWear = 1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mWear; simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.TyreWear.ActualWear = 1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mWear; simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.TyreWear.ActualWear = 1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mWear; // Front Left Tyre Temps simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.LeftTyreTemp.ActualQuantity = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mTemperature[0]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.RightTyreTemp.ActualQuantity = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mTemperature[2]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.CenterTyreTemp.ActualQuantity = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mTemperature[1]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.TyreCoreTemperature.ActualQuantity = Temperature.FromKelvin(Math.Min(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mTireCarcassTemperature, 2000)); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.TyreType = StringExtensions.FromArray(playerVehicleTelemetry.mFrontTireCompoundName); // Front Right Tyre Temps simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.LeftTyreTemp.ActualQuantity = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mTemperature[0]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.RightTyreTemp.ActualQuantity = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mTemperature[2]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.CenterTyreTemp.ActualQuantity = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mTemperature[1]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.TyreCoreTemperature.ActualQuantity = Temperature.FromKelvin(Math.Min(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mTireCarcassTemperature, 2000)); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.TyreType = StringExtensions.FromArray(playerVehicleTelemetry.mFrontTireCompoundName); // Rear Left Tyre Temps simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.LeftTyreTemp.ActualQuantity = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mTemperature[0]); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.RightTyreTemp.ActualQuantity = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mTemperature[2]); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.CenterTyreTemp.ActualQuantity = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mTemperature[1]); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.TyreCoreTemperature.ActualQuantity = Temperature.FromKelvin(Math.Min(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mTireCarcassTemperature, 2000)); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.TyreType = StringExtensions.FromArray(playerVehicleTelemetry.mRearTireCompoundName); // Rear Right Tyre Temps simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.LeftTyreTemp.ActualQuantity = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mTemperature[0]); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.RightTyreTemp.ActualQuantity = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mTemperature[2]); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.CenterTyreTemp.ActualQuantity = Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mTemperature[1]); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.TyreCoreTemperature.ActualQuantity = Temperature.FromKelvin(Math.Min(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mTireCarcassTemperature, 2000)); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.TyreType = StringExtensions.FromArray(playerVehicleTelemetry.mRearTireCompoundName); // Fuel System simData.PlayerInfo.CarInfo.FuelSystemInfo.FuelCapacity = Volume.FromLiters(playerVehicleTelemetry.mFuelCapacity); simData.PlayerInfo.CarInfo.FuelSystemInfo.FuelRemaining = Volume.FromLiters(playerVehicleTelemetry.mFuel); }
internal void AddDriversData(SimulatorDataSet data, Rf2FullData rfData) { if (rfData.scoring.mScoringInfo.mNumVehicles < 1) { return; } data.DriversInfo = new DriverInfo[rfData.scoring.mScoringInfo.mNumVehicles]; DriverInfo playersInfo = null; for (int i = 0; i < rfData.scoring.mScoringInfo.mNumVehicles; i++) { rF2VehicleScoring rF2VehicleScoring = rfData.scoring.mVehicles[i]; rF2VehicleTelemetry rF2VehicleTelemetry = rfData.telemetry.mVehicles[i]; DriverInfo driverInfo = CreateDriverInfo(rfData, rF2VehicleScoring); if (driverInfo.IsPlayer) { playersInfo = driverInfo; driverInfo.CurrentLapValid = true; _lastPlayerId = rF2VehicleScoring.mID; } else { driverInfo.CarInfo.WheelsInfo.FrontLeft.TyreType = StringExtensions.FromArray(rF2VehicleTelemetry.mFrontTireCompoundName); driverInfo.CarInfo.WheelsInfo.FrontRight.TyreType = driverInfo.CarInfo.WheelsInfo.FrontLeft.TyreType; driverInfo.CarInfo.WheelsInfo.RearRight.TyreType = StringExtensions.FromArray(rF2VehicleTelemetry.mRearTireCompoundName); driverInfo.CarInfo.WheelsInfo.RearLeft.TyreType = driverInfo.CarInfo.WheelsInfo.RearRight.TyreType; driverInfo.CurrentLapValid = true; } data.DriversInfo[i] = driverInfo; if (driverInfo.Position == 1) { data.SessionInfo.LeaderCurrentLap = driverInfo.CompletedLaps + 1; data.LeaderInfo = driverInfo; } if (rF2VehicleScoring.mControl == 2) { data.SessionInfo.IsMultiplayer = true; } AddLappingInformation(data, rfData, driverInfo); FillTimingInfo(driverInfo, rF2VehicleScoring, rfData); if (driverInfo.FinishStatus == DriverFinishStatus.Finished && !driverInfo.IsPlayer && driverInfo.Position > _lastPlayer.Position) { driverInfo.CompletedLaps--; driverInfo.FinishStatus = DriverFinishStatus.None; } } CheckValidityByPlayer(playersInfo); _lastPlayer = playersInfo; if (playersInfo != null) { data.PlayerInfo = playersInfo; } FillGapInformation(data.DriversInfo); }
public SimulatorDataSet CreateSimulatorDataSet(Rf2FullData rfData) { try { SimulatorDataSet simData = new SimulatorDataSet("RFactor 2"); simData.SimulatorSourceInfo.GapInformationProvided = GapInformationKind.TimeToSurroundingDrivers; simData.SimulatorSourceInfo.HasLapTimeInformation = true; simData.SimulatorSourceInfo.SimNotReportingEndOfOutLapCorrectly = true; simData.SimulatorSourceInfo.InvalidateLapBySector = true; simData.SimulatorSourceInfo.SectorTimingSupport = DataInputSupport.Full; simData.SimulatorSourceInfo.TelemetryInfo.ContainsSuspensionTravel = true; //simData.SimulatorSourceInfo.TelemetryInfo.ContainsSuspensionVelocity = true; /* simData.SimulatorSourceInfo.TelemetryInfo.RequiresDistanceInterpolation = true; * simData.SimulatorSourceInfo.TelemetryInfo.RequiresPositionInterpolation = true;*/ FillSessionInfo(rfData, simData); AddDriversData(simData, rfData); if (_lastPlayerId == -1) { return(simData); } rF2VehicleTelemetry playerF2VehicleTelemetry = rfData.telemetry.mVehicles.First(x => x.mID == _lastPlayerId); if (playerF2VehicleTelemetry.mElapsedTime > 0) { simData.SessionInfo.SessionTime = TimeSpan.FromSeconds(playerF2VehicleTelemetry.mElapsedTime); } FillPlayerCarInfo(playerF2VehicleTelemetry, simData); // PEDAL INFO AddPedalInfo(playerF2VehicleTelemetry, simData); // WaterSystemInfo AddWaterSystemInfo(playerF2VehicleTelemetry, simData); // OilSystemInfo AddOilSystemInfo(playerF2VehicleTelemetry, simData); // Brakes Info AddBrakesInfo(playerF2VehicleTelemetry, simData); // Tyre Pressure Info AddTyresAndFuelInfo(simData, playerF2VehicleTelemetry); // Acceleration AddAcceleration(simData, playerF2VehicleTelemetry); //Add Additional Player Car Info AddPlayerCarInfo(playerF2VehicleTelemetry, simData); AddFlags(rfData, simData); currentlyIgnoredPackage = 0; PopulateClassPositions(simData); return(simData); }catch (Exception ex) { _lastPlayerId = -1; _lastPlayer = new DriverInfo(); throw new RF2InvalidPackageException(ex); } }
private static void AddOilSystemInfo(rF2VehicleTelemetry playerVehicleTelemetry, SimulatorDataSet simData) { simData.PlayerInfo.CarInfo.OilSystemInfo.OptimalOilTemperature.ActualQuantity = Temperature.FromCelsius(playerVehicleTelemetry.mEngineOilTemp); simData.PlayerInfo.CarInfo.TurboPressure = Pressure.FromKiloPascals(playerVehicleTelemetry.mTurboBoostPressure / 1000); }
private void AddAcceleration(SimulatorDataSet simData, rF2VehicleTelemetry playerVehicleTelemetry) { simData.PlayerInfo.CarInfo.Acceleration.XinMs = playerVehicleTelemetry.mLocalAccel.x; simData.PlayerInfo.CarInfo.Acceleration.YinMs = playerVehicleTelemetry.mLocalAccel.y; simData.PlayerInfo.CarInfo.Acceleration.ZinMs = playerVehicleTelemetry.mLocalAccel.z; }
public Telemetry(ref rF2VehicleTelemetry telemetry) { RubberTemperatures = telemetry.mWheels.Select(x => new RubberTemperature(x)).ToList(); CarcassTemperatures = telemetry.mWheels.Select(x => new CarcassTemperature(x)).ToList(); }
// Corrdinate conversion: // rF2 +x = screen +x // rF2 +z = screen -z // rF2 +yaw = screen -yaw // If I don't flip z, the projection will look from below. void View_Paint(object sender, PaintEventArgs e) { var g = e.Graphics; this.tracker.TrackPhase(ref this.scoring, ref this.telemetry, ref this.extended, g, this.logPhaseAndState); this.tracker.TrackDamage(ref this.scoring, ref this.telemetry, ref this.extended, g, this.logDamage); this.tracker.TrackTimings(ref this.scoring, ref this.telemetry, ref this.rules, ref this.extended, g, this.logTiming); this.tracker.TrackRules(ref this.scoring, ref this.telemetry, ref this.rules, ref this.extended, g, this.logRules); this.UpdateFPS(); if (!this.connected) { var brush = new SolidBrush(System.Drawing.Color.Black); g.DrawString("Not connected", SystemFonts.DefaultFont, brush, 3.0f, 3.0f); if (this.logLightMode) { return; } } else { var brush = new SolidBrush(System.Drawing.Color.Green); var currX = 3.0f; var currY = 3.0f; float yStep = SystemFonts.DefaultFont.Height; var gameStateText = new StringBuilder(); gameStateText.Append( $"Plugin Version: Expected: 2.2.1.0 64bit Actual: {MainForm.GetStringFromBytes(this.extended.mVersion)} {(this.extended.is64bit == 1 ? "64bit" : "32bit")} FPS: {this.fps}"); // Draw header g.DrawString(gameStateText.ToString(), SystemFonts.DefaultFont, brush, currX, currY); gameStateText.Clear(); // Build map of mID -> telemetry.mVehicles[i]. // They are typically matching values, however, we need to handle online cases and dropped vehicles (mID can be reused). var idsToTelIndices = new Dictionary <long, int>(); for (int i = 0; i < this.telemetry.mNumVehicles; ++i) { if (!idsToTelIndices.ContainsKey(this.telemetry.mVehicles[i].mID)) { idsToTelIndices.Add(this.telemetry.mVehicles[i].mID, i); } } var playerVehScoring = GetPlayerScoring(ref this.scoring); var scoringPlrId = playerVehScoring.mID; var playerVeh = new rF2VehicleTelemetry(); int resolvedPlayerIdx = -1; // We're fine here with unitialized vehicle telemetry.. if (idsToTelIndices.ContainsKey(scoringPlrId)) { resolvedPlayerIdx = idsToTelIndices[scoringPlrId]; playerVeh = this.telemetry.mVehicles[resolvedPlayerIdx]; } // Figure out prev session end player mID var playerSessionEndInfo = new rF2VehScoringCapture(); for (int i = 0; i < this.extended.mSessionTransitionCapture.mNumScoringVehicles; ++i) { var veh = this.extended.mSessionTransitionCapture.mScoringVehicles[i]; if (veh.mIsPlayer == 1) { playerSessionEndInfo = veh; } } gameStateText.Append( "mElapsedTime:\n" + "mCurrentET:\n" + "mElapsedTime-mCurrentET:\n" + "mDetlaTime:\n" + "mInvulnerable:\n" + "mVehicleName:\n" + "mTrackName:\n" + "mLapStartET:\n" + "mLapDist:\n" + "mEndET:\n" + "mPlayerName:\n" + "mPlrFileName:\n\n" + "Session Started:\n" + "Sess. End Session:\n" + "Sess. End Phase:\n" + "Sess. End Place:\n" + "Sess. End Finish:\n" ); // Col 1 labels g.DrawString(gameStateText.ToString(), SystemFonts.DefaultFont, brush, currX, currY += yStep); gameStateText.Clear(); gameStateText.Append( $"{playerVeh.mElapsedTime:N3}\n" + $"{this.scoring.mScoringInfo.mCurrentET:N3}\n" + $"{(playerVeh.mElapsedTime - this.scoring.mScoringInfo.mCurrentET):N3}\n" + $"{playerVeh.mDeltaTime:N3}\n" + (this.extended.mPhysics.mInvulnerable == 0 ? "off" : "on") + "\n" + $"{MainForm.GetStringFromBytes(playerVeh.mVehicleName)}\n" + $"{MainForm.GetStringFromBytes(playerVeh.mTrackName)}\n" + $"{playerVeh.mLapStartET:N3}\n" + $"{this.scoring.mScoringInfo.mLapDist:N3}\n" + (this.scoring.mScoringInfo.mEndET < 0.0 ? "Unknown" : this.scoring.mScoringInfo.mEndET.ToString("N3")) + "\n" + $"{MainForm.GetStringFromBytes(this.scoring.mScoringInfo.mPlayerName)}\n" + $"{MainForm.GetStringFromBytes(this.scoring.mScoringInfo.mPlrFileName)}\n\n" + $"{this.extended.mSessionStarted != 0}\n" + $"{TransitionTracker.GetSessionString(this.extended.mSessionTransitionCapture.mSession)}\n" + $"{(rFactor2Constants.rF2GamePhase)this.extended.mSessionTransitionCapture.mGamePhase}\n" + $"{playerSessionEndInfo.mPlace}\n" + $"{(rFactor2Constants.rF2FinishStatus)playerSessionEndInfo.mFinishStatus}\n" ); // Col1 values g.DrawString(gameStateText.ToString(), SystemFonts.DefaultFont, Brushes.Purple, currX + 145, currY); if (this.scoring.mScoringInfo.mNumVehicles == 0 || resolvedPlayerIdx == -1) // We need telemetry for stats below. { return; } gameStateText.Clear(); gameStateText.Append( "mTimeIntoLap:\n" + "mEstimatedLapTime:\n" + "mTimeBehindNext:\n" + "mTimeBehindLeader:\n" + "mPitGroup:\n" + "mLapDist(Plr):\n" + "mLapDist(Est):\n" + "yaw:\n" + "pitch:\n" + "roll:\n" + "speed:\n"); // Col 2 labels g.DrawString(gameStateText.ToString(), SystemFonts.DefaultFont, brush, currX += 275, currY); gameStateText.Clear(); // Calculate derivatives: var yaw = Math.Atan2(playerVeh.mOri[RowZ].x, playerVeh.mOri[RowZ].z); var pitch = Math.Atan2(-playerVeh.mOri[RowY].z, Math.Sqrt(playerVeh.mOri[RowX].z * playerVeh.mOri[RowX].z + playerVeh.mOri[RowZ].z * playerVeh.mOri[RowZ].z)); var roll = Math.Atan2(playerVeh.mOri[RowY].x, Math.Sqrt(playerVeh.mOri[RowX].x * playerVeh.mOri[RowX].x + playerVeh.mOri[RowZ].x * playerVeh.mOri[RowZ].x)); var speed = Math.Sqrt((playerVeh.mLocalVel.x * playerVeh.mLocalVel.x) + (playerVeh.mLocalVel.y * playerVeh.mLocalVel.y) + (playerVeh.mLocalVel.z * playerVeh.mLocalVel.z)); // Estimate lapdist // See how much ahead telemetry is ahead of scoring update var delta = playerVeh.mElapsedTime - scoring.mScoringInfo.mCurrentET; var lapDistEstimated = playerVehScoring.mLapDist; if (delta > 0.0) { var localZAccelEstimated = playerVehScoring.mLocalAccel.z * delta; var localZVelEstimated = playerVehScoring.mLocalVel.z + localZAccelEstimated; lapDistEstimated = playerVehScoring.mLapDist - localZVelEstimated * delta; } gameStateText.Append( $"{playerVehScoring.mTimeIntoLap:N3}\n" + $"{playerVehScoring.mEstimatedLapTime:N3}\n" + $"{playerVehScoring.mTimeBehindNext:N3}\n" + $"{playerVehScoring.mTimeBehindLeader:N3}\n" + $"{MainForm.GetStringFromBytes(playerVehScoring.mPitGroup)}\n" + $"{playerVehScoring.mLapDist:N3}\n" + $"{lapDistEstimated:N3}\n" + $"{yaw:N3}\n" + $"{pitch:N3}\n" + $"{roll:N3}\n" + string.Format("{0:n3} m/s {1:n4} km/h\n", speed, speed * 3.6)); // Col2 values g.DrawString(gameStateText.ToString(), SystemFonts.DefaultFont, Brushes.Purple, currX + 120, currY); if (this.logLightMode) { return; } // Branch of UI choice: origin center or car# center // Fix rotation on car of choice or no. // Draw axes // Scale will be parameter, scale applied last on render to zoom. float scale = this.scale; var xVeh = (float)playerVeh.mPos.x; var zVeh = (float)playerVeh.mPos.z; var yawVeh = yaw; // View center var xScrOrigin = this.view.Width / 2.0f; var yScrOrigin = this.view.Height / 2.0f; if (!this.centerOnVehicle) { // Set world origin. g.TranslateTransform(xScrOrigin, yScrOrigin); this.RenderOrientationAxis(g); g.ScaleTransform(scale, scale); RenderCar(g, xVeh, -zVeh, -(float)yawVeh, Brushes.Green); for (int i = 0; i < this.telemetry.mNumVehicles; ++i) { if (i == resolvedPlayerIdx) { continue; } var veh = this.telemetry.mVehicles[i]; var thisYaw = Math.Atan2(veh.mOri[2].x, veh.mOri[2].z); this.RenderCar(g, (float)veh.mPos.x, -(float)veh.mPos.z, -(float)thisYaw, Brushes.Red); } } else { g.TranslateTransform(xScrOrigin, yScrOrigin); if (this.rotateAroundVehicle) { g.RotateTransform(180.0f + (float)yawVeh * DEGREES_IN_RADIAN); } this.RenderOrientationAxis(g); g.ScaleTransform(scale, scale); g.TranslateTransform(-xVeh, zVeh); RenderCar(g, xVeh, -zVeh, -(float)yawVeh, Brushes.Green); for (int i = 0; i < this.telemetry.mNumVehicles; ++i) { if (i == resolvedPlayerIdx) { continue; } var veh = this.telemetry.mVehicles[i]; var thisYaw = Math.Atan2(veh.mOri[2].x, veh.mOri[2].z); this.RenderCar(g, (float)veh.mPos.x, -(float)veh.mPos.z, -(float)thisYaw, Brushes.Red); } } } }
public void ReadData() { rF2VehicleScoring playerScoring = GetPlayerScoring(ref scoring); rF2VehicleTelemetry playerTelemetry = GetPlayerTelemetry(playerScoring.mID, ref telemetry); string session = ""; Console.WriteLine("[Session Data]"); Console.Write("Active="); Console.WriteLine((connected && (extended.mSessionStarted != 0)) ? "true" : "false"); if (connected) { if (playerTelemetry.mWheels == null) { Console.WriteLine("Paused=true"); } else { Console.Write("Paused="); Console.WriteLine(scoring.mScoringInfo.mGamePhase <= (byte)GridWalk || scoring.mScoringInfo.mGamePhase == (byte)PausedOrHeartbeat ? "true" : "false"); } if (scoring.mScoringInfo.mSession >= 10 && scoring.mScoringInfo.mSession <= 13) { session = "Race"; } else if (scoring.mScoringInfo.mSession >= 0 && scoring.mScoringInfo.mSession <= 4) { session = "Practice"; } else if (scoring.mScoringInfo.mSession >= 5 && scoring.mScoringInfo.mSession <= 8) { session = "Qualification"; } else { session = "Other"; } Console.Write("Session="); Console.WriteLine(session); string vehicleClass = GetStringFromBytes(playerScoring.mVehicleClass); string vehicleName = GetStringFromBytes(playerScoring.mVehicleName); Console.Write("Car="); Console.WriteLine(GetCarName(vehicleClass, vehicleName)); Console.Write("CarName="); Console.WriteLine(vehicleName); Console.Write("CarClass="); Console.WriteLine(vehicleClass); Console.Write("Track="); Console.WriteLine(GetStringFromBytes(playerTelemetry.mTrackName)); Console.Write("SessionFormat="); Console.WriteLine((scoring.mScoringInfo.mEndET < 0.0) ? "Lap" : "Time"); Console.Write("FuelAmount="); Console.WriteLine(Math.Round(playerTelemetry.mFuelCapacity)); if (session == "Practice") { Console.WriteLine("SessionTimeRemaining=3600000"); Console.WriteLine("SessionLapsRemaining=30"); } else { long time = GetRemainingTime(ref playerScoring); Console.Write("SessionTimeRemaining="); Console.WriteLine(time); Console.Write("SessionLapsRemaining="); Console.WriteLine(GetRemainingLaps(ref playerScoring)); } } Console.WriteLine("[Stint Data]"); if (connected) { Console.Write("DriverForname="); Console.WriteLine(GetForname(scoring.mScoringInfo.mPlayerName)); Console.Write("DriverSurname="); Console.WriteLine(GetSurname(scoring.mScoringInfo.mPlayerName)); Console.Write("DriverNickname="); Console.WriteLine(GetNickname(scoring.mScoringInfo.mPlayerName)); Console.Write("LapValid="); Console.WriteLine((playerScoring.mCountLapFlag > 0) ? "true" : "false"); Console.Write("LapLastTime="); Console.WriteLine(Math.Round(Normalize(playerScoring.mLastLapTime) * 1000)); Console.Write("LapBestTime="); Console.WriteLine(Math.Round(Normalize(playerScoring.mBestLapTime) * 1000)); Console.Write("Sector="); Console.WriteLine(playerScoring.mSector == 0 ? 3 : playerScoring.mSector); Console.Write("Laps="); Console.WriteLine(playerScoring.mTotalLaps); if (session == "Practice") { Console.WriteLine("StintTimeRemaining=3600000"); Console.WriteLine("DriverTimeRemaining=3600000"); } else { long time = GetRemainingTime(ref playerScoring); Console.Write("StintTimeRemaining="); Console.WriteLine(time); Console.Write("DriverTimeRemaining="); Console.WriteLine(time); } Console.Write("InPit="); Console.WriteLine(playerScoring.mPitState == (byte)Stopped ? "true" : "false"); } Console.WriteLine("[Car Data]"); if (connected && (playerTelemetry.mWheels != null)) { Console.WriteLine("MAP=n/a"); Console.Write("TC="); Console.WriteLine(extended.mPhysics.mTractionControl); Console.Write("ABS="); Console.WriteLine(extended.mPhysics.mAntiLockBrakes); Console.Write("FuelRemaining="); Console.WriteLine(playerTelemetry.mFuel); Console.Write("TyreTemperature="); Console.WriteLine(GetCelcius(playerTelemetry.mWheels[0].mTireCarcassTemperature) + "," + GetCelcius(playerTelemetry.mWheels[1].mTireCarcassTemperature) + "," + GetCelcius(playerTelemetry.mWheels[2].mTireCarcassTemperature) + "," + GetCelcius(playerTelemetry.mWheels[3].mTireCarcassTemperature)); Console.Write("TyrePressure="); Console.WriteLine(GetPsi(playerTelemetry.mWheels[0].mPressure) + "," + GetPsi(playerTelemetry.mWheels[1].mPressure) + "," + GetPsi(playerTelemetry.mWheels[2].mPressure) + "," + GetPsi(playerTelemetry.mWheels[3].mPressure)); Console.Write("TyreWear="); if (extended.mPhysics.mTireMult > 0) { Console.WriteLine((100 - Math.Round(playerTelemetry.mWheels[0].mWear * 100)) + "," + (100 - Math.Round(playerTelemetry.mWheels[1].mWear * 100)) + "," + (100 - Math.Round(playerTelemetry.mWheels[2].mWear * 100)) + "," + (100 - Math.Round(playerTelemetry.mWheels[3].mWear * 100))); } else { Console.WriteLine("0,0,0,0"); } Console.Write("BrakeTemperature="); Console.WriteLine(GetCelcius(playerTelemetry.mWheels[0].mBrakeTemp) + "," + GetCelcius(playerTelemetry.mWheels[1].mBrakeTemp) + "," + GetCelcius(playerTelemetry.mWheels[2].mBrakeTemp) + "," + GetCelcius(playerTelemetry.mWheels[3].mBrakeTemp)); string compound = GetStringFromBytes(playerTelemetry.mFrontTireCompoundName); Console.Write("TyreCompoundRaw="); Console.WriteLine(compound); Console.Write("BodyworkDamage=0, 0, 0, 0, "); Console.WriteLine(extended.mTrackedDamages[playerTelemetry.mID].mAccumulatedImpactMagnitude / 1000); Console.WriteLine("SuspensionDamage=0, 0, 0, 0"); Console.WriteLine("EngineDamage=0"); } Console.WriteLine("[Track Data]"); if (connected) { Console.WriteLine("Grip=Optimum"); Console.Write("Temperature="); Console.WriteLine(scoring.mScoringInfo.mTrackTemp); for (int i = 0; i < scoring.mScoringInfo.mNumVehicles; ++i) { var vehicle = scoring.mVehicles[i]; Console.WriteLine("Car." + (i + 1) + ".Position=" + vehicle.mPos.x + "," + (-vehicle.mPos.z)); } } Console.WriteLine("[Weather Data]"); if (connected) { Console.Write("Temperature="); Console.WriteLine(scoring.mScoringInfo.mAmbientTemp); string theWeather = GetWeather(scoring.mScoringInfo.mDarkCloud, scoring.mScoringInfo.mRaining); Console.Write("Weather="); Console.WriteLine(theWeather); Console.Write("Weather10Min="); Console.WriteLine(theWeather); Console.Write("Weather30Min="); Console.WriteLine(theWeather); } Console.WriteLine("[Test Data]"); if (connected) { Console.Write("Category="); Console.Write(pitInfo.mPitMenu.mCategoryIndex); Console.Write(" -> "); Console.WriteLine(GetStringFromBytes(pitInfo.mPitMenu.mCategoryName)); Console.Write("Choices="); Console.Write(pitInfo.mPitMenu.mChoiceIndex); Console.Write(" -> "); Console.WriteLine(GetStringFromBytes(pitInfo.mPitMenu.mChoiceString)); Console.Write("NumChoices="); Console.WriteLine(pitInfo.mPitMenu.mNumChoices); } }