]> git.mxchange.org Git - flightgear.git/blobdiff - src/Environment/environment_ctrl.hxx
Don't restore initial screen geometry because there is nothing in fg_os* to resize...
[flightgear.git] / src / Environment / environment_ctrl.hxx
index 5c8ddb8ff9d03d5cba869d901d19ab5a70c35e2c..aee0a368bbf75b54ca5f81c1b2e055ff80f731e8 100644 (file)
@@ -16,7 +16,7 @@
 //
 // You should have received a copy of the GNU General Public License
 // along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 // $Id$
 
@@ -27,7 +27,7 @@
 #include <simgear/structure/subsystem_mgr.hxx>
 #include <simgear/environment/metar.hxx>
 
-#ifdef ENABLE_THREADS
+#if defined(ENABLE_THREADS)
 # include <simgear/threads/SGThread.hxx>
 # include <simgear/threads/SGQueue.hxx>
 #endif
 #  include <math.h>
 #endif
 
+#include <queue>
 #include <vector>
 
+SG_USING_STD(queue);
 SG_USING_STD(vector);
 
 class SGPropertyNode;
 
 #include "environment.hxx"
+#include "fgmetar.hxx"
 
 
 \f
@@ -61,7 +64,7 @@ public:
 
   virtual void setEnvironment (FGEnvironment * environment);
 
-  virtual FGEnvironment * getEnvironment () const { return _environment; }
+  virtual const FGEnvironment * getEnvironment () const { return _environment; }
 
   virtual void setLongitudeDeg (double lon_deg);
   virtual void setLatitudeDeg (double lat_deg);
@@ -139,9 +142,16 @@ private:
 };
 
 
+// A convenience wrapper around FGMetar
+struct FGMetarResult {
+    string icao;
+    FGMetar *m;
+};
+
+
 \f
 /**
- * Interplation controller using the SGMetar class
+ * Interplation controller using the FGMetar class
  */
 class FGMetarEnvironmentCtrl : public FGEnvironmentCtrl
 {
@@ -152,7 +162,6 @@ public:
     virtual void init ();
     virtual void reinit ();
     virtual void update (double delta_time_sec);
-
     virtual void setEnvironment (FGEnvironment * environment);
 
 private:
@@ -164,23 +173,41 @@ private:
     float same_station_interval_sec;
     float search_elapsed;
     float fetch_elapsed;
-    FGAirport last_apt;
+    const FGAirport *last_apt;
     SGPropertyNode *proxy_host;
     SGPropertyNode *proxy_port;
     SGPropertyNode *proxy_auth;
+    SGPropertyNode *metar_max_age;
 
-    bool fetch_data (const string &icao);
+    FGMetarResult fetch_data( const string &icao );
+    virtual void update_metar_properties( const FGMetar *m );
     void update_env_config();
 
-
 private:
 
-#ifdef ENABLE_THREADS
+#if defined(ENABLE_THREADS)
+    /**
+     * FIFO queue which holds a pointer to the fetched metar data.
+     */
+    SGBlockingQueue < string > request_queue;
+
+    /**
+     * FIFO queue which holds a pointer to the fetched metar data.
+     */
+    SGLockedQueue < FGMetarResult > result_queue;
+#else
+    /**
+     * FIFO queue which holds a pointer to the fetched metar data.
+     */
+    queue < string > request_queue;
+
     /**
      * FIFO queue which holds a pointer to the fetched metar data.
      */
-    SGBlockingQueue< SGMetar * > metar_queue;
+    queue < FGMetarResult > result_queue;
+#endif
 
+#if defined(ENABLE_THREADS)
     /**
      * This class represents the thread of execution responsible for
      * fetching the metar data.
@@ -192,7 +219,7 @@ private:
         ~MetarThread() {}
 
         /**
-         * Reads the tile from disk.
+         * Fetche the metar data from the NOAA.
          */
         void run();
 
@@ -213,17 +240,13 @@ private:
      */
     MetarThread* thread;
 
-    /**
-     * Lock and synchronize access to metar queue.
-     */
-    SGMutex mutex;
-    SGPthreadCond metar_cond;
-
-    /**
-     * Thread cleanup handler.
-     */
-    friend void metar_cleanup_handler( void* );
+    void thread_stop();
 #endif // ENABLE_THREADS
+
+    int _error_count;
+    int _stale_count;
+    double _dt;
+    double _error_dt;
 };
 
 #endif // _ENVIRONMENT_CTRL_HXX