return n;
}
+static std::auto_ptr<SGInterpTable> static_terminalRangeInterp,
+ static_lowRangeInterp, static_highRangeInterp;
+
// Constructor
FGNavRadio::FGNavRadio(SGPropertyNode *node) :
- term_tbl(NULL),
- low_tbl(NULL),
- high_tbl(NULL),
_operable(false),
play_count(0),
_last_freq(0.0),
_gsNeedleDeflectionNorm(0.0),
_audioIdent(NULL)
{
- SGPath path( globals->get_fg_root() );
- SGPath term = path;
- term.append( "Navaids/range.term" );
- SGPath low = path;
- low.append( "Navaids/range.low" );
- SGPath high = path;
- high.append( "Navaids/range.high" );
-
- term_tbl = new SGInterpTable( term.str() );
- low_tbl = new SGInterpTable( low.str() );
- high_tbl = new SGInterpTable( high.str() );
-
+ if (!static_terminalRangeInterp.get()) {
+ // one-time interpolator init
+ SGPath path( globals->get_fg_root() );
+ SGPath term = path;
+ term.append( "Navaids/range.term" );
+ SGPath low = path;
+ low.append( "Navaids/range.low" );
+ SGPath high = path;
+ high.append( "Navaids/range.high" );
+
+ static_terminalRangeInterp.reset(new SGInterpTable(term.str()));
+ static_lowRangeInterp.reset(new SGInterpTable(low.str()));
+ static_highRangeInterp.reset(new SGInterpTable(high.str()));
+ }
+
string branch("/instrumentation/" + _name);
_radio_node = fgGetNode(branch.c_str(), _num, true);
}
nav_slaved_to_gps_node->removeChangeListener(this);
}
- delete term_tbl;
- delete low_tbl;
- delete high_tbl;
-
delete _audioIdent;
}
node->getNode( "dme-in-range", true )->alias( fgGetNode("/instrumentation/dme[0]/in-range", true ) );
}
+void
+FGNavRadio::reinit ()
+{
+ _time_before_search_sec = -1.0;
+}
+
void
FGNavRadio::bind ()
{
// << " station elev = " << stationElev << endl;
if ( nominalRange < 25.0 + SG_EPSILON ) {
- // Standard Terminal Service Volume
- return term_tbl->interpolate( alt ) * usability_factor;
+ // Standard Terminal Service Volume
+ return static_terminalRangeInterp->interpolate( alt ) * usability_factor;
} else if ( nominalRange < 50.0 + SG_EPSILON ) {
// Standard Low Altitude Service Volume
// table is based on range of 40, scale to actual range
- return low_tbl->interpolate( alt ) * nominalRange / 40.0
+ return static_lowRangeInterp->interpolate( alt ) * nominalRange / 40.0
* usability_factor;
} else {
// Standard High Altitude Service Volume
// table is based on range of 130, scale to actual range
- return high_tbl->interpolate( alt ) * nominalRange / 130.0
+ return static_highRangeInterp->interpolate( alt ) * nominalRange / 130.0
* usability_factor;
}
}
FGNavRecord* FGNavRadio::findPrimaryNavaid(const SGGeod& aPos, double aFreqMHz)
{
- FGNavRecord* nav = globals->get_navlist()->findByFreq(aFreqMHz, aPos);
- if (nav) {
- return nav;
- }
-
- return globals->get_loclist()->findByFreq(aFreqMHz, aPos);
+ return FGNavList::findByFreq(aFreqMHz, aPos, FGNavList::navFilter());
}
// Update current nav/adf radio stations based on current position
// search glideslope station
if ((_navaid.valid()) && (_navaid->type() != FGPositioned::VOR))
{
- FGNavRecord* gs = globals->get_gslist()->findByFreq(freq, globals->get_aircraft_position());
+ FGNavList::TypeFilter gsFilter(FGPositioned::GS);
+ FGNavRecord* gs = FGNavList::findByFreq(freq, globals->get_aircraft_position(),
+ &gsFilter);
if ((!_nav_search) && (gs == _gs))
{
_nav_search = true; // search NAV on next iteration