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.
This commit is contained in:
parent
66eef4dafc
commit
c4a38e10ec
10 changed files with 174 additions and 129 deletions
|
@ -10,6 +10,7 @@
|
|||
#include <simgear/compiler.h>
|
||||
#include <simgear/math/sg_geodesy.hxx>
|
||||
#include <simgear/math/sg_random.h>
|
||||
#include <simgear/timing/sg_time.hxx>
|
||||
|
||||
#include <Main/fg_props.hxx>
|
||||
#include <Main/util.hxx>
|
||||
|
|
|
@ -27,6 +27,9 @@
|
|||
|
||||
#include <simgear/sg_inlines.h>
|
||||
#include <simgear/structure/commands.hxx>
|
||||
#include <simgear/timing/sg_time.hxx>
|
||||
#include <simgear/magvar/magvar.hxx>
|
||||
|
||||
#include <Main/fg_props.hxx>
|
||||
#include <iostream>
|
||||
using std::cout;
|
||||
|
|
|
@ -40,6 +40,8 @@
|
|||
|
||||
using namespace std;
|
||||
|
||||
class SGTime;
|
||||
|
||||
enum GPSDistanceUnits {
|
||||
GPS_DIST_UNITS_NM = 0,
|
||||
GPS_DIST_UNITS_KM
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
#include <simgear/route/route.hxx>
|
||||
#include <simgear/math/sg_random.h>
|
||||
#include <simgear/sg_inlines.h>
|
||||
#include <simgear/math/sg_geodesy.hxx>
|
||||
|
||||
#include <Airports/simple.hxx>
|
||||
|
||||
#include <Main/fg_init.hxx>
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
|
||||
#include <simgear/compiler.h>
|
||||
#include <simgear/math/sg_random.h>
|
||||
#include <simgear/math/sg_geodesy.hxx>
|
||||
#include <simgear/timing/sg_time.hxx>
|
||||
|
||||
#include <Aircraft/aircraft.hxx>
|
||||
#include <Navaids/navlist.hxx>
|
||||
|
|
|
@ -25,25 +25,20 @@
|
|||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
|
||||
#include <simgear/compiler.h>
|
||||
#include <simgear/sg_inlines.h>
|
||||
#include <simgear/math/sg_random.h>
|
||||
#include <simgear/timing/sg_time.hxx>
|
||||
#include <simgear/math/vector.hxx>
|
||||
#include <simgear/math/sg_random.h>
|
||||
#include <simgear/math/sg_geodesy.hxx>
|
||||
#include <simgear/structure/exception.hxx>
|
||||
|
||||
#include <Aircraft/aircraft.hxx>
|
||||
#include <Navaids/navlist.hxx>
|
||||
|
||||
#include "navradio.hxx"
|
||||
|
||||
#include <string>
|
||||
using std::string;
|
||||
|
||||
|
||||
// Constructor
|
||||
FGNavRadio::FGNavRadio(SGPropertyNode *node) :
|
||||
lon_node(fgGetNode("/position/longitude-deg", true)),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <string>
|
||||
|
||||
#include <simgear/debug/logstream.hxx>
|
||||
#include <simgear/math/sg_geodesy.hxx>
|
||||
|
||||
#include <Airports/runways.hxx>
|
||||
#include <Airports/simple.hxx>
|
||||
|
|
148
src/Navaids/navrecord.cxx
Normal file
148
src/Navaids/navrecord.cxx
Normal file
|
@ -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 <istream>
|
||||
#include <simgear/misc/sgstream.hxx>
|
||||
#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;
|
||||
}
|
|
@ -24,19 +24,11 @@
|
|||
#ifndef _FG_NAVRECORD_HXX
|
||||
#define _FG_NAVRECORD_HXX
|
||||
|
||||
#include <stdio.h>
|
||||
#include <iosfwd>
|
||||
|
||||
#include <simgear/compiler.h>
|
||||
#include <simgear/math/sg_geodesy.hxx>
|
||||
#include <simgear/misc/sgstream.hxx>
|
||||
#include <simgear/magvar/magvar.hxx>
|
||||
#include <simgear/timing/sg_time.hxx>
|
||||
|
||||
#include <simgear/structure/SGSharedPtr.hxx>
|
||||
#include <simgear/math/SGMath.hxx>
|
||||
#include <simgear/structure/SGReferenced.hxx>
|
||||
|
||||
#include <istream>
|
||||
|
||||
#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
|
||||
|
|
Loading…
Add table
Reference in a new issue