#include <string>
using std::string;
-
// Constructor
FGMarkerBeacon::FGMarkerBeacon(SGPropertyNode *node) :
audio_vol(NULL),
_time_before_search_sec(0.0),
_sgr(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() );
-
for ( int i = 0; i < node->nChildren(); ++i ) {
SGPropertyNode *child = node->getChild(i);
string cname = child->getName();
// Destructor
FGMarkerBeacon::~FGMarkerBeacon()
{
- delete term_tbl;
- delete low_tbl;
- delete high_tbl;
}
#include <simgear/compiler.h>
#include <simgear/structure/subsystem_mgr.hxx>
-#include <simgear/math/interpolater.hxx>
#include <simgear/timing/timestamp.hxx>
class SGSampleGroup;
class FGMarkerBeacon : public SGSubsystem
{
- SGInterpTable *term_tbl;
- SGInterpTable *low_tbl;
- SGInterpTable *high_tbl;
// Inputs
SGPropertyNode_ptr lon_node;
bool middle_blink;
bool inner_blink;
- string name;
+ std::string name;
int num;
// internal periodic station search timer
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;
}
// << " 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;
}
}
#include <simgear/structure/subsystem_mgr.hxx>
#include <simgear/timing/timestamp.hxx>
-// forward decls
-class SGInterpTable;
-
class SGSampleGroup;
class FGNavRecord;
typedef SGSharedPtr<FGNavRecord> FGNavRecordPtr;
class FGNavRadio : public SGSubsystem, public SGPropertyChangeListener
{
- SGInterpTable *term_tbl;
- SGInterpTable *low_tbl;
- SGInterpTable *high_tbl;
-
SGPropertyNode_ptr _radio_node;
SGPropertyNode_ptr bus_power_node;