public static void Gauge(this IMetrics metrics, string name, f32_wheel wheel, float scale = 1)
 {
     metrics.Gauge($"wheels.front_left.{name}", wheel.FrontLeft * scale);
     metrics.Gauge($"wheels.front_right.{name}", wheel.FrontRight * scale);
     metrics.Gauge($"wheels.rear_left.{name}", wheel.RearLeft * scale);
     metrics.Gauge($"wheels.rear_right.{name}", wheel.RearRight * scale);
 }
        public ForzaPacket(byte[] data)
        {
            var read = new Parser(data);

            isRaceOn         = read.s32();
            timeStampMS      = read.u32();
            engineMaxRpm     = read.f32();
            engineIdleRpm    = read.f32();
            currentEngineRpm = read.f32();
            acceleration     = read.f32_Vec();
            velocity         = read.f32_Vec();
            angularVelocity  = read.f32_Vec();
            pitch            = read.f32();
            yaw  = read.f32();
            roll = read.f32();
            normalizedSuspensionTravel = read.f32_Wheel();
            tireSlipRatio          = read.f32_Wheel();
            wheelRotationSpeed     = read.f32_Wheel();
            wheelOnRumbleStrip     = read.f32_Wheel();
            wheelInPuddleDepth     = read.f32_Wheel();
            surfaceRumble          = read.f32_Wheel();
            tireSlipAngle          = read.f32_Wheel();
            tireCombinedSlip       = read.f32_Wheel();
            suspensionTravelMeters = read.f32_Wheel();
            carOrdinal             = read.s32();
            carClass           = read.s32();
            carPerfomanceIndex = read.s32();
            driveTrainType     = read.s32();
            numCylinders       = read.s32();

            hasDashData = data.Length >= 232;
            //
            if (data.Length >= 324)
            {
                b1 = read.u8();
                b2 = read.u8();
                b3 = read.u8();
                b4 = read.u8();
                b5 = read.u8();
                b6 = read.u8();
                b7 = read.u8();
                b8 = read.u8();
                b9 = read.u8();
                ba = read.u8();
                bb = read.u8();
                bc = read.u8();
            }
            if (hasDashData)
            {
                // Dash data
                position                    = read.f32_Vec();
                speed                       = read.f32();
                power                       = read.f32();
                torque                      = read.f32();
                tireTemp                    = read.f32_Wheel();
                boost                       = read.f32();
                fuel                        = read.f32();
                distanceTraveled            = read.f32();
                bestLap                     = read.f32();
                lastLap                     = read.f32();
                currentLap                  = read.f32();
                currentRaceTime             = read.f32();
                lapNumber                   = read.u16();
                racePosition                = read.u8();
                accel                       = read.u8();
                brake                       = read.u8();
                clutch                      = read.u8();
                handBrake                   = read.u8();
                gear                        = read.u8();
                steer                       = read.u8();
                normalizedDrivingLine       = read.s8();
                normalizedAIBrakeDifference = read.s8();
            }
            if (data.Length >= 324)
            {
                last = read.s8();
            }
        }