]> git.mxchange.org Git - flightgear.git/commitdiff
Vivian Meazza:
authorehofman <ehofman>
Sat, 1 Oct 2005 09:56:53 +0000 (09:56 +0000)
committerehofman <ehofman>
Sat, 1 Oct 2005 09:56:53 +0000 (09:56 +0000)
This adds a TACAN instrument to the inventory. Range and bearing are calculated
to the TACAN or VORTAC beacon selected by means of the Channel Selector in the E
quipment/Radio pull-down menu.

A TACAN beacon has also been added to the aircraft carrier Nimitz (channel #029Y
).

15 files changed:
src/AIModel/AICarrier.cxx
src/AIModel/AIScenario.cxx
src/AIModel/AIShip.cxx
src/GUI/AirportList.cxx
src/Instrumentation/Makefile.am
src/Instrumentation/instrument_mgr.cxx
src/Main/fg_init.cxx
src/Main/globals.cxx
src/Main/globals.hxx
src/Main/renderer.cxx
src/Navaids/navdb.cxx
src/Navaids/navdb.hxx
src/Navaids/navlist.cxx
src/Navaids/navlist.hxx
src/Navaids/navrecord.hxx

index 474dc300e8274270b1af9b6d8dabbbe775c54afc..9a15a840d7134e88f0271e85b9a6589e8224fa8e 100644 (file)
@@ -301,18 +301,13 @@ void FGAICarrier::bind() {
                 SGRawValuePointer<double>(&rel_wind_speed_kts));
    props->tie("controls/flols/wave-off-lights",  
                 SGRawValuePointer<bool>(&wave_off_lights));
-   props->tie("instrumentation/TACAN/bearing-true-deg",  
-                SGRawValuePointer<double>(&bearing));
-   props->tie("instrumentation/TACAN/range-nm",  
-                SGRawValuePointer<double>(&range));
                     
    props->setBoolValue("controls/flols/cut-lights", false);
    props->setBoolValue("controls/flols/wave-off-lights", false);
    props->setBoolValue("controls/flols/cond-datum-lights", true);
    props->setBoolValue("controls/crew", false);
 
-   props->setStringValue("instrumentation/TACAN/channel-ID", TACAN_channel_id.c_str());
-  
+   props->setStringValue("navaids/tacan/channel-ID", TACAN_channel_id.c_str());
    props->setStringValue("sign", sign.c_str());
 }
 
@@ -331,9 +326,7 @@ void FGAICarrier::unbind() {
     props->untie("environment/rel-wind-from-degs");
     props->untie("environment/rel-wind-speed-kts");
     props->untie("controls/flols/wave-off-lights");
-    props->untie("instrumentation/TACAN/bearing-true-deg");
-    props->untie("instrumentation/TACAN/range-nm");
-    props->untie("instrumentation/TACAN/channel-ID");
+    
 }
 
 bool FGAICarrier::getParkPosition(const string& id, Point3D& geodPos,
@@ -756,7 +749,7 @@ void FGAICarrier::UpdateWind( double dt) {
        wave_off_lights = true;
     }    
        
-    cout << "rel wind: " << rel_wind << endl;
+    // cout << "rel wind: " << rel_wind << endl;
 
 }// end update wind
 
@@ -800,7 +793,7 @@ void FGAICarrier::ReturnToBox(){
                      
     distance *= SG_METER_TO_NM;
 
-    cout << "return course: " << course << " distance: " << distance << endl;
+    //cout << "return course: " << course << " distance: " << distance << endl;
     //turn the carrier
        FGAIShip::TurnTo(course); 
        FGAIShip::AccelTo(base_speed);
index a1a77b529cb02ee2b4291f9d513508638c7dfc29..4491308fef9c75ba713bff26860e1c0e7f51232c 100644 (file)
@@ -99,8 +99,8 @@ FGAIScenario::FGAIScenario(const string &filename)
      en->cd              = entry_node->getDoubleValue("cd", 0.029); 
      en->mass            = entry_node->getDoubleValue("mass", 0.007); 
      en->radius          = entry_node->getDoubleValue("turn-radius-ft", 2000);
-     en->TACAN_channel_ID= entry_node->getStringValue("TACAN-channel-ID", "017X");
-     en->name            = entry_node->getStringValue("name", "");
+     en->TACAN_channel_ID= entry_node->getStringValue("TACAN-channel-ID", "029Y");
+     en->name            = entry_node->getStringValue("name", "Nimitz");
      en->pennant_number  = entry_node->getStringValue("pennant-number", "");
      en->wire_objects     = getAllStringNodeVals("wire", entry_node);
      en->catapult_objects = getAllStringNodeVals("catapult", entry_node);
index 79a60830b308de8a424d66faed69d03a63f7be6f..22db5b4ad9654f8fc06f168574650e192256c9aa 100644 (file)
@@ -174,8 +174,8 @@ void FGAIShip::Run(double dt) {
     //low pass filter
      roll = (raw_roll * roll_constant) + (roll * (1 - roll_constant));
          
-     cout  << " rudder: " << rudder << " raw roll: "<< raw_roll<<" roll: " << roll ;
-     cout  << " hdg: " << hdg << endl ;
+     /*cout  << " rudder: " << rudder << " raw roll: "<< raw_roll<<" roll: " << roll ;
+     cout  << " hdg: " << hdg << endl ;*/
 
    // adjust target rudder angle if heading lock engaged
    if (hdg_lock) {
index fd6a72da560889fc974bffab8e71e841dbc913df..16f9785d037664420a3c0199f7459286111c6b5c 100644 (file)
@@ -15,7 +15,7 @@ AirportList::AirportList (int x, int y, int width, int height)
     _nAirports = _airports->size();
 
     _content = new char *[_nAirports+1];
-    for (unsigned int i = 0; i < _nAirports; i++) {
+    for (int i = 0; i < _nAirports; i++) {
         const FGAirport *airport = _airports->getAirport(i);
         snprintf(buf, 1023, "%s  %s",
                  airport->getId().c_str(),
@@ -33,7 +33,7 @@ AirportList::AirportList (int x, int y, int width, int height)
 
 AirportList::~AirportList ()
 {
-    for (unsigned int i = 0; i < _nAirports; i++) {
+    for (int i = 0; i < _nAirports; i++) {
         delete _content[i];
         _content[i] = 0;
     }
index 44dd3c1f6375d60d367467e68dc0a4bd8ff0c3f3..77758cb0dcdbad3d6d889030bcc65b030db6a85c 100644 (file)
@@ -22,6 +22,7 @@ libInstrumentation_a_SOURCES = \
        transponder.cxx transponder.hxx \
         turn_indicator.cxx turn_indicator.hxx \
         vertical_speed_indicator.cxx vertical_speed_indicator.hxx \
-       inst_vertical_speed_indicator.cxx inst_vertical_speed_indicator.hxx
+       inst_vertical_speed_indicator.cxx inst_vertical_speed_indicator.hxx \
+       tacan.cxx tacan.hxx
 
 INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src
index 603b24af12dc3f2cd86e75819620fc371df4a7b4..30d0221cdd9a1715a68d5bc8ab5c263cefca45d5 100644 (file)
@@ -36,6 +36,7 @@
 #include "turn_indicator.hxx"
 #include "vertical_speed_indicator.hxx"
 #include "inst_vertical_speed_indicator.hxx" // (TJ)
+#include "tacan.hxx" 
 
 
 FGInstrumentMgr::FGInstrumentMgr ()
@@ -92,6 +93,7 @@ bool FGInstrumentMgr::build ()
     for ( i = 0; i < count; ++i ) {
         node = config_props->getChild(i);
         string name = node->getName();
+        cout<< "instrument name: " << name << endl;
         std::ostringstream temp;
         temp << i;
         if ( name == "adf" ) {
@@ -151,6 +153,10 @@ bool FGInstrumentMgr::build ()
         } else if ( name == "inst-vertical-speed-indicator" ) { // (TJ)
             set_subsystem( "instrument" + temp.str(), 
                            new InstVerticalSpeedIndicator( node ) );
+        } else if ( name == "tacan" ) { 
+            set_subsystem( "instrument" + temp.str(), 
+                           new TACAN( node ) );
+                           
         } else {
             SG_LOG( SG_ALL, SG_ALERT, "Unknown top level section: " 
                     << name );
index 9fb7cee0233257b8a3be48ae59c066d138339990..71c0ec8a348e2592929dc06ec660bdb008dcdda3 100644 (file)
@@ -1096,14 +1096,20 @@ fgInitNav ()
     FGNavList *gslist = new FGNavList;
     FGNavList *dmelist = new FGNavList;
     FGNavList *mkrlist = new FGNavList;
+    FGNavList *tacanlist = new FGNavList;
+    FGNavList *carrierlist = new FGNavList;
+    FGTACANList *channellist = new FGTACANList;
 
     globals->set_navlist( navlist );
     globals->set_loclist( loclist );
     globals->set_gslist( gslist );
     globals->set_dmelist( dmelist );
     globals->set_mkrlist( mkrlist );
+    globals->set_tacanlist( tacanlist );
+    globals->set_carrierlist( carrierlist );
+    globals->set_channellist( channellist );
 
-    if ( !fgNavDBInit(airports, navlist, loclist, gslist, dmelist, mkrlist) ) {
+    if ( !fgNavDBInit(airports, navlist, loclist, gslist, dmelist, mkrlist, tacanlist, carrierlist, channellist) ) {
         SG_LOG( SG_GENERAL, SG_ALERT,
                 "Problems loading one or more navigational database" );
     }
index 1559a9600382ef957c64e1f8b733f9d341ba1c3b..6170dbd8514c6c3545aed50ead5cd1bf3dd5dbc0 100644 (file)
@@ -82,6 +82,8 @@ FGGlobals::FGGlobals() :
     gslist( NULL ),
     dmelist( NULL ),
     mkrlist( NULL ),
+    tacanlist( NULL ),
+    carrierlist( NULL ), 
     fixlist( NULL )
 {
 }
index 1d81c18b6e47903ef6dd4af68a1ee1b4213648f2..c02be6feec20e9fa20e845528095c1ad75dd0cb0 100644 (file)
@@ -73,6 +73,7 @@ class FGControls;
 class FGFlightPlanDispatcher;
 class FGIO;
 class FGNavList;
+class FGTACANList;
 class FGFixList;
 class FGLight;
 class FGModelMgr;
@@ -205,8 +206,12 @@ private:
     FGNavList *gslist;
     FGNavList *dmelist;
     FGNavList *mkrlist;
+    FGNavList *tacanlist;
+    FGNavList *carrierlist;
+    FGTACANList *channellist;
     FGFixList *fixlist;
 
+
 #ifdef FG_MPLAYER_AS
     //Mulitplayer managers
     FGMultiplayTxMgr *multiplayer_tx_mgr;
@@ -371,11 +376,16 @@ public:
     inline void set_gslist( FGNavList *n ) { gslist = n; }
     inline FGNavList *get_dmelist() const { return dmelist; }
     inline void set_dmelist( FGNavList *n ) { dmelist = n; }
+    inline FGNavList *get_tacanlist() const { return tacanlist; }
+    inline void set_tacanlist( FGNavList *n ) { tacanlist = n; }
+    inline FGNavList *get_carrierlist() const { return carrierlist; }
+    inline void set_carrierlist( FGNavList *n ) { carrierlist = n; }
     inline FGNavList *get_mkrlist() const { return mkrlist; }
     inline void set_mkrlist( FGNavList *n ) { mkrlist = n; }
-
     inline FGFixList *get_fixlist() const { return fixlist; }
     inline void set_fixlist( FGFixList *f ) { fixlist = f; }
+    inline FGTACANList *get_channellist() const { return channellist; }
+    inline void set_channellist( FGTACANList *c ) { channellist = c; }
 
    /**
      * Save the current state as the initial state.
index b2146f5e475572d19db85c757590ff81339165be..0e5ecb3e41ffe1f474591a01ee74ec76b300585f 100644 (file)
@@ -244,7 +244,13 @@ FGRenderer::update( bool refresh_camera_settings ) {
         SGAnimation::set_sim_time_sec( 0.0 );
         return;
     }
+//    return; 
 
+       // TODO:TEST only, don't commit that !!
+//     sgFXperFrameInit();
+
+    extern void sgShaderFrameInit(double delta_time_sec);
+    sgShaderFrameInit(delta_time_sec);
 
     bool draw_otw = fgGetBool("/sim/rendering/draw-otw");
     bool skyblend = fgGetBool("/sim/rendering/skyblend");
index 4c3347912d116a4db626ab1af604fa77e8192f6e..7be1809a34df7bf04092d34f6fa75afc2fc4a8fe 100644 (file)
@@ -40,7 +40,9 @@ SG_USING_STD( string );
 // load and initialize the navigational databases
 bool fgNavDBInit( FGAirportList *airports,
                   FGNavList *navlist, FGNavList *loclist, FGNavList *gslist,
-                  FGNavList *dmelist, FGNavList *mkrlist )
+                  FGNavList *dmelist, FGNavList *mkrlist, 
+                  FGNavList *tacanlist, FGNavList *carrierlist,
+                  FGTACANList *channellist)
 {
     SG_LOG(SG_GENERAL, SG_INFO, "Loading Navaid Databases");
     // SG_LOG(SG_GENERAL, SG_INFO, "  VOR/NDB");
@@ -83,13 +85,14 @@ bool fgNavDBInit( FGAirportList *airports,
             break;
         }
 
-       /* cout << "id = " << n.get_ident() << endl;
-       cout << " type = " << n.get_type() << endl;
-       cout << " lon = " << n.get_lon() << endl;
-       cout << " lat = " << n.get_lat() << endl;
-       cout << " elev = " << n.get_elev() << endl;
-       cout << " freq = " << n.get_freq() << endl;
-       cout << " range = " << n.get_range() << endl << endl; */
+       /*cout << "id = " << r->get_ident() << endl;
+       cout << " type = " << r->get_type() << endl;
+       cout << " lon = " << r->get_lon() << endl;
+       cout << " lat = " << r->get_lat() << endl;
+       cout << " elev = " <<r->get_elev_ft() << endl;
+       cout << " freq = " << r->get_freq() << endl;
+       cout << " range = " << r->get_range() << endl;
+       cout << " name = " << r->get_name() << endl << endl; */
 
         // fudge elevation to the field elevation if it's not specified
         if ( fabs(r->get_elev_ft()) < 0.01 && r->get_apt_id().length() ) {
@@ -118,14 +121,105 @@ bool fgNavDBInit( FGAirportList *airports,
             mkrlist->add( r );
         } else if ( r->get_type() == 12 ) {
             // DME=12
+            string str1( r->get_name() );
+            unsigned int loc1= str1.find( "TACAN", 0 );
+            unsigned int loc2 = str1.find( "VORTAC", 0 );
+                       
+            if( loc1 != string::npos || loc2 != string::npos ){
+                 //cout << " name = " << r->get_name() ;
+                 //cout << " freq = " << r->get_freq() ;
+                 tacanlist->add( r );
+                 }
+                
             dmelist->add( r );
+            
         }
                
         in >> skipcomment;
     }
 
-    // cout << "min freq = " << min << endl;
-    // cout << "max freq = " << max << endl;
+// load the carrier navaids file
+    
+    string file, name;
+    path = "";
+    path = globals->get_fg_root() ;
+    path.append( "Navaids/carrier_nav.dat" );
+    
+    file = path.str();
+    SG_LOG( SG_GENERAL, SG_ALERT, "opening file: " << path.str() );
+    
+    sg_gzifstream incarrier( path.str() );
+    
+    if ( !incarrier.is_open() ) {
+        SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << path.str() );
+        exit(-1);
+    }
+    
+    // skip first two lines
+    //incarrier >> skipeol;
+    //incarrier >> skipeol;
+    
+#ifdef __MWERKS__
+    char c = 0;
+    while ( incarrier.get(c) && c != '\0'  ) {
+        incarrier.putback(c);
+#else
+    while ( ! incarrier.eof() ) {
+#endif
+        
+        FGNavRecord *r = new FGNavRecord;
+        incarrier >> (*r);
+        carrierlist->add ( r );
+        /*cout << " carrier lon: "<<  r->get_lon() ;
+        cout << " carrier lat: "<<  r->get_lat() ;
+        cout << " freq: " << r->get_freq() ;
+        cout << " carrier name: "<<  r->get_name() << endl;*/
+                
+        //if ( r->get_type() > 95 ) {
+        //   break;}
+    } // end while
+
+// end loading the carrier navaids file
+
+// load the channel/freqency file
+    string channel, freq;
+    path="";
+    path = globals->get_fg_root();
+    path.append( "Navaids/TACAN_freq.dat" );
+    
+    file = path.str();
+    cout << file << endl;
+    //
+    sg_gzifstream inchannel( path.str() );
+    
+    if ( !inchannel.is_open() ) {
+        SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << path.str() );
+        exit(-1);
+    }
+    
+    // skip first two lines
+    inchannel >> skipeol;
+    inchannel >> skipeol;
+    
+#ifdef __MWERKS__
+    char c = 0;
+    while ( inchannel.get(c) && c != '\0'  ) {
+        in.putback(c);
+#else
+    while ( ! inchannel.eof() ) {
+#endif
+
+        FGTACANRecord *r = new FGTACANRecord;
+        inchannel >> (*r);
+        channellist->add ( r );
+               //cout << "channel = " << r->get_channel() ;
+               //cout << " freq = " << r->get_freq() << endl;
+       
+    } // end while
+
+ // end ReadChanFile
+
 
     return true;
 }
@@ -219,3 +313,4 @@ void fgNavDBAlignLOCwithRunway( FGRunwayList *runways, FGNavList *loclist,
         ++freq;
     }
 }
+
index fc249f3df01d2c878777b066dad53454739bae3e..b05dd72ac47eed8a3e2c38d139cf23d0b2a5a098 100644 (file)
@@ -43,8 +43,9 @@
 // load and initialize the navigational databases
 bool fgNavDBInit( FGAirportList *airports,
                   FGNavList *navlist, FGNavList *loclist, FGNavList *gslist,
-                  FGNavList *dmelist, FGNavList *mkrbeacons );
-
+                  FGNavList *dmelist, FGNavList *mkrbeacons,
+                  FGNavList *tacanlist, FGNavList *carrierlist,
+                  FGTACANList *channellist );
 
 // This routines traverses the localizer list and attempts to match
 // each entry with it's corresponding runway.  When it is successful,
@@ -54,5 +55,4 @@ bool fgNavDBInit( FGAirportList *airports,
 void fgNavDBAlignLOCwithRunway( FGRunwayList *runways, FGNavList *loclist,
                                 double threshold );
 
-
 #endif // _FG_NAVDB_HXX
index 80ba3c897155d0c2d7e03bb174c49d568645da53..84c3b430c763b9f9bf7e0fd1d0d571ff4bcd79e9 100644 (file)
 FGNavList::FGNavList( void ) {
 }
 
+FGTACANList::FGTACANList( void ){
+}
+
 
 // Destructor
 FGNavList::~FGNavList( void ) {
 }
 
+FGTACANList::~FGTACANList( void ){
+}
 
 // load the navaids and build the map
 bool FGNavList::init() {
@@ -53,6 +58,10 @@ bool FGNavList::init() {
     return true;
 }
 
+bool FGTACANList::init() {
+    
+    return true;      
+}
 
 // real add a marker beacon
 static void real_add( nav_map_type &navmap, const int master_index,
@@ -128,6 +137,11 @@ bool FGNavList::add( FGNavRecord *n ) {
     return true;
 }
 
+// add an entry to the lists
+bool FGTACANList::add( FGTACANRecord *c ) {
+    ident_channels[c->get_channel()].push_back(c);
+    return true;
+}
 
 // Query the database for the specified frequency.  It is assumed that
 // there will be multiple stations with matching frequencies so a
@@ -137,6 +151,7 @@ FGNavRecord *FGNavList::findByFreq( double freq, double lon, double lat, double
 {
     nav_list_type stations = navaids[(int)(freq*100.0 + 0.5)];
     Point3D aircraft = sgGeodToCart( Point3D(lon, lat, elev) );
+    SG_LOG( SG_INSTR, SG_DEBUG, "findbyFreq " << freq << " size " << stations.size()  );
 
     return findNavFromList( aircraft, stations );
 }
@@ -157,7 +172,7 @@ FGNavRecord *FGNavList::findByIdent( const char* ident,
 FGNavRecord *FGNavList::findByIdentAndFreq( const char* ident, const double freq )
 {
     nav_list_type stations = ident_navaids[ident];
-
+    SG_LOG( SG_INSTR, SG_DEBUG, "findByIdent " << ident<< " size " << stations.size()  );
     if ( freq > 0.0 ) {
         // sometimes there can be duplicated idents.  If a freq is
         // specified, use it to refine the search.
@@ -321,3 +336,28 @@ FGNavRecord *FGNavList::findClosest( double lon_rad, double lat_rad,
 
     return result;
 }
+
+// Given a TACAN Channel return the first matching frequency
+FGTACANRecord *FGTACANList::findByChannel( string channel )
+{
+    tacan_list_type stations = ident_channels[channel];
+    SG_LOG( SG_INSTR, SG_DEBUG, "findByChannel " << channel<< " size " << stations.size()  );
+    
+    if (stations.size()) {
+        return stations[0];
+    }    
+    return NULL;
+}
+
+// Given a frequency, return the first matching station.
+FGNavRecord *FGNavList::findStationByFreq( double freq )
+{
+    nav_list_type stations = navaids[(int)(freq*100.0 + 0.5)];
+   
+    SG_LOG( SG_INSTR, SG_DEBUG, "findStationByFreq " << freq << " size " << stations.size()  );
+    
+    if (stations.size()) {
+        return stations[0];
+    }    
+    return NULL;
+}
index 08f8f80b39e529425184488718d0a44b8a3e1991..aa9970026d3d6ffdade1c87071b872e51c8f1dd3 100644 (file)
@@ -41,19 +41,22 @@ SG_USING_STD(string);
 
 // convenience types
 typedef vector < FGNavRecord* > nav_list_type;
+typedef vector < FGTACANRecord* > tacan_list_type;
 typedef nav_list_type::iterator nav_list_iterator;
 typedef nav_list_type::const_iterator nav_list_const_iterator;
 
 typedef map < int, nav_list_type > nav_map_type;
+typedef map < int, tacan_list_type > tacan_map_type;
 typedef nav_map_type::iterator nav_map_iterator;
 typedef nav_map_type::const_iterator nav_map_const_iterator;
 
 typedef map < string, nav_list_type > nav_ident_map_type;
-
+typedef map < string, tacan_list_type > tacan_ident_map_type;
 
 class FGNavList {
 
     nav_list_type navlist;
+    nav_list_type carrierlist;
     nav_map_type navaids;
     nav_map_type navaids_by_tile;
     nav_ident_map_type ident_navaids;
@@ -73,6 +76,7 @@ public:
 
     // add an entry
     bool add( FGNavRecord *n );
+    //bool add( FGTACANRecord *r );
 
     // Query the database for the specified frequency.  It is assumed
     // that there will be multiple stations with matching frequencies
@@ -97,8 +101,40 @@ public:
     // returns the closest entry to the give lon/lat/elev
     FGNavRecord *findClosest( double lon_rad, double lat_rad, double elev_m );
 
+    // given a frequency returns the first matching entry
+    FGNavRecord *findStationByFreq( double frequency );
+
     inline nav_map_type get_navaids() const { return navaids; }
 };
 
+class FGTACANList {
+
+    tacan_list_type channellist;
+    //nav_list_type carrierlist;
+    tacan_map_type channels;
+    //nav_map_type navaids_by_tile;
+    tacan_ident_map_type ident_channels;
+       
+    // Given a point and a list of stations, return the closest one to
+    // the specified point.
+    /*FGNavRecord *findNavFromList( const Point3D &aircraft, 
+                                  const nav_list_type &stations );*/
+       
+public:
+
+    FGTACANList();
+    ~FGTACANList();
+
+    // initialize the TACAN list
+    bool init();
 
+    // add an entry
+    
+    bool add( FGTACANRecord *r );
+    
+    // Given a TACAN Channel, return the appropriate frequency.  
+    FGTACANRecord *findByChannel( string channel );
+
+    
+};
 #endif // _FG_NAVLIST_HXX
index 96e0b450a98596b5300d657d5c93acec6e2913aa..34d3a579ba80b12022a4902848e572fe3263c4e3 100644 (file)
@@ -172,5 +172,36 @@ operator >> ( istream& in, FGNavRecord& n )
     return in;
 }
 
+class FGTACANRecord {
 
+    string channel;            
+    int freq;
+     
+public:
+    
+    inline FGTACANRecord(void);
+    inline ~FGTACANRecord(void) {}
+
+    inline string get_channel() { return channel; }
+    inline int get_freq() const { return freq; }
+    friend istream& operator>> ( istream&, FGTACANRecord& );
+    };
+
+
+inline
+FGTACANRecord::FGTACANRecord(void) :
+    channel(""),
+    freq(0)
+    
+{
+}
+
+inline istream&
+operator >> ( istream& in, FGTACANRecord& n )
+{
+    in >> n.channel >> n.freq ;
+    //getline( in, n.name );
+
+    return in;
+}
 #endif // _FG_NAVRECORD_HXX