From c4a38e10ecff7312683379d450a0ae37af6508c6 Mon Sep 17 00:00:00 2001 From: ehofman Date: Sun, 3 Aug 2008 14:34:42 +0000 Subject: [PATCH] James Turner: Attached patch + new file make FGNavRecord have a .cxx file, and a constructor w hich allows all the parameters to be supplied. Along the way I also cleaned up t he navrecord.hxx header, lots more header pollution has been killed. Some long methods are no longer inline, but were all suspiciously long to meet c ompiler inlining criteria (I'm not clear if the 'inline' keyword is advisory or mandatory in this situation) - I don't expect this to affect performance in any way whatsoever. The constructor addition is to support some hacking I'm doing improving the star tup performance of the navDB by lazily loading the data, and caching it in a mor e efficient format than text. I'm submitting this change (and probably some othe r small tweaks in the future) since they are worthwhile as cleanups regardless o f how my current experiments work out. --- src/Instrumentation/adf.cxx | 1 + src/Instrumentation/dclgps.cxx | 3 + src/Instrumentation/dclgps.hxx | 2 + src/Instrumentation/gps.cxx | 2 + src/Instrumentation/kr_87.cxx | 2 + src/Instrumentation/navradio.cxx | 11 +-- src/Navaids/Makefile.am | 3 +- src/Navaids/navdb.cxx | 1 + src/Navaids/navrecord.cxx | 148 +++++++++++++++++++++++++++++++ src/Navaids/navrecord.hxx | 130 +++------------------------ 10 files changed, 174 insertions(+), 129 deletions(-) create mode 100644 src/Navaids/navrecord.cxx diff --git a/src/Instrumentation/adf.cxx b/src/Instrumentation/adf.cxx index 114f0b658..e8c20710f 100644 --- a/src/Instrumentation/adf.cxx +++ b/src/Instrumentation/adf.cxx @@ -10,6 +10,7 @@ #include #include #include +#include #include
#include
diff --git a/src/Instrumentation/dclgps.cxx b/src/Instrumentation/dclgps.cxx index 8707ccf1e..9c4ada712 100644 --- a/src/Instrumentation/dclgps.cxx +++ b/src/Instrumentation/dclgps.cxx @@ -27,6 +27,9 @@ #include #include +#include +#include + #include
#include using std::cout; diff --git a/src/Instrumentation/dclgps.hxx b/src/Instrumentation/dclgps.hxx index c05bf75ff..552691827 100644 --- a/src/Instrumentation/dclgps.hxx +++ b/src/Instrumentation/dclgps.hxx @@ -40,6 +40,8 @@ using namespace std; +class SGTime; + enum GPSDistanceUnits { GPS_DIST_UNITS_NM = 0, GPS_DIST_UNITS_KM diff --git a/src/Instrumentation/gps.cxx b/src/Instrumentation/gps.cxx index aff76facf..362f68e20 100644 --- a/src/Instrumentation/gps.cxx +++ b/src/Instrumentation/gps.cxx @@ -13,6 +13,8 @@ #include #include #include +#include + #include #include
diff --git a/src/Instrumentation/kr_87.cxx b/src/Instrumentation/kr_87.cxx index 4749ce856..2188c08c9 100644 --- a/src/Instrumentation/kr_87.cxx +++ b/src/Instrumentation/kr_87.cxx @@ -29,6 +29,8 @@ #include #include +#include +#include #include #include diff --git a/src/Instrumentation/navradio.cxx b/src/Instrumentation/navradio.cxx index dc9c094b9..5bd49d263 100644 --- a/src/Instrumentation/navradio.cxx +++ b/src/Instrumentation/navradio.cxx @@ -25,25 +25,20 @@ # include #endif -#include -#include #include -#include #include -#include +#include #include +#include +#include #include -#include #include - #include "navradio.hxx" -#include using std::string; - // Constructor FGNavRadio::FGNavRadio(SGPropertyNode *node) : lon_node(fgGetNode("/position/longitude-deg", true)), diff --git a/src/Navaids/Makefile.am b/src/Navaids/Makefile.am index 7810dd4e5..cff153f9b 100644 --- a/src/Navaids/Makefile.am +++ b/src/Navaids/Makefile.am @@ -6,7 +6,8 @@ libNavaids_a_SOURCES = \ navdb.hxx navdb.cxx \ fix.hxx fixlist.hxx fixlist.cxx \ awynet.hxx awynet.cxx \ - navrecord.hxx navlist.hxx navlist.cxx + navrecord.hxx navrecord.cxx \ + navlist.hxx navlist.cxx # ils.hxx ilslist.hxx ilslist.cxx \ # mkrbeacons.hxx mkrbeacons.cxx diff --git a/src/Navaids/navdb.cxx b/src/Navaids/navdb.cxx index 817c761cb..089639f04 100644 --- a/src/Navaids/navdb.cxx +++ b/src/Navaids/navdb.cxx @@ -29,6 +29,7 @@ #include #include +#include #include #include diff --git a/src/Navaids/navrecord.cxx b/src/Navaids/navrecord.cxx new file mode 100644 index 000000000..2aa25424f --- /dev/null +++ b/src/Navaids/navrecord.cxx @@ -0,0 +1,148 @@ +// navrecord.cxx -- generic vor/dme/ndb class +// +// Written by Curtis Olson, started May 2004. +// +// Copyright (C) 2004 Curtis L. Olson - http://www.flightgear.org/~curt +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// $Id$ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include +#include +#include "Navaids/navrecord.hxx" + +FGNavRecord::FGNavRecord(void) : + type(0), + pos(SGGeod::fromDeg(0, 0)), + cart(0, 0, 0), + freq(0), + range(0), + multiuse(0.0), + ident(""), + name(""), + apt_id(""), + serviceable(true), + trans_ident("") +{ +} + +FGNavRecord::FGNavRecord(int aTy, const std::string& aIdent, + const std::string& aName, const std::string& aAirport, + double lat, double lon, int aFreq, int aRange, double aMultiuse) : + type(aTy), + freq(aFreq), + range(aRange), + multiuse(aMultiuse), + ident(aIdent), + name(aName), + apt_id(aAirport), + serviceable(true), + trans_ident(aIdent) +{ + pos = SGGeod::fromDeg(lon, lat); + cart = SGVec3d::fromGeod(pos); +} + +fg_nav_types FGNavRecord::get_fg_type() const { + switch(type) { + case 2: return(FG_NAV_NDB); + case 3: return(FG_NAV_VOR); + case 4: return(FG_NAV_ILS); + default: return(FG_NAV_ANY); + } +} + + +std::istream& operator>>( std::istream& in, FGNavRecord& n ) +{ + in >> n.type; + + if ( n.type == 99 ) { + return in >> skipeol; + } + + double lat, lon, elev_ft; + in >> lat >> lon >> elev_ft >> n.freq >> n.range >> n.multiuse + >> n.ident; + n.pos.setLatitudeDeg(lat); + n.pos.setLongitudeDeg(lon); + n.pos.setElevationFt(elev_ft); + getline( in, n.name ); + + // silently multiply adf frequencies by 100 so that adf + // vs. nav/loc frequency lookups can use the same code. + if ( n.type == 2 ) { + n.freq *= 100; + } + + // Remove any leading spaces before the name + while ( n.name.substr(0,1) == " " ) { + n.name = n.name.erase(0,1); + } + + if ( n.type >= 4 && n.type <= 9 ) { + // these types are always associated with an airport id + std::string::size_type pos = n.name.find(" "); + n.apt_id = n.name.substr(0, pos); + } + + // Ranges are included with the latest data format, no need to + // assign our own defaults, unless the range is not set for some + // reason. + + if ( n.range < 0.1 ) { + // assign default ranges + + if ( n.type == 2 || n.type == 3 ) { + n.range = FG_NAV_DEFAULT_RANGE; + } else if ( n.type == 4 || n.type == 5 || n.type == 6 ) { + n.range = FG_LOC_DEFAULT_RANGE; + } else if ( n.type == 12 ) { + n.range = FG_DME_DEFAULT_RANGE; + } else { + n.range = FG_LOC_DEFAULT_RANGE; + } + } + + // transmitted ident (same as ident unless modeling a fault) + n.trans_ident = n.ident; + + // generate cartesian coordinates + n.cart = SGVec3d::fromGeod(n.pos); + + return in; +} + + +FGTACANRecord::FGTACANRecord(void) : + channel(""), + freq(0) + +{ +} + +std::istream& +operator >> ( std::istream& in, FGTACANRecord& n ) +{ + in >> n.channel >> n.freq ; + //getline( in, n.name ); + + return in; +} diff --git a/src/Navaids/navrecord.hxx b/src/Navaids/navrecord.hxx index 652948747..7ee00ed43 100644 --- a/src/Navaids/navrecord.hxx +++ b/src/Navaids/navrecord.hxx @@ -24,19 +24,11 @@ #ifndef _FG_NAVRECORD_HXX #define _FG_NAVRECORD_HXX -#include +#include -#include -#include -#include -#include -#include - -#include +#include #include -#include - #define FG_NAV_DEFAULT_RANGE 50 // nm #define FG_LOC_DEFAULT_RANGE 18 // nm #define FG_DME_DEFAULT_RANGE 50 // nm @@ -72,12 +64,16 @@ class FGNavRecord : public SGReferenced { std::string trans_ident; // for failure modeling public: - - inline FGNavRecord(void); + FGNavRecord(void); inline ~FGNavRecord(void) {} + FGNavRecord(int type, const std::string& ident, const std::string& name, const std::string& airport, + double lat, double lon, int freq, int range, double multiuse); + inline int get_type() const { return type; } - inline fg_nav_types get_fg_type() const; + + fg_nav_types get_fg_type() const; + inline double get_lon() const { return pos.getLongitudeDeg(); } // degrees inline void set_lon( double l ) { pos.setLongitudeDeg(l); } // degrees inline double get_lat() const { return pos.getLatitudeDeg(); } // degrees @@ -99,95 +95,6 @@ public: friend std::istream& operator>> ( std::istream&, FGNavRecord& ); }; - -inline -FGNavRecord::FGNavRecord(void) : - type(0), - pos(SGGeod::fromDeg(0, 0)), - cart(0, 0, 0), - freq(0), - range(0), - multiuse(0.0), - ident(""), - name(""), - apt_id(""), - serviceable(true), - trans_ident("") -{ -} - - -inline fg_nav_types FGNavRecord::get_fg_type() const { - switch(type) { - case 2: return(FG_NAV_NDB); - case 3: return(FG_NAV_VOR); - case 4: return(FG_NAV_ILS); - default: return(FG_NAV_ANY); - } -} - - -inline std::istream& -operator >> ( std::istream& in, FGNavRecord& n ) -{ - in >> n.type; - - if ( n.type == 99 ) { - return in >> skipeol; - } - - double lat, lon, elev_ft; - in >> lat >> lon >> elev_ft >> n.freq >> n.range >> n.multiuse - >> n.ident; - n.pos.setLatitudeDeg(lat); - n.pos.setLongitudeDeg(lon); - n.pos.setElevationFt(elev_ft); - getline( in, n.name ); - - // silently multiply adf frequencies by 100 so that adf - // vs. nav/loc frequency lookups can use the same code. - if ( n.type == 2 ) { - n.freq *= 100; - } - - // Remove any leading spaces before the name - while ( n.name.substr(0,1) == " " ) { - n.name = n.name.erase(0,1); - } - - if ( n.type >= 4 && n.type <= 9 ) { - // these types are always associated with an airport id - std::string::size_type pos = n.name.find(" "); - n.apt_id = n.name.substr(0, pos); - } - - // Ranges are included with the latest data format, no need to - // assign our own defaults, unless the range is not set for some - // reason. - - if ( n.range < 0.1 ) { - // assign default ranges - - if ( n.type == 2 || n.type == 3 ) { - n.range = FG_NAV_DEFAULT_RANGE; - } else if ( n.type == 4 || n.type == 5 || n.type == 6 ) { - n.range = FG_LOC_DEFAULT_RANGE; - } else if ( n.type == 12 ) { - n.range = FG_DME_DEFAULT_RANGE; - } else { - n.range = FG_LOC_DEFAULT_RANGE; - } - } - - // transmitted ident (same as ident unless modeling a fault) - n.trans_ident = n.ident; - - // generate cartesian coordinates - n.cart = SGVec3d::fromGeod(n.pos); - - return in; -} - class FGTACANRecord : public SGReferenced { std::string channel; @@ -195,7 +102,7 @@ class FGTACANRecord : public SGReferenced { public: - inline FGTACANRecord(void); + FGTACANRecord(void); inline ~FGTACANRecord(void) {} inline const std::string& get_channel() const { return channel; } @@ -203,21 +110,4 @@ public: friend std::istream& operator>> ( std::istream&, FGTACANRecord& ); }; - -inline -FGTACANRecord::FGTACANRecord(void) : - channel(""), - freq(0) - -{ -} - -inline std::istream& -operator >> ( std::istream& in, FGTACANRecord& n ) -{ - in >> n.channel >> n.freq ; - //getline( in, n.name ); - - return in; -} #endif // _FG_NAVRECORD_HXX