#include <sstream>
#include <cstring>
+#include <cstdio>
#include <simgear/sg_inlines.h>
#include <simgear/timing/sg_time.hxx>
#include <simgear/structure/exception.hxx>
#include <simgear/math/interpolater.hxx>
#include <simgear/misc/strutils.hxx>
+#include <simgear/sound/sample_group.hxx>
#include <Navaids/navrecord.hxx>
#include <Sound/audioident.hxx>
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),
+ _nav_search(true),
_last_freq(0.0),
target_radial(0.0),
effective_range(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;
}
}
} // of false courses disabled
const double VOR_FULL_ARC = 20.0; // VOR is -10 .. 10 degree swing
- _cdiDeflection *= VOR_FULL_ARC / _localizerWidth; // increased localiser sensitivity
+ _cdiDeflection *= VOR_FULL_ARC / _localizerWidth; // increased localizer sensitivity
if (backcourse_node->getBoolValue()) {
_cdiDeflection = -_cdiDeflection;
r = ( r<0.0 ? -r-180.0 : -r+180.0 );
}
_cdiDeflection = r;
- } // of non-localiser case
+ } // of non-localizer case
SG_CLAMP_RANGE(_cdiDeflection, -10.0, 10.0 );
_cdiDeflection *= signal_quality_norm;
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