// Written by Curtis Olson, started April 2000.
// Rewritten by Torsten Dreyer, August 2011
//
-// Copyright (C) 2000 - 2002 Curtis L. Olson - http://www.flightgear.org/~curt
+// Copyright (C) 2000 - 2011 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
#include <assert.h>
#include <boost/foreach.hpp>
-#include <simgear/math/SGMath.hxx>
#include <simgear/math/interpolater.hxx>
#include <simgear/sg_inlines.h>
#include <simgear/props/propertyObject.hxx>
+#include <simgear/misc/strutils.hxx>
+#include <simgear/sound/sample_group.hxx>
#include <Main/fg_props.hxx>
#include <Navaids/navlist.hxx>
virtual double getRange_nm( const SGGeod & aircraftPosition );
virtual void display( NavIndicator & navIndicator ) = 0;
virtual bool valid() const { return NULL != _navRecord && true == _serviceable; }
+ virtual const std::string getIdent() const { return _ident; }
protected:
virtual double computeSignalQuality_norm( const SGGeod & aircraftPosition );
- virtual FGNavList * getNavaidList() = 0;
+ virtual FGNavList::TypeFilter* getNavaidFilter() = 0;
// General-purpose sawtooth function. Graph looks like this:
// /\ .
_audioIdent->setIdent("", 0.0 );
return;
}
- _audioIdent->setIdent( _navRecord->get_trans_ident(), SGMiscd::clip(_identVolume, 0.0, 1.0) );
+ _audioIdent->setIdent( _ident, SGMiscd::clip(_identVolume, 0.0, 1.0) );
}
NavRadioComponent::NavRadioComponent( const std::string & name, SGPropertyNode_ptr rootNode ) :
void NavRadioComponent::search( double frequency, const SGGeod & aircraftPosition )
{
- if( NULL == (_navRecord = getNavaidList()->findByFreq(frequency, aircraftPosition )) ) {
+ _navRecord = FGNavList::findByFreq(frequency, aircraftPosition, getNavaidFilter() );
+ if( NULL == _navRecord ) {
SG_LOG(SG_INSTR,SG_ALERT, "No " << _name << " available at " << frequency );
_ident = "";
return;
virtual double getRange_nm(const SGGeod & aircraftPosition);
protected:
virtual double computeSignalQuality_norm( const SGGeod & aircraftPosition );
- virtual FGNavList * getNavaidList();
+ virtual FGNavList::TypeFilter* getNavaidFilter();
private:
double _totalTime;
return _serviceVolume.adjustRange( _heightAboveStation_ft, _navRecord->get_range() );
}
-FGNavList * VOR::getNavaidList()
+FGNavList::TypeFilter* VOR::getNavaidFilter()
{
- return globals->get_navlist();
+ static FGNavList::TypeFilter filter(FGPositioned::VOR);
+ return &filter;
}
double VOR::computeSignalQuality_norm( const SGGeod & aircraftPosition )
protected:
virtual double computeSignalQuality_norm( const SGGeod & aircraftPosition );
- virtual FGNavList * getNavaidList();
+ virtual FGNavList::TypeFilter* getNavaidFilter();
private:
class ServiceVolume {
{
}
-FGNavList * LOC::getNavaidList()
+FGNavList::TypeFilter* LOC::getNavaidFilter()
{
- return globals->get_loclist();
+ return FGNavList::locFilter();
}
void LOC::search( double frequency, const SGGeod & aircraftPosition )
virtual double getRange_nm(const SGGeod & aircraftPosition);
protected:
- virtual FGNavList * getNavaidList();
-
+ virtual FGNavList::TypeFilter* getNavaidFilter();
private:
class ServiceVolume {
public:
{
}
-FGNavList * GS::getNavaidList()
+FGNavList::TypeFilter* GS::getNavaidFilter()
{
- return globals->get_gslist();
+ static FGNavList::TypeFilter filter(FGPositioned::GS);
+ return &filter;
}
double GS::getRange_nm(const SGGeod & aircraftPosition)
void valueChanged (SGPropertyNode * prop)
{
// format as fixed decimal "nnn.nn"
- ostringstream buf;
+ std::ostringstream buf;
buf << std::fixed
<< std::setw(5)
<< std::setfill('0')
NavRadioImpl * _navRadioImpl;
SGPropertyNode_ptr is_valid_node;
SGPropertyNode_ptr nav_serviceable_node;
+ SGPropertyNode_ptr nav_id_node;
+ SGPropertyNode_ptr id_c1_node;
+ SGPropertyNode_ptr id_c2_node;
+ SGPropertyNode_ptr id_c3_node;
+ SGPropertyNode_ptr id_c4_node;
} _legacy;
const static int VOR_COMPONENT = 0;
try {
position = globals->get_aircraft_position();
}
- catch( exception & ) {
+ catch( std::exception & ) {
return;
}
if( _stationTTL <= 0.0 )
_stationTTL = 30.0;
- _legacy.init();
+ _legacy.update( dt );
}
void NavRadioImpl::Legacy::init()
is_valid_node = _navRadioImpl->_rootNode->getChild("data-is-valid", 0, true);
nav_serviceable_node = _navRadioImpl->_rootNode->getChild("serviceable", 0, true);
+ nav_id_node = _navRadioImpl->_rootNode->getChild("nav-id", 0, true );
+ id_c1_node = _navRadioImpl->_rootNode->getChild("nav-id_asc1", 0, true );
+ id_c2_node = _navRadioImpl->_rootNode->getChild("nav-id_asc2", 0, true );
+ id_c3_node = _navRadioImpl->_rootNode->getChild("nav-id_asc3", 0, true );
+ id_c4_node = _navRadioImpl->_rootNode->getChild("nav-id_asc4", 0, true );
+
}
void NavRadioImpl::Legacy::update( double dt )
is_valid_node->setBoolValue(
_navRadioImpl->_components[VOR_COMPONENT]->valid() || _navRadioImpl->_components[LOC_COMPONENT]->valid()
);
+
+ string ident = _navRadioImpl->_components[VOR_COMPONENT]->getIdent();
+ if( ident.empty() )
+ ident = _navRadioImpl->_components[LOC_COMPONENT]->getIdent();
+
+ nav_id_node->setStringValue( ident );
+
+ ident = simgear::strutils::rpad( ident, 4, ' ' );
+ id_c1_node->setIntValue( (int)ident[0] );
+ id_c2_node->setIntValue( (int)ident[1] );
+ id_c3_node->setIntValue( (int)ident[2] );
+ id_c4_node->setIntValue( (int)ident[3] );
}