]> git.mxchange.org Git - simgear.git/blobdiff - simgear/environment/metar.hxx
tolerate NDV (no directional validation) in METAR
[simgear.git] / simgear / environment / metar.hxx
index 275c7cbe40b363782a6c941e9499e35de88e1b25..b6439a27a039a816f4e93f20ab666ca59437ca0a 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, 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 // $Id$
 
 
 #include <simgear/constants.h>
 
-SG_USING_STD(vector);
-SG_USING_STD(map);
-SG_USING_STD(string);
+using std::vector;
+using std::map;
+using std::string;
 
 const double SGMetarNaN = -1E20;
 #define NaN SGMetarNaN
 
 struct Token {
-       char    *id;
-       char    *text;
+       const char *id;
+       const char *text;
 };
 
 
@@ -67,6 +67,8 @@ public:
                DECREASING
        };
 
+       void set(double dist, int dir = -1, int mod = -1, int tend = -1);
+
        inline double   getVisibility_m()       const { return _distance; }
        inline double   getVisibility_ft()      const { return _distance == NaN ? NaN : _distance * SG_METER_TO_FEET; }
        inline double   getVisibility_sm()      const { return _distance == NaN ? NaN : _distance * SG_METER_TO_SM; }
@@ -87,7 +89,8 @@ class SGMetarRunway {
        friend class SGMetar;
 public:
        SGMetarRunway() :
-               _deposit(0),
+               _deposit(-1),
+               _deposit_string(0),
                _extent(-1),
                _extent_string(0),
                _depth(NaN),
@@ -96,7 +99,8 @@ public:
                _comment(0),
                _wind_shear(false) {}
 
-       inline const char               *getDeposit()           const { return _deposit; }
+       inline int                      getDeposit()            const { return _deposit; }
+       inline const char               *getDepositString()     const { return _deposit_string; }
        inline double                   getExtent()             const { return _extent; }
        inline const char               *getExtentString()      const { return _extent_string; }
        inline double                   getDepth()              const { return _depth; }
@@ -104,13 +108,14 @@ public:
        inline const char               *getFrictionString()    const { return _friction_string; }
        inline const char               *getComment()           const { return _comment; }
        inline const bool               getWindShear()          const { return _wind_shear; }
-       inline SGMetarVisibility        getMinVisibility()      const { return _min_visibility; }
-       inline SGMetarVisibility        getMaxVisibility()      const { return _max_visibility; }
+       inline const SGMetarVisibility& getMinVisibility()      const { return _min_visibility; }
+       inline const SGMetarVisibility& getMaxVisibility()      const { return _max_visibility; }
 
 protected:
        SGMetarVisibility _min_visibility;
        SGMetarVisibility _max_visibility;
-       const char      *_deposit;
+       int             _deposit;
+       const char      *_deposit_string;
        int             _extent;
        const char      *_extent_string;
        double          _depth;
@@ -125,30 +130,28 @@ protected:
 class SGMetarCloud {
        friend class SGMetar;
 public:
-       SGMetarCloud() :
-               _coverage(-1),
-               _altitude(NaN),
-               _type(0),
-               _type_long(0) {}
-
-       inline int      getCoverage()           const { return _coverage; }
-       inline double   getAltitude_m()         const { return _altitude; }
-       inline double   getAltitude_ft()        const { return _altitude == NaN ? NaN : _altitude * SG_METER_TO_FEET; }
-       inline char     *getTypeString()        const { return _type; }
-       inline char     *getTypeLongString()    const { return _type_long; }
+       SGMetarCloud() : _coverage(-1), _altitude(NaN), _type(0), _type_long(0) {}
+
+       void set(double alt, int cov = -1);
+
+       inline int getCoverage() const { return _coverage; }
+       inline double getAltitude_m() const { return _altitude; }
+       inline double getAltitude_ft() const { return _altitude == NaN ? NaN : _altitude * SG_METER_TO_FEET; }
+       inline const char *getTypeString() const { return _type; }
+       inline const char *getTypeLongString() const { return _type_long; }
 
 protected:
-       int     _coverage;              // quarters: 0 -> clear ... 4 -> overcast
-       double  _altitude;              // 1000 m
-       char    *_type;                 // CU
-       char    *_type_long;            // cumulus
+       int _coverage;          // quarters: 0 -> clear ... 4 -> overcast
+       double _altitude;       // 1000 m
+       const char *_type;      // CU
+       const char *_type_long; // cumulus
 };
 
 
 class SGMetar {
 public:
-       SGMetar(const char *m);
-       SGMetar(const string m) { SGMetar(m.c_str()); }
+       SGMetar(const string& m, const string& proxy = "", const string& port = "",
+                       const string &auth = "", const time_t time = 0);
        ~SGMetar();
 
        enum ReportType {
@@ -160,6 +163,7 @@ public:
 
        inline const char *getData()            const { return _data; }
        inline const char *getUnusedData()      const { return _m; }
+       inline const bool getProxy()            const { return _x_proxy; }
        inline const char *getId()              const { return _icao; }
        inline int      getYear()               const { return _year; }
        inline int      getMonth()              const { return _month; }
@@ -170,22 +174,22 @@ public:
 
        inline int      getWindDir()            const { return _wind_dir; }
        inline double   getWindSpeed_mps()      const { return _wind_speed; }
-       inline double   getWindSpeed_kmh()      const { return _wind_speed == NaN ? NaN : _wind_speed * 3.6; }
+       inline double   getWindSpeed_kmh()      const { return _wind_speed == NaN ? NaN : _wind_speed * SG_MPS_TO_KMH; }
        inline double   getWindSpeed_kt()       const { return _wind_speed == NaN ? NaN : _wind_speed * SG_MPS_TO_KT; }
        inline double   getWindSpeed_mph()      const { return _wind_speed == NaN ? NaN : _wind_speed * SG_MPS_TO_MPH; }
 
        inline double   getGustSpeed_mps()      const { return _gust_speed; }
-       inline double   getGustSpeed_kmh()      const { return _gust_speed == NaN ? NaN : _gust_speed * 3.6; }
+       inline double   getGustSpeed_kmh()      const { return _gust_speed == NaN ? NaN : _gust_speed * SG_MPS_TO_KMH; }
        inline double   getGustSpeed_kt()       const { return _gust_speed == NaN ? NaN : _gust_speed * SG_MPS_TO_KT; }
        inline double   getGustSpeed_mph()      const { return _gust_speed == NaN ? NaN : _gust_speed * SG_MPS_TO_MPH; }
 
        inline int      getWindRangeFrom()      const { return _wind_range_from; }
        inline int      getWindRangeTo()        const { return _wind_range_to; }
 
-       inline SGMetarVisibility& getMinVisibility()    { return _min_visibility; }
-       inline SGMetarVisibility& getMaxVisibility()    { return _max_visibility; }
-       inline SGMetarVisibility& getVertVisibility()   { return _vert_visibility; }
-       inline SGMetarVisibility *getDirVisibility()    { return _dir_visibility; }
+       inline const SGMetarVisibility& getMinVisibility()      const { return _min_visibility; }
+       inline const SGMetarVisibility& getMaxVisibility()      const { return _max_visibility; }
+       inline const SGMetarVisibility& getVertVisibility()     const { return _vert_visibility; }
+       inline const SGMetarVisibility *getDirVisibility()      const { return _dir_visibility; }
 
        inline double   getTemperature_C()      const { return _temp; }
        inline double   getTemperature_F()      const { return _temp == NaN ? NaN : 1.8 * _temp + 32; }
@@ -194,14 +198,21 @@ public:
        inline double   getPressure_hPa()       const { return _pressure == NaN ? NaN : _pressure / 100; }
        inline double   getPressure_inHg()      const { return _pressure == NaN ? NaN : _pressure * SG_PA_TO_INHG; }
 
+       inline int      getRain()               const { return _rain; }
+       inline int      getHail()               const { return _hail; }
+       inline int      getSnow()               const { return _snow; }
+       inline bool     getCAVOK()              const { return _cavok; }
+
        double          getRelHumidity()        const;
 
-       inline vector<SGMetarCloud>& getClouds()        { return _clouds; }
-       inline map<string, SGMetarRunway>& getRunways() { return _runways; }
-       inline vector<string>& getWeather()             { return _weather; }
+       inline const vector<SGMetarCloud>& getClouds()  const   { return _clouds; }
+       inline const map<string, SGMetarRunway>& getRunways()   const   { return _runways; }
+       inline const vector<string>& getWeather()               const   { return _weather; }
 
 protected:
+       string  _url;
        int     _grpcount;
+       bool    _x_proxy;
        char    *_data;
        char    *_m;
        char    _icao[5];
@@ -219,6 +230,10 @@ protected:
        double  _temp;
        double  _dewp;
        double  _pressure;
+       int     _rain;
+       int     _hail;
+       int     _snow;
+       bool    _cavok;
 
        SGMetarVisibility               _min_visibility;
        SGMetarVisibility               _max_visibility;
@@ -230,6 +245,7 @@ protected:
 
        bool    scanPreambleDate();
        bool    scanPreambleTime();
+       void    useCurrentDate();
 
        bool    scanType();
        bool    scanId();
@@ -253,7 +269,8 @@ protected:
        int     scanNumber(char **str, int *num, int min, int max = 0);
        bool    scanBoundary(char **str);
        const struct Token *scanToken(char **str, const struct Token *list);
-       char    *loadData(const char *id);
+       char    *loadData(const char *id, const string& proxy, const string& port,
+                       const string &auth, time_t time);
        void    normalizeData();
 };