protected override void DaemonMethod() { _connectionTime = DateTime.MinValue; while (!ShouldDisconnect) { Thread.Sleep(TickTime); Rf2FullData rFactorData = Load(); SimulatorDataSet dataSet; try { dataSet = _rf2DataConvertor.CreateSimulatorDataSet(rFactorData); } catch (RF2InvalidPackageException) { continue; } if (CheckSessionStarted(rFactorData, dataSet)) { RaiseSessionStartedEvent(dataSet); } RaiseDataLoadedEvent(dataSet); if (!IsProcessRunning()) { ShouldDisconnect = true; } } Disconnect(); RaiseDisconnectedEvent(); }
private bool CheckSessionStarted(Rf2FullData rfData, SimulatorDataSet dataSet) { if (_previousSessionTime.TotalSeconds - 1 > dataSet.SessionInfo.SessionTime.TotalSeconds) { Logger.Info($"New Session - Session time is less. Oldtime : {_previousSessionTime.TotalSeconds} - New Time: {dataSet.SessionInfo.SessionTime.TotalSeconds}"); return(true); } if (_rawLastSessionType != rfData.scoring.mScoringInfo.mSession || _lastSessionType != dataSet.SessionInfo.SessionType) { Logger.Info("New Session - Session type doesn't match"); _lastSessionType = dataSet.SessionInfo.SessionType; _rawLastSessionType = rfData.scoring.mScoringInfo.mSession; _lastSessionPhase = dataSet.SessionInfo.SessionPhase; return(true); } if (dataSet.SessionInfo.SessionPhase != _lastSessionPhase && _lastSessionPhase != SessionPhase.Green && dataSet.SessionInfo.SessionPhase != SessionPhase.Countdown) { Logger.Info("New Session - Session phase doesn't match"); _lastSessionType = dataSet.SessionInfo.SessionType; _rawLastSessionType = rfData.scoring.mScoringInfo.mSession; _lastSessionPhase = dataSet.SessionInfo.SessionPhase; return(true); } return(false); }
private void AddLappingInformation(SimulatorDataSet data, Rf2FullData rfData, DriverInfo driverInfo) { if (data.SessionInfo.SessionType == SessionType.Race && _lastPlayer != null && _lastPlayer.CompletedLaps != 0) { driverInfo.IsBeingLappedByPlayer = driverInfo.TotalDistance < (_lastPlayer.TotalDistance - rfData.scoring.mScoringInfo.mLapDist * 0.5); driverInfo.IsLappingPlayer = _lastPlayer.TotalDistance < (driverInfo.TotalDistance - rfData.scoring.mScoringInfo.mLapDist * 0.5); } }
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]; DriverInfo driverInfo = CreateDriverInfo(rfData, rF2VehicleScoring); if (driverInfo.IsPlayer) { playersInfo = driverInfo; driverInfo.CurrentLapValid = true; _lastPlayerId = rF2VehicleScoring.mID; } else { driverInfo.CurrentLapValid = true; } data.DriversInfo[i] = driverInfo; if (driverInfo.Position == 1) { data.SessionInfo.LeaderCurrentLap = driverInfo.CompletedLaps + 1; data.LeaderInfo = driverInfo; } 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) { 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); }
private Rf2FullData Load() { if (!IsConnected) { throw new InvalidOperationException("Not connected"); } Rf2FullData data = new Rf2FullData() { extended = _extendedBuffer.GetMappedDataUnSynchronized(), scoring = _scoringBuffer.GetMappedDataUnSynchronized(), telemetry = _telemetryBuffer.GetMappedDataUnSynchronized(), rules = _rulesBuffer.GetMappedDataUnSynchronized() }; return(data); }
private bool CheckSessionStarted(Rf2FullData rfData, SimulatorDataSet dataSet) { if (_rawLastSessionType != rfData.scoring.mScoringInfo.mSession || _lastSessionType != dataSet.SessionInfo.SessionType) { _lastSessionType = dataSet.SessionInfo.SessionType; _rawLastSessionType = rfData.scoring.mScoringInfo.mSession; _lastSessionPhase = dataSet.SessionInfo.SessionPhase; return(true); } if (dataSet.SessionInfo.SessionPhase != _lastSessionPhase && _lastSessionPhase != SessionPhase.Green && dataSet.SessionInfo.SessionPhase != SessionPhase.Countdown) { _lastSessionType = dataSet.SessionInfo.SessionType; _rawLastSessionType = rfData.scoring.mScoringInfo.mSession; _lastSessionPhase = dataSet.SessionInfo.SessionPhase; return(true); } return(false); }
protected override async Task DaemonMethod(CancellationToken cancellationToken) { _connectionTime = DateTime.MinValue; while (!ShouldDisconnect) { await Task.Delay(TickTime, cancellationToken).ConfigureAwait(false); Rf2FullData rFactorData = Load(); SimulatorDataSet dataSet; try { dataSet = _rf2DataConvertor.CreateSimulatorDataSet(rFactorData); } catch (RF2InvalidPackageException ex) { if (ex.InnerException != null) { Logger.Error(ex, "RF2Invalid Package Caused by Exception"); } continue; } if (CheckSessionStarted(rFactorData, dataSet)) { _sessionTimeInterpolator.Reset(); RaiseSessionStartedEvent(dataSet); } _previousSessionTime = dataSet.SessionInfo.SessionTime; RaiseDataLoadedEvent(dataSet); if (!IsProcessRunning()) { ShouldDisconnect = true; } } Disconnect(); RaiseDisconnectedEvent(); }
private DriverInfo CreateDriverInfo(Rf2FullData rfData, rF2VehicleScoring rfVehicleInfo) { DriverInfo driverInfo = new DriverInfo { DriverName = StringExtensions.FromArray(rfVehicleInfo.mDriverName), CompletedLaps = rfVehicleInfo.mTotalLaps, CarName = StringExtensions.FromArray(rfVehicleInfo.mVehicleName), InPits = rfVehicleInfo.mInPits == 1 }; driverInfo.IsPlayer = rfVehicleInfo.mIsPlayer == 1; driverInfo.Position = rfVehicleInfo.mPlace; driverInfo.Speed = Velocity.FromMs(Math.Sqrt((rfVehicleInfo.mLocalVel.x * rfVehicleInfo.mLocalVel.x) + (rfVehicleInfo.mLocalVel.y * rfVehicleInfo.mLocalVel.y) + (rfVehicleInfo.mLocalVel.z * rfVehicleInfo.mLocalVel.z))); driverInfo.LapDistance = rfVehicleInfo.mLapDist; driverInfo.TotalDistance = rfVehicleInfo.mTotalLaps * rfData.scoring.mScoringInfo.mLapDist + rfVehicleInfo.mLapDist; driverInfo.FinishStatus = FromRFStatus(rfVehicleInfo.mFinishStatus); driverInfo.WorldPosition = new Point3D(Distance.FromMeters(rfVehicleInfo.mPos.x), Distance.FromMeters(rfVehicleInfo.mPos.y), Distance.FromMeters(rfVehicleInfo.mPos.z)); ComputeDistanceToPlayer(_lastPlayer, driverInfo, rfData); return(driverInfo); }
private void AddFlags(Rf2FullData rfData, SimulatorDataSet simData) { if ((rFactor2Constants.rF2GamePhase)rfData.scoring.mScoringInfo.mGamePhase == rFactor2Constants.rF2GamePhase.FullCourseYellow) { simData.SessionInfo.ActiveFlags.Add(FlagKind.FullCourseYellow); return; } if (rfData.scoring.mScoringInfo.mSectorFlag[0] == 1) { simData.SessionInfo.ActiveFlags.Add(FlagKind.YellowSector1); } if (rfData.scoring.mScoringInfo.mSectorFlag[1] == 1) { simData.SessionInfo.ActiveFlags.Add(FlagKind.YellowSector2); } if (rfData.scoring.mScoringInfo.mSectorFlag[2] == 1) { simData.SessionInfo.ActiveFlags.Add(FlagKind.YellowSector3); } }
internal void FillSessionInfo(Rf2FullData data, SimulatorDataSet simData) { // Timing simData.SessionInfo.SessionTime = TimeSpan.FromSeconds(data.scoring.mScoringInfo.mCurrentET); simData.SessionInfo.TrackInfo.LayoutLength = data.scoring.mScoringInfo.mLapDist; simData.SessionInfo.TrackInfo.TrackName = StringExtensions.FromArray(data.scoring.mScoringInfo.mTrackName); simData.SessionInfo.TrackInfo.TrackLayoutName = String.Empty; simData.SessionInfo.WeatherInfo.AirTemperature = Temperature.FromCelsius(data.scoring.mScoringInfo.mAmbientTemp); simData.SessionInfo.WeatherInfo.TrackTemperature = Temperature.FromCelsius(data.scoring.mScoringInfo.mTrackTemp); simData.SessionInfo.WeatherInfo.RainIntensity = (int)(data.scoring.mScoringInfo.mRaining * 100); if (data.scoring.mScoringInfo.mTrackTemp == 0 && data.scoring.mScoringInfo.mSession == 0 && data.scoring.mScoringInfo.mGamePhase == 0 && string.IsNullOrEmpty(simData.SessionInfo.TrackInfo.TrackName) && data.scoring.mScoringInfo.mLapDist == 0) { simData.SessionInfo.SessionType = SessionType.Na; simData.SessionInfo.SessionPhase = SessionPhase.Countdown; return; } switch (data.scoring.mScoringInfo.mSession) { case -1: simData.SessionInfo.SessionType = SessionType.Na; break; case 0: case 1: case 2: case 3: case 4: simData.SessionInfo.SessionType = SessionType.Practice; break; case 5: case 6: case 7: case 8: simData.SessionInfo.SessionType = SessionType.Qualification; break; case 9: simData.SessionInfo.SessionType = SessionType.WarmUp; break; case 10: case 11: case 12: case 13: simData.SessionInfo.SessionType = SessionType.Race; break; default: simData.SessionInfo.SessionType = SessionType.Practice; break; } switch ((rFactor2Constants.rF2GamePhase)data.scoring.mScoringInfo.mGamePhase) { case rFactor2Constants.rF2GamePhase.Garage: break; case rFactor2Constants.rF2GamePhase.WarmUp: case rFactor2Constants.rF2GamePhase.GridWalk: case rFactor2Constants.rF2GamePhase.Formation: case rFactor2Constants.rF2GamePhase.Countdown: simData.SessionInfo.SessionPhase = SessionPhase.Countdown; break; case rFactor2Constants.rF2GamePhase.SessionStopped: case rFactor2Constants.rF2GamePhase.FullCourseYellow: case rFactor2Constants.rF2GamePhase.GreenFlag: simData.SessionInfo.SessionPhase = SessionPhase.Green; break; case rFactor2Constants.rF2GamePhase.SessionOver: simData.SessionInfo.SessionPhase = SessionPhase.Checkered; break; } simData.SessionInfo.IsActive = simData.SessionInfo.SessionType != SessionType.Na; // ReSharper disable once CompareOfFloatsByEqualityOperator if (data.scoring.mScoringInfo.mEndET > 0) { simData.SessionInfo.SessionLengthType = SessionLengthType.Time; simData.SessionInfo.SessionTimeRemaining = data.scoring.mScoringInfo.mEndET - data.scoring.mScoringInfo.mCurrentET > 0 ? data.scoring.mScoringInfo.mEndET - data.scoring.mScoringInfo.mCurrentET : 0; } else { simData.SessionInfo.SessionLengthType = SessionLengthType.Laps; simData.SessionInfo.TotalNumberOfLaps = data.scoring.mScoringInfo.mMaxLaps; } }
internal static void ComputeDistanceToPlayer(DriverInfo player, DriverInfo driverInfo, Rf2FullData Rf2FullData) { if (player == null) { return; } if (driverInfo.FinishStatus == DriverInfo.DriverFinishStatus.Dq || driverInfo.FinishStatus == DriverInfo.DriverFinishStatus.Dnf || driverInfo.FinishStatus == DriverInfo.DriverFinishStatus.Dnq || driverInfo.FinishStatus == DriverInfo.DriverFinishStatus.Dns) { driverInfo.DistanceToPlayer = double.MaxValue; return; } double trackLength = Rf2FullData.scoring.mScoringInfo.mLapDist; double playerLapDistance = player.LapDistance; double distanceToPlayer = playerLapDistance - driverInfo.LapDistance; if (distanceToPlayer < -(trackLength / 2)) { distanceToPlayer = distanceToPlayer + trackLength; } if (distanceToPlayer > (trackLength / 2)) { distanceToPlayer = distanceToPlayer - trackLength; } driverInfo.DistanceToPlayer = distanceToPlayer; }
internal void FillTimingInfo(DriverInfo driverInfo, rF2VehicleScoring rfVehicleInfo, Rf2FullData Rf2FullData) { driverInfo.Timing.LastSector1Time = CreateTimeSpan(rfVehicleInfo.mCurSector1); driverInfo.Timing.LastSector2Time = CreateTimeSpan(rfVehicleInfo.mCurSector2 - rfVehicleInfo.mCurSector1); driverInfo.Timing.LastSector3Time = CreateTimeSpan(rfVehicleInfo.mLastLapTime - rfVehicleInfo.mLastSector2); driverInfo.Timing.LastLapTime = CreateTimeSpan(rfVehicleInfo.mLastLapTime); driverInfo.Timing.CurrentSector = rfVehicleInfo.mSector == 0 ? 3 : rfVehicleInfo.mSector; switch (driverInfo.Timing.CurrentSector) { case 1: driverInfo.Timing.CurrentLapTime = CreateTimeSpan(rfVehicleInfo.mCurSector1); break; case 2: driverInfo.Timing.CurrentLapTime = CreateTimeSpan(rfVehicleInfo.mCurSector2); break; case 0: driverInfo.Timing.CurrentLapTime = CreateTimeSpan(rfVehicleInfo.mLastLapTime); break; } }
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); } }