Ejemplo n.º 1
0
        private void CalculateFromPressures(float pitotPress, float staticPress)
        {
            var speedMps = Math.Sqrt(dp_Coef * Math.Max(0, pitotPress - AIS_Baseline));
            var speedKts = speedMps * mps2kts;

            // Compute the airspeed
            airspeed = ((int)(speedKts < 30d ? 0 : speedKts)).ToString();

            var baro2X = Math.Pow((double)((staticPress - mbOffset) / seaLevelMp), coefOfPressChange);

            var now    = DateTime.Now;
            var tDelta = now - lastVsiUpdate;

            if (tDelta.Ticks == 0)
            {
                tDelta = new TimeSpan(200);
            }
            var dT = Math.Min(0.3d, Math.Max(-0.3d, tDelta.TotalMilliseconds / 1000.0d));

            lastVsiUpdate = now;

            // initial state
            if (baro2XLast == 0)
            {
                baro2XLast = baro2X;
            }
            if (speedLast == 0)
            {
                speedLast = speedMps;
            }


            var kinetticEnergy  = speedMps * speedMps / 19.8d; // must be signed to work... lossing velocity needs to drop total energy
            var potentialEnergy = 44330d * (1.0d - baro2X);

            var totalEnergy = potentialEnergy + kinetticEnergy;

            if (totalEnergyLast == 0)
            {
                totalEnergyLast = totalEnergy;
            }

            // Altituded change from pressure difference derivation
            // --- Given
            // k = 44330
            // x = 1 / 5.25
            // p0 = 1013.25
            // --- stubtracting two pressures equations yields;
            // [k * (1 - (p2 / p0) ^ x)] - [k * (1 - (p1 / p0) ^ x)]
            // -- Then
            // k * [(1 - (p2 / p0) ^ x) - (1 - (p1 / p0) ^ x)]
            // k * (1 - (p2 / p0) ^ x - 1 + (p1 / p0) ^ x)
            // k * ((p1 / p0) ^ x - (p2 / p0) ^ x)  => p1^x / p0^x
            // k * (p1 ^ x - p2 ^ x) / p0 ^ x
            // --- QED
            // k / p0 ^ x * (p1 ^ x - p2 ^ x), or
            // 11862.610784520926279471081940874 * (p1 ^ x - p2 ^ x)
            const double k_over_p02x = 11862.610784520926279471081940874;

            // Convert the baro pressure then add the kinnetic energy factor to generate a total energy
            totalEnergyVV = vsiFilter.Update(2d * (totalEnergy - totalEnergyLast) / dT);

            var vv30 = (int)(3d * k_over_p02x * tdiVsi30.Push((float)baro2X, now) * mps2fpm);
            var vsiT = (int)(totalEnergyVV * mps2fpm);

            if (displayUpdateCounter-- == 0)
            {
                displayUpdateCounter = 10;
                vsi      = (20 * (int)Math.Round(vsiT / 20d)).ToString();
                vsi30    = "30s " + (10 * (int)Math.Round(vv30 / 10d)).ToString();
                altitude = (int)(/* meters=> 44330*/ 145439.6d * (1.0 - baro2X));
            }

            baro2XLast      = baro2X;
            speedLast       = speedMps;
            totalEnergyLast = totalEnergy;
        }