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; }