private void AddPlayerCarInfo(ref CarStatusData rawCarStatusData, ref CarTelemetryData rawCarTelemetryData, SimulatorDataSet simData) { CarInfo playerCar = simData.PlayerInfo.CarInfo; playerCar.CarDamageInformation.Bodywork.MediumDamageThreshold = 0.1; playerCar.CarDamageInformation.Engine.HeavyDamageThreshold = 0.9; playerCar.CarDamageInformation.Transmission.HeavyDamageThreshold = 0.75; playerCar.CarDamageInformation.Engine.MediumDamageThreshold = 0.75; playerCar.CarDamageInformation.Transmission.MediumDamageThreshold = 0.9; /*playerCar.CarDamageInformation.Suspension.Damage = rawCarStatusData.MTyresDamage.Max(x => x) / 100.0;*/ playerCar.CarDamageInformation.Bodywork.Damage = Math.Max(rawCarStatusData.MRearWingDamage, Math.Max(rawCarStatusData.MFrontLeftWingDamage, rawCarStatusData.MFrontRightWingDamage)) / 100.0; playerCar.CarDamageInformation.Engine.Damage = rawCarStatusData.MEngineDamage / 100.0; playerCar.CarDamageInformation.Transmission.Damage = rawCarStatusData.MGearBoxDamage / 100.0; playerCar.SpeedLimiterEngaged = rawCarStatusData.MPitLimiterStatus == 1; /*playerCar.WorldOrientation = new Orientation() * { * Roll = Angle.GetFromRadians(rawCarStatusData.CarOrientation.Roll), * Pitch = Angle.GetFromRadians(rawCarStatusData.CarOrientation.Pitch), * Yaw = Angle.GetFromRadians(-rawCarStatusData.CarOrientation.Yaw), * };*/ FillDrsData(ref rawCarStatusData, ref rawCarTelemetryData, playerCar); FillBoostData(ref rawCarStatusData, playerCar); }
protected void NotifyData(CarStatusData data) { foreach (var observer in _carStatusObservers) { observer.OnNext(data); } }
public CarStatusData Read(Span <byte> input, PacketHeader packetHeader) { var output = new CarStatusData { Header = packetHeader }; for (var i = 0; i < 20; i++) { output.CarStatuses[i] = ReadCarStatus(input); } return(output); }
public override void LoadBytes(byte[] bytes) { ByteArrayManager bam = new ByteArrayManager(bytes); base.LoadBytes(bam.NextBytes(24)); List <CarStatusData> csds = new List <CarStatusData>(); int t = 1; for (t = 1; t <= 22; t++) { csds.Add(CarStatusData.CreateFromBytes(bam.NextBytes(60))); } FieldCarStatusData = csds.ToArray(); }
private static void FillBoostData(ref CarStatusData rawCarStatusData, CarInfo playerCar) { BoostSystem boostSystem = playerCar.BoostSystem; boostSystem.ActivationsRemaining = (int)rawCarStatusData.MErsStoreEnergy / 100000; if (rawCarStatusData.MErsDeployMode <= 1) { boostSystem.BoostStatus = BoostStatus.Available; } else if (rawCarStatusData.MErsDeployMode <= 3) { boostSystem.BoostStatus = BoostStatus.InUse; } else { boostSystem.BoostStatus = BoostStatus.Cooldown; } }
private static void AddWheelInfo(DriverInfo driverInfo, CarStatusData rawCarStatus) { string tyreType = TranslationTable.GetTyreCompound(rawCarStatus.MTyreVisualCompound); driverInfo.CarInfo.WheelsInfo.FrontLeft.TyreType = tyreType; driverInfo.CarInfo.WheelsInfo.FrontRight.TyreType = tyreType; driverInfo.CarInfo.WheelsInfo.RearLeft.TyreType = tyreType; driverInfo.CarInfo.WheelsInfo.RearRight.TyreType = tyreType; string tyreVisualType = TranslationTable.GetTyreVisualCompound(rawCarStatus.MTyreVisualCompound); driverInfo.CarInfo.WheelsInfo.FrontLeft.TyreVisualType = tyreVisualType; driverInfo.CarInfo.WheelsInfo.FrontRight.TyreVisualType = tyreVisualType; driverInfo.CarInfo.WheelsInfo.RearLeft.TyreVisualType = tyreVisualType; driverInfo.CarInfo.WheelsInfo.RearRight.TyreVisualType = tyreVisualType; }
private static void FillDrsData(ref CarStatusData carStatusData, ref CarTelemetryData rawCarTelemetryData, CarInfo playerCar) { DrsSystem drsSystem = playerCar.DrsSystem; drsSystem.DrsActivationLeft = -1; if (rawCarTelemetryData.MDrs == 1) { drsSystem.DrsStatus = DrsStatus.InUse; return; } switch ((int)carStatusData.MDrsAllowed) { case -1: case 0: drsSystem.DrsStatus = DrsStatus.NotEquipped; return; case 1: drsSystem.DrsStatus = DrsStatus.Available; break; } }
private static void AddTyresInfo(ref CarTelemetryData rawTelemetryData, ref CarStatusData rawCarStatusData, ref PacketMotionData rawMotionData, SimulatorDataSet simData) { simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.TyrePressure.ActualQuantity = Pressure.FromPsi(rawTelemetryData.MTyresPressure[TyreIndices.FrontLeft]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.TyrePressure.ActualQuantity = Pressure.FromPsi(rawTelemetryData.MTyresPressure[TyreIndices.FrontRight]); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.TyrePressure.ActualQuantity = Pressure.FromPsi(rawTelemetryData.MTyresPressure[TyreIndices.RearLeft]); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.TyrePressure.ActualQuantity = Pressure.FromPsi(rawTelemetryData.MTyresPressure[TyreIndices.RearRight]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.TyreWear.ActualWear = rawCarStatusData.MTyresWear[TyreIndices.FrontLeft] / 100.0; simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.TyreWear.ActualWear = rawCarStatusData.MTyresWear[TyreIndices.FrontRight] / 100.0; simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.TyreWear.ActualWear = rawCarStatusData.MTyresWear[TyreIndices.RearLeft] / 100.0; simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.TyreWear.ActualWear = rawCarStatusData.MTyresWear[TyreIndices.RearRight] / 100.0; simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.Rps = rawMotionData.MWheelSpeed[TyreIndices.FrontLeft]; simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.Rps = rawMotionData.MWheelSpeed[TyreIndices.FrontRight]; simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.Rps = rawMotionData.MWheelSpeed[TyreIndices.RearLeft]; simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.Rps = rawMotionData.MWheelSpeed[TyreIndices.RearRight]; simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.SuspensionTravel = Distance.FromCentimeters(rawMotionData.MSuspensionPosition[TyreIndices.FrontLeft]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.SuspensionTravel = Distance.FromCentimeters(rawMotionData.MSuspensionPosition[TyreIndices.FrontRight]); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.SuspensionTravel = Distance.FromCentimeters(rawMotionData.MSuspensionPosition[TyreIndices.RearLeft]); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.SuspensionTravel = Distance.FromCentimeters(rawMotionData.MSuspensionPosition[TyreIndices.RearRight]); /*simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.SuspensionVelocity = Velocity.FromMs(rawMotionData.MSuspensionVelocity[TyreIndices.FrontLeft]); * simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.SuspensionVelocity = Velocity.FromMs(rawMotionData.MSuspensionVelocity[TyreIndices.FrontRight]); * simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.SuspensionVelocity = Velocity.FromMs(rawMotionData.MSuspensionVelocity[TyreIndices.RearLeft]); * simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.SuspensionVelocity = Velocity.FromMs(rawMotionData.MSuspensionVelocity[TyreIndices.RearRight]);*/ // Front Left Tyre Temps simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.CenterTyreTemp.IdealQuantity = Temperature.FromCelsius(85); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.CenterTyreTemp.IdealQuantityWindow = Temperature.FromCelsius(20); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.LeftTyreTemp.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresSurfaceTemperature[TyreIndices.FrontLeft]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.RightTyreTemp.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresSurfaceTemperature[TyreIndices.FrontLeft]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.CenterTyreTemp.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresSurfaceTemperature[TyreIndices.FrontLeft]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.TyreCoreTemperature.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresInnerTemperature[TyreIndices.FrontLeft]); // Front Right Tyre Temps simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.CenterTyreTemp.IdealQuantity = Temperature.FromCelsius(85); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.CenterTyreTemp.IdealQuantityWindow = Temperature.FromCelsius(20); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.LeftTyreTemp.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresSurfaceTemperature[TyreIndices.FrontRight]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.RightTyreTemp.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresSurfaceTemperature[TyreIndices.FrontRight]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.CenterTyreTemp.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresSurfaceTemperature[TyreIndices.FrontRight]); simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.TyreCoreTemperature.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresInnerTemperature[TyreIndices.FrontRight]); // Rear Left Tyre Temps simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.CenterTyreTemp.IdealQuantity = Temperature.FromCelsius(85); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.CenterTyreTemp.IdealQuantityWindow = Temperature.FromCelsius(20); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.LeftTyreTemp.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresSurfaceTemperature[TyreIndices.RearLeft]); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.RightTyreTemp.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresSurfaceTemperature[TyreIndices.RearLeft]); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.CenterTyreTemp.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresSurfaceTemperature[TyreIndices.RearLeft]); simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.TyreCoreTemperature.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresInnerTemperature[TyreIndices.RearLeft]); // Rear Right Tyre Temps simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.CenterTyreTemp.IdealQuantity = Temperature.FromCelsius(85); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.CenterTyreTemp.IdealQuantityWindow = Temperature.FromCelsius(20); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.LeftTyreTemp.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresSurfaceTemperature[TyreIndices.RearRight]); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.RightTyreTemp.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresSurfaceTemperature[TyreIndices.RearRight]); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.CenterTyreTemp.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresSurfaceTemperature[TyreIndices.RearRight]); simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.TyreCoreTemperature.ActualQuantity = Temperature.FromCelsius(rawTelemetryData.MTyresInnerTemperature[TyreIndices.RearRight]); // Fuel System simData.PlayerInfo.CarInfo.FuelSystemInfo.FuelCapacity = Volume.FromLiters(rawCarStatusData.MFuelCapacity); simData.PlayerInfo.CarInfo.FuelSystemInfo.FuelRemaining = Volume.FromLiters(rawCarStatusData.MFuelInTank); }
/// <summary> /// Takes 56 bytes /// </summary> /// <param name="bytes"></param> /// <returns></returns> public static CarStatusData CreateFromBytes(byte[] bytes) { CarStatusData ToReturn = new CarStatusData(); ByteArrayManager bam = new ByteArrayManager(bytes); byte nb = 0; //Traction control nb = bam.NextByte(); if (nb == 0) { ToReturn.TractionControlStatus = TractionControlLevel.Off; } else if (nb == 1) { ToReturn.TractionControlStatus = TractionControlLevel.Low; } else if (nb == 2) { ToReturn.TractionControlStatus = TractionControlLevel.High; } else { ToReturn.TractionControlStatus = TractionControlLevel.Off; } //Anti-lock brakes if (bam.NextByte() == 1) { ToReturn.AntiLockBrakesOn = true; } else { ToReturn.AntiLockBrakesOn = false; } //Fuel mix nb = bam.NextByte(); if (nb == 0) { ToReturn.SelectedFuelMix = FuelMix.Lean; } else if (nb == 1) { ToReturn.SelectedFuelMix = FuelMix.Standard; } else if (nb == 2) { ToReturn.SelectedFuelMix = FuelMix.Rich; } else if (nb == 3) { ToReturn.SelectedFuelMix = FuelMix.Max; } //Front Brake bias percentage ToReturn.FrontBrakeBiasPercentage = bam.NextByte(); //Pit limiter if (bam.NextByte() == 1) { ToReturn.PitLimiterOn = true; } else { ToReturn.PitLimiterOn = false; } //Fuel in tank ToReturn.FuelLevel = BitConverter.ToSingle(bam.NextBytes(4), 0); //Fuel capacity ToReturn.FuelCapacity = BitConverter.ToSingle(bam.NextBytes(4), 0); //Fuel remaining laps ToReturn.FuelRemainingLaps = BitConverter.ToSingle(bam.NextBytes(4), 0); //Max RPM ToReturn.MaxRpm = BitConverter.ToUInt16(bam.NextBytes(2), 0); //Idle RPM ToReturn.IdleRpm = BitConverter.ToUInt16(bam.NextBytes(2), 0); //Max gears ToReturn.MaxGears = bam.NextByte(); //DRS allowed nb = bam.NextByte(); if (nb == 1) { ToReturn.DrsAllowed = true; } else { ToReturn.DrsAllowed = false; } //DRS activation distance ToReturn.DrsActivationDistance = BitConverter.ToUInt16(bam.NextBytes(2), 0); //Tyre Wear ToReturn.TyreWearPercentage = new WheelDataArray(); ToReturn.TyreWearPercentage.FrontLeft = Convert.ToSingle(bam.NextByte()); ToReturn.TyreWearPercentage.FrontRight = Convert.ToSingle(bam.NextByte()); ToReturn.TyreWearPercentage.RearLeft = Convert.ToSingle(bam.NextByte()); ToReturn.TyreWearPercentage.RearRight = Convert.ToSingle(bam.NextByte()); //Tyre Compound nb = bam.NextByte(); if (nb == 16) { ToReturn.EquippedTyreCompound = TyreCompound.C5; } else if (nb == 17) { ToReturn.EquippedTyreCompound = TyreCompound.C4; } else if (nb == 18) { ToReturn.EquippedTyreCompound = TyreCompound.C3; } else if (nb == 19) { ToReturn.EquippedTyreCompound = TyreCompound.C2; } else if (nb == 20) { ToReturn.EquippedTyreCompound = TyreCompound.C1; } else if (nb == 7) { ToReturn.EquippedTyreCompound = TyreCompound.Inter; } else if (nb == 8) { ToReturn.EquippedTyreCompound = TyreCompound.Wet; } //Tyre visual compound ToReturn.EquippedVisualTyreCompoundId = bam.NextByte(); //Tyre age in laps ToReturn.TyreAgeLaps = bam.NextByte(); //Tyre damage ToReturn.TyreDamagePercentage = new WheelDataArray(); ToReturn.TyreDamagePercentage.FrontLeft = Convert.ToSingle(bam.NextByte()); ToReturn.TyreDamagePercentage.FrontRight = Convert.ToSingle(bam.NextByte()); ToReturn.TyreDamagePercentage.RearLeft = Convert.ToSingle(bam.NextByte()); ToReturn.TyreDamagePercentage.RearRight = Convert.ToSingle(bam.NextByte()); //Front left wing damage ToReturn.FrontLeftWingDamagePercent = bam.NextByte(); //Front right wing damage ToReturn.FrontRightWingDamagePercent = bam.NextByte(); //Rear wing damage ToReturn.RearWingDamagePercent = bam.NextByte(); //DRS failure nb = bam.NextByte(); if (nb == 0) { ToReturn.DrsFailure = false; } else { ToReturn.DrsFailure = true; } //Engine damage ToReturn.EngineDamagePercent = bam.NextByte(); //Gear box damage ToReturn.GearBoxDamagePercent = bam.NextByte(); //FIA Vehicle Flag sbyte fiavf = Convert.ToSByte(bam.NextByte()); if (fiavf == -1) { ToReturn.VehicleFiaFlag = FiaFlag.Unknown; } else if (fiavf == 0) { ToReturn.VehicleFiaFlag = FiaFlag.None; } else if (fiavf == 1) { ToReturn.VehicleFiaFlag = FiaFlag.Green; } else if (fiavf == 2) { ToReturn.VehicleFiaFlag = FiaFlag.Blue; } else if (fiavf == 3) { ToReturn.VehicleFiaFlag = FiaFlag.Yellow; } else if (fiavf == 4) { ToReturn.VehicleFiaFlag = FiaFlag.Red; } //Ers Store energy ToReturn.ErsStoredEnergyJoules = BitConverter.ToSingle(bam.NextBytes(4), 0); //Ers deploy mode nb = bam.NextByte(); if (nb == 0) { ToReturn.SelectedErsDeployMode = ErsDeployMode.None; } else if (nb == 1) { ToReturn.SelectedErsDeployMode = ErsDeployMode.Medium; } else if (nb == 2) { ToReturn.SelectedErsDeployMode = ErsDeployMode.Overtake; } else if (nb == 3) { ToReturn.SelectedErsDeployMode = ErsDeployMode.HotLap; } //Ers Harvested this lap by MGUK ToReturn.ErsHarvestedThisLapByMGUK = BitConverter.ToSingle(bam.NextBytes(4), 0); //Ers harvested this lap by MGUH ToReturn.ErsHarvestedThisLapByMGUH = BitConverter.ToSingle(bam.NextBytes(4), 0); //Ers deployed this lap ToReturn.ErsDeployedThisLap = BitConverter.ToSingle(bam.NextBytes(4), 0); return(ToReturn); }
private static IPacket CarStatus(PacketHeader packetHeader, BinaryReader reader) { var packetCarStatus = new PacketCarStatusData(packetHeader); for (int i = 0; i < MaxNumberOfCarsOnTrack; i++) { var carStatusData = new CarStatusData(); packetCarStatus.CarStatusData[i] = carStatusData; carStatusData.TractionControl = reader.ReadByte(); carStatusData.AntiLockBrakes = reader.ReadByte(); carStatusData.FuelMix = reader.ReadByte(); carStatusData.FrontBrakeBias = reader.ReadByte(); carStatusData.pitLimiterStatus = reader.ReadByte(); carStatusData.FuelInTank = reader.ReadSingle(); carStatusData.FuelCapacity = reader.ReadSingle(); carStatusData.FuelRemainingLaps = reader.ReadSingle(); carStatusData.MaxRPM = reader.ReadUInt16(); carStatusData.IdleRPM = reader.ReadUInt16(); carStatusData.MaxGears = reader.ReadByte(); carStatusData.DrsAllowed = reader.ReadByte(); carStatusData.DrsActivationDistance = reader.ReadUInt16(); carStatusData.TyresWear = new byte[NumberOfTyres]; for (int j = 0; j < NumberOfTyres; j++) { carStatusData.TyresWear[j] = reader.ReadByte(); } carStatusData.ActualTyreCompound = reader.ReadByte(); carStatusData.VisualTyreCompound = reader.ReadByte(); carStatusData.TyresAgeLaps = reader.ReadByte(); carStatusData.TyresDamage = new byte[NumberOfTyres]; for (int j = 0; j < NumberOfTyres; j++) { carStatusData.TyresDamage[j] = reader.ReadByte(); } carStatusData.FrontLeftWingDamage = reader.ReadByte(); carStatusData.FrontRightWingDamage = reader.ReadByte(); carStatusData.RearWingDamage = reader.ReadByte(); carStatusData.DrsFault = reader.ReadByte(); carStatusData.EngineDamage = reader.ReadByte(); carStatusData.GearBoxDamage = reader.ReadByte(); carStatusData.VehicleFiaFlags = reader.ReadSByte(); carStatusData.ErsStoreEnergy = reader.ReadSingle(); carStatusData.ErsDeployMode = reader.ReadByte(); carStatusData.ErsHarvestedThisLapMGUK = reader.ReadSingle(); carStatusData.ErsHarvestedThisLapMGUH = reader.ReadSingle(); carStatusData.ErsDeployedThisLap = reader.ReadSingle(); } return(packetCarStatus); }