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);
        }
Example #2
0
 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);
        }
Example #4
0
        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);
        }
Example #9
0
            /// <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);
            }
Example #10
0
        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);
        }