James Turner:
Modifications to support querying navaid database by station ID (not just frequency.) Some corresponding changes to testnavs.cxx to test new functionality.
This commit is contained in:
parent
bc179de4bd
commit
8b711a5782
3 changed files with 89 additions and 23 deletions
|
@ -1,4 +1,4 @@
|
||||||
// navaids.cxx -- navaids management class
|
// navlist.cxx -- navaids management class
|
||||||
//
|
//
|
||||||
// Written by Curtis Olson, started April 2000.
|
// Written by Curtis Olson, started April 2000.
|
||||||
//
|
//
|
||||||
|
@ -72,9 +72,9 @@ bool FGNavList::init( SGPath path ) {
|
||||||
while ( ! in.eof() ) {
|
while ( ! in.eof() ) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FGNav n;
|
FGNav *n = new FGNav;
|
||||||
in >> n;
|
in >> (*n);
|
||||||
if ( n.get_type() == '[' ) {
|
if ( n->get_type() == '[' ) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +86,9 @@ bool FGNavList::init( SGPath path ) {
|
||||||
cout << " freq = " << n.get_freq() << endl;
|
cout << " freq = " << n.get_freq() << endl;
|
||||||
cout << " range = " << n.get_range() << endl << endl; */
|
cout << " range = " << n.get_range() << endl << endl; */
|
||||||
|
|
||||||
navaids[n.get_freq()].push_back(n);
|
navaids [n->get_freq() ].push_back(n);
|
||||||
|
ident_navaids[n->get_ident()].push_back(n);
|
||||||
|
|
||||||
in >> skipcomment;
|
in >> skipcomment;
|
||||||
|
|
||||||
/* if ( n.get_type() != 'N' ) {
|
/* if ( n.get_type() != 'N' ) {
|
||||||
|
@ -116,25 +118,49 @@ bool FGNavList::query( double lon, double lat, double elev, double freq,
|
||||||
nav_list_iterator current = stations.begin();
|
nav_list_iterator current = stations.begin();
|
||||||
nav_list_iterator last = stations.end();
|
nav_list_iterator last = stations.end();
|
||||||
|
|
||||||
// double az1, az2, s;
|
|
||||||
Point3D aircraft = sgGeodToCart( Point3D(lon, lat, elev) );
|
Point3D aircraft = sgGeodToCart( Point3D(lon, lat, elev) );
|
||||||
|
return findNavFromList(aircraft, current, last, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool FGNavList::findByIdent(const char* ident, double lon, double lat,
|
||||||
|
FGNav *nav)
|
||||||
|
{
|
||||||
|
nav_list_type stations = ident_navaids[ident];
|
||||||
|
|
||||||
|
nav_list_iterator current = stations.begin();
|
||||||
|
nav_list_iterator last = stations.end();
|
||||||
|
|
||||||
|
Point3D aircraft = sgGeodToCart( Point3D(lon, lat, 0.0) );
|
||||||
|
return findNavFromList(aircraft, current, last, nav);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool FGNavList::findNavFromList(const Point3D &aircraft,
|
||||||
|
nav_list_iterator current,
|
||||||
|
nav_list_iterator end, FGNav *n)
|
||||||
|
{
|
||||||
|
// double az1, az2, s;
|
||||||
|
|
||||||
Point3D station;
|
Point3D station;
|
||||||
double d;
|
double d;
|
||||||
for ( ; current != last ; ++current ) {
|
for ( ; current != end ; ++current ) {
|
||||||
// cout << "testing " << current->get_ident() << endl;
|
// cout << "testing " << current->get_ident() << endl;
|
||||||
station = Point3D(current->get_x(), current->get_y(), current->get_z());
|
station = Point3D((*current)->get_x(), (*current)->get_y(),
|
||||||
|
(*current)->get_z());
|
||||||
|
|
||||||
d = aircraft.distance3Dsquared( station );
|
d = aircraft.distance3Dsquared( station );
|
||||||
|
|
||||||
// cout << " dist = " << sqrt(d)
|
// cout << " dist = " << sqrt(d)
|
||||||
// << " range = " << current->get_range() * SG_NM_TO_METER << endl;
|
// << " range = " << current->get_range() * SG_NM_TO_METER
|
||||||
|
// << endl;
|
||||||
|
|
||||||
// match up to twice the published range so we can model
|
// match up to 2 * range^2 the published range so we can model
|
||||||
// reduced signal strength
|
// reduced signal strength
|
||||||
if ( d < (2 * current->get_range() * SG_NM_TO_METER
|
double twiceRange = 2 * (*current)->get_range() * SG_NM_TO_METER;
|
||||||
* 2 * current->get_range() * SG_NM_TO_METER ) ) {
|
if ( d < (twiceRange * twiceRange)) {
|
||||||
// cout << "matched = " << current->get_ident() << endl;
|
// cout << "matched = " << current->get_ident() << endl;
|
||||||
*n = *current;
|
*n = (**current);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,27 +30,37 @@
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include STL_STRING
|
||||||
|
|
||||||
#include "nav.hxx"
|
#include "nav.hxx"
|
||||||
|
|
||||||
SG_USING_STD(map);
|
SG_USING_STD(map);
|
||||||
SG_USING_STD(vector);
|
SG_USING_STD(vector);
|
||||||
|
SG_USING_STD(string);
|
||||||
|
|
||||||
class FGNavList {
|
class FGNavList {
|
||||||
|
|
||||||
// convenience types
|
// convenience types
|
||||||
typedef vector < FGNav > nav_list_type;
|
typedef vector < FGNav* > nav_list_type;
|
||||||
typedef nav_list_type::iterator nav_list_iterator;
|
typedef nav_list_type::iterator nav_list_iterator;
|
||||||
typedef nav_list_type::const_iterator nav_list_const_iterator;
|
typedef nav_list_type::const_iterator nav_list_const_iterator;
|
||||||
|
|
||||||
// typedef map < int, nav_list_type, less<int> > nav_map_type;
|
|
||||||
typedef map < int, nav_list_type > nav_map_type;
|
typedef map < int, nav_list_type > nav_map_type;
|
||||||
typedef nav_map_type::iterator nav_map_iterator;
|
typedef nav_map_type::iterator nav_map_iterator;
|
||||||
typedef nav_map_type::const_iterator nav_map_const_iterator;
|
typedef nav_map_type::const_iterator nav_map_const_iterator;
|
||||||
|
|
||||||
|
typedef map < string, nav_list_type > nav_ident_map_type;
|
||||||
|
|
||||||
nav_map_type navaids;
|
nav_map_type navaids;
|
||||||
|
nav_ident_map_type ident_navaids;
|
||||||
|
|
||||||
|
// internal helper to pick a Nav item from a nav_list based on
|
||||||
|
// distance from the aircraft point
|
||||||
|
bool findNavFromList(const Point3D &aircraft,
|
||||||
|
nav_list_iterator current,
|
||||||
|
nav_list_iterator last,
|
||||||
|
FGNav *n);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
FGNavList();
|
FGNavList();
|
||||||
|
@ -62,6 +72,9 @@ public:
|
||||||
// query the database for the specified frequency, lon and lat are
|
// query the database for the specified frequency, lon and lat are
|
||||||
// in degrees, elev is in meters
|
// in degrees, elev is in meters
|
||||||
bool query( double lon, double lat, double elev, double freq, FGNav *n );
|
bool query( double lon, double lat, double elev, double freq, FGNav *n );
|
||||||
|
|
||||||
|
// locate closest item in the DB matching the requested ident
|
||||||
|
bool findByIdent(const char* ident, double lon, double lat, FGNav *nav);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,13 +3,19 @@
|
||||||
#include "fixlist.hxx"
|
#include "fixlist.hxx"
|
||||||
#include "ilslist.hxx"
|
#include "ilslist.hxx"
|
||||||
#include "navlist.hxx"
|
#include "navlist.hxx"
|
||||||
|
#include "mkrbeacons.hxx"
|
||||||
|
|
||||||
|
// change this!
|
||||||
|
const string FG_DATA_DIR("/usr/local/lib/FlightGear");
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
double heading, dist;
|
double heading, dist;
|
||||||
|
|
||||||
current_navlist = new FGNavList;
|
current_navlist = new FGNavList;
|
||||||
SGPath p_nav( "/home/curt/FlightGear/Navaids/default.nav" );
|
SGPath p_nav( FG_DATA_DIR + "/Navaids/default.nav" );
|
||||||
|
|
||||||
current_navlist->init( p_nav );
|
current_navlist->init( p_nav );
|
||||||
|
|
||||||
FGNav n;
|
FGNav n;
|
||||||
if ( current_navlist->query( -93.2 * SG_DEGREES_TO_RADIANS,
|
if ( current_navlist->query( -93.2 * SG_DEGREES_TO_RADIANS,
|
||||||
45.14 * SG_DEGREES_TO_RADIANS,
|
45.14 * SG_DEGREES_TO_RADIANS,
|
||||||
|
@ -21,8 +27,24 @@ int main() {
|
||||||
cout << "not picking up vor. :-(" << endl;
|
cout << "not picking up vor. :-(" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FGNav dcs;
|
||||||
|
if (current_navlist->findByIdent("DCS", -3.3 * SG_DEGREES_TO_RADIANS,
|
||||||
|
55.9 * SG_DEGREES_TO_RADIANS, &dcs)) {
|
||||||
|
|
||||||
|
cout << "Found DCS by ident" << endl;
|
||||||
|
if (dcs.get_freq() != 11520)
|
||||||
|
cout << "Frequency for DCS VOR is wrong (should be 115.20), it's "
|
||||||
|
<< dcs.get_freq() << endl;
|
||||||
|
} else {
|
||||||
|
cout << "couldn't locate DCS (Dean-Cross) VOR" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we have to init the marker beacon storage before we parse the ILS file
|
||||||
|
current_beacons = new FGMarkerBeacons;
|
||||||
|
current_beacons->init();
|
||||||
|
|
||||||
current_ilslist = new FGILSList;
|
current_ilslist = new FGILSList;
|
||||||
SGPath p_ils( "/home/curt/FlightGear/Navaids/default.ils" );
|
SGPath p_ils( FG_DATA_DIR + "/Navaids/default.ils" );
|
||||||
current_ilslist->init( p_ils );
|
current_ilslist->init( p_ils );
|
||||||
FGILS i;
|
FGILS i;
|
||||||
if ( current_ilslist->query( -93.1 * SG_DEGREES_TO_RADIANS,
|
if ( current_ilslist->query( -93.1 * SG_DEGREES_TO_RADIANS,
|
||||||
|
@ -37,16 +59,21 @@ int main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
current_fixlist = new FGFixList;
|
current_fixlist = new FGFixList;
|
||||||
SGPath p_fix( "/home/curt/FlightGear/Navaids/default.fix" );
|
SGPath p_fix( FG_DATA_DIR + "/Navaids/default.fix" );
|
||||||
current_fixlist->init( p_fix );
|
current_fixlist->init( p_fix );
|
||||||
FGFix fix;
|
FGFix fix;
|
||||||
if ( current_fixlist->query( "SHELL", -82 * SG_DEGREES_TO_RADIANS,
|
|
||||||
41 * SG_DEGREES_TO_RADIANS, 3000,
|
// attempting to get the position relative to the OTR VOR; heading
|
||||||
|
// should be 108 degrees, distance 74nm (according to my SimCharts
|
||||||
|
// v1.5)
|
||||||
|
if ( current_fixlist->query( "DOGGA", -0.103 * SG_DEGREES_TO_RADIANS,
|
||||||
|
53.698 * SG_DEGREES_TO_RADIANS, 3000,
|
||||||
&fix, &heading, &dist) )
|
&fix, &heading, &dist) )
|
||||||
{
|
{
|
||||||
cout << "Found a matching fix" << endl;
|
cout << "Found a matching fix" << endl;
|
||||||
cout << " id = " << fix.get_ident() << endl;
|
cout << " id = " << fix.get_ident() << endl;
|
||||||
cout << " heading = " << heading << " dist = " << dist << endl;
|
cout << " heading = " << heading << " dist = " << dist * SG_METER_TO_NM
|
||||||
|
<< endl;
|
||||||
} else {
|
} else {
|
||||||
cout << "did not find fix. :-(" << endl;
|
cout << "did not find fix. :-(" << endl;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue