]> git.mxchange.org Git - flightgear.git/commitdiff
Fix incorrect QNH in spoken ATIS when using live weather fetch
authorRichard Senior <richard.j.senior@gmail.com>
Tue, 26 Apr 2016 09:30:15 +0000 (10:30 +0100)
committerRichard Senior <richard.j.senior@gmail.com>
Tue, 26 Apr 2016 09:52:29 +0000 (10:52 +0100)
When using live weather fetch, the QNH should be obtained from
environment/metar/pressure-inhg.

See: http://sourceforge.net/p/flightgear/mailman/message/35037125

Add new method getQnhInHg to ATISInformationProvider and its implementations
to avoid rounding errors converting from hPa back to inches in ATIS reports.

The CurrentWeatherATISInformationProvider (used when live weather fetch is
not in use) continues to use the property environment/pressure-sea-level-inhg.
This produces the incorrect QNH at airports significantly above sea level
but this needs fixing elsewhere to calculate the correct QNH.

src/ATC/ATISEncoder.cxx
src/ATC/ATISEncoder.hxx
src/ATC/CurrentWeatherATISInformationProvider.cxx
src/ATC/CurrentWeatherATISInformationProvider.hxx
src/ATC/MetarPropertiesATISInformationProvider.cxx
src/ATC/MetarPropertiesATISInformationProvider.hxx

index 03f48e282fd4b5889cc4038058b2242d3cc062f8..294bb8306710013d0604d10e0a5d00df97e19c34 100644 (file)
@@ -565,13 +565,13 @@ string ATISEncoder::getQnh( SGPropertyNode_ptr )
 
 string ATISEncoder::getInhgInteger( SGPropertyNode_ptr )
 {
-  double qnh = _atis->getQnh() * 100 / SG_INHG_TO_PA;
+  double qnh = _atis->getQnhInHg();
   return getSpokenNumber( (int)qnh, true, 2 );
 }
 
 string ATISEncoder::getInhgFraction( SGPropertyNode_ptr )
 {
-  double qnh = _atis->getQnh() * 100 / SG_INHG_TO_PA;
+  double qnh = _atis->getQnhInHg();
   int f = int(100 * (qnh - int(qnh)) + 0.5);
   return getSpokenNumber( f, true, 2 );
 }
index 57958a1a1dd4470a2a221051426923375eeb87e4..ee5089a0e641a357e0e67713af097024831cf4bb 100644 (file)
@@ -53,6 +53,7 @@ public:
     virtual int getWindSpeedKt() = 0;
     virtual int getGustsKt() = 0;
     virtual int getQnh() = 0;
+    virtual double getQnhInHg() = 0;
     virtual bool isCavok() = 0;
     virtual int getVisibilityMeters() = 0;
     virtual std::string getPhenomena() = 0;
index b2c0ca62961145d54745347063dfc0b920bfe41c..a19bbe433ebea8fdc1ae3f33bee0dbb2857b4f93 100644 (file)
@@ -85,9 +85,16 @@ int CurrentWeatherATISInformationProvider::getGustsKt()
 
 int CurrentWeatherATISInformationProvider::getQnh()
 {
+  // TODO: Calculate QNH correctly from environment
   return roundToInt( _environment->getNode("pressure-sea-level-inhg",true)->getDoubleValue() * SG_INHG_TO_PA / 100 );
 }
 
+double CurrentWeatherATISInformationProvider::getQnhInHg()
+{
+  // TODO: Calculate QNH correctly from environment
+  return _environment->getNode("pressure-sea-level-inhg",true)->getDoubleValue();
+}
+
 bool CurrentWeatherATISInformationProvider::isCavok()
 {
   return false;
index 1c96bacecb951f0a41cc47425a2e1f0071f303c6..2b679fe9b6e657ecee6baaa76484183afbd6c880 100644 (file)
@@ -41,6 +41,7 @@ protected:
     virtual int getWindSpeedKt();
     virtual int getGustsKt();
     virtual int getQnh();
+    virtual double getQnhInHg();
     virtual bool isCavok();
     virtual int getVisibilityMeters();
     virtual std::string getPhenomena();
index 7380ca93e51adeac17c28f8aabc3d37a40e32dd8..3dcb9a3b534f2d1d2822c2aea187ba103205ffd5 100644 (file)
@@ -72,10 +72,14 @@ int MetarPropertiesATISInformationProvider::getGustsKt()
   return _metar->getIntValue( "gust-wind-speed-kt" );
 }
 
-
 int MetarPropertiesATISInformationProvider::getQnh()
 {
-  return _metar->getDoubleValue("pressure-sea-level-inhg") * SG_INHG_TO_PA / 100.0;
+  return _metar->getDoubleValue("pressure-inhg") * SG_INHG_TO_PA / 100.0;
+}
+
+double MetarPropertiesATISInformationProvider::getQnhInHg()
+{
+  return _metar->getDoubleValue("pressure-inhg");
 }
 
 bool MetarPropertiesATISInformationProvider::isCavok()
index 151ded47509bec78e5a171410e93704a9ae4801c..660a5814f5646c1b6aff3f4cc8f5e6e43e7287a7 100644 (file)
@@ -43,6 +43,7 @@ protected:
     virtual int getWindSpeedKt();
     virtual int getGustsKt();
     virtual int getQnh();
+    virtual double getQnhInHg();
     virtual bool isCavok();
     virtual int getVisibilityMeters();
     virtual std::string getPhenomena();