--- /dev/null
+// ATCdisplay.cxx - routines to display ATC output - graphically for now
+//
+// Written by David Luff, started October 2001.
+//
+// Copyright (C) 2001 David C Luff - david.luff@nottingham.ac.uk
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <simgear/misc/props.hxx>
+
+#include <Include/general.hxx>
+#include <Main/fg_props.hxx>
+#include <GUI/gui.h>
+
+#include "ATCdisplay.hxx"
+
+
+FGATCDisplay *current_atcdisplay;
+
+
+// Constructor
+FGATCDisplay::FGATCDisplay( void ) {
+ rep_msg = false;
+ dsp_offset1 = 0;
+ dsp_offset2 = 0;
+}
+
+
+// Destructor
+FGATCDisplay::~FGATCDisplay( void ) {
+}
+
+void FGATCDisplay::init( void ) {
+}
+
+
+// update - this actually draws the visuals and should be called from the main Flightgear rendering loop.
+void FGATCDisplay::update() {
+
+ if(rep_msg) {
+ float fps = general.get_frame_rate();
+
+ //cout << "In FGATC::update()" << endl;
+ SGPropertyNode *xsize_node = fgGetNode("/sim/startup/xsize");
+ SGPropertyNode *ysize_node = fgGetNode("/sim/startup/ysize");
+ int iwidth = xsize_node->getIntValue();
+ int iheight = ysize_node->getIntValue();
+
+ //TODO - if the string is bigger than the buffer the program exits - we really ought to have a robust check here
+ char buf[256];
+ //float fps = visibility/1600;
+ // sprintf(buf,"%-4.1f %7.0f %7.0f", fps, tris, culled);
+// sprintf(buf,"%s %-5.1f", "visibility ", visibility);
+ sprintf(buf,"%s", rep_msg_str.c_str());
+
+ glMatrixMode( GL_PROJECTION );
+ glPushMatrix();
+ glLoadIdentity();
+ gluOrtho2D( 0, iwidth, 0, iheight );
+ glMatrixMode( GL_MODELVIEW );
+ glPushMatrix();
+ glLoadIdentity();
+
+ glDisable( GL_DEPTH_TEST );
+ glDisable( GL_LIGHTING );
+
+ glColor3f( 0.9, 0.4, 0.2 );
+
+// guiFnt.drawString( buf,
+// int(iwidth - guiFnt.getStringWidth(buf) - 10 - (int)dsp_offset),
+// (iheight - 20) );
+ guiFnt.drawString( buf,
+ int(iwidth - 10 - dsp_offset1),
+ (iheight - 20) );
+ guiFnt.drawString( buf,
+ int(iwidth - 10 - dsp_offset2),
+ (iheight - 20) );
+ glEnable( GL_DEPTH_TEST );
+ glEnable( GL_LIGHTING );
+ glMatrixMode( GL_PROJECTION );
+ glPopMatrix();
+ glMatrixMode( GL_MODELVIEW );
+ glPopMatrix();
+
+ // Try to scroll at a frame rate independent speed
+ // 40 pixels/second looks about right for now
+ if(dsp_offset1 >= dsp_offset2) {
+ dsp_offset1+=(40.0/fps);
+ dsp_offset2 = dsp_offset1 - (rep_msg_str.size() * 10) - 100;
+ if(dsp_offset1 > (iwidth + (rep_msg_str.size() * 10)))
+ dsp_offset1 = 0;
+ } else {
+ dsp_offset2+=(40.0/fps);
+ dsp_offset1 = dsp_offset2 - (rep_msg_str.size() * 10) - 100;
+ if(dsp_offset2 > (iwidth + (rep_msg_str.size() * 10)))
+ dsp_offset2 = 0;
+ }
+
+ }
+}
+
+
+void FGATCDisplay::RegisterRepeatingMessage(string msg) {
+ rep_msg = true;
+ rep_msg_str = msg;
+ return;
+}
+
+void FGATCDisplay::ChangeRepeatingMessage(string newmsg) {
+ //Not implemented yet
+ return;
+}
+
+void FGATCDisplay::CancelRepeatingMessage() {
+ rep_msg = false;
+ rep_msg_str = "";
+ dsp_offset1 = 0;
+ dsp_offset2 = 0;
+ return;
+}
--- /dev/null
+// ATCdisplay.hxx - class to manage the graphical display of ATC messages.
+// - The idea is to separate the display of ATC messages from their
+// - generation so that the generation may come from any source.
+//
+// Written by David Luff, started October 2001.
+//
+// Copyright (C) 2001 David C Luff - david.luff@nottingham.ac.uk
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+#ifndef _FG_ATC_DISPLAY_HXX
+#define _FG_ATC_DISPLAY_HXX
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <vector>
+#include <string>
+
+SG_USING_STD(vector);
+SG_USING_STD(string);
+
+struct atcMessage {
+ string msg;
+ bool repeating;
+ int id;
+};
+
+// ASSUMPTION - with two radios the list won't be long so we don't need to map the id's
+typedef vector<atcMessage> atcMessageList;
+typedef vector<atcMessage>::iterator atcMessageListIterator;
+
+class FGATCDisplay {
+
+private:
+ bool rep_msg; // Flag to indicate there is a repeating transmission to display
+ float dsp_offset1; // Used to set the correct position of scrolling display
+ float dsp_offset2;
+ string rep_msg_str; // The repeating transmission to play
+ atcMessageList msgList;
+ atcMessageListIterator msgList_itr;
+
+public:
+ FGATCDisplay();
+ ~FGATCDisplay();
+
+ void init();
+
+ // Display any registered messages
+ void update();
+
+ // Register a single message for display when possible
+ void RegisterSingleMessage(string msg); // OK - I know passing a string in and out is probably not good but it will have to do for now.
+
+/* For now we will assume only one repeating message at once */
+ // This is not really robust
+
+ // Register a continuously repeating message
+ void RegisterRepeatingMessage(string msg);
+
+ // Change a repeating message - assume that the message changes after the string has finished for now
+ void ChangeRepeatingMessage(string newmsg);
+
+ // Cancel the current repeating message
+ void CancelRepeatingMessage();
+};
+
+extern FGATCDisplay *current_atcdisplay;
+
+#endif // _FG_ATC_DISPLAY_HXX
--- /dev/null
+noinst_LIBRARIES = libATC.a
+
+libATC_a_SOURCES = \
+ atis.cxx atis.hxx atislist.hxx atislist.cxx \
+ ATCdisplay.hxx ATCdisplay.cxx
+
+INCLUDES += -I$(top_srcdir) -I$(top_srcdir)/src
--- /dev/null
+// atis.cxx - routines to generate the ATIS info string
+//
+// Written by David Luff, started October 2001.
+//
+// Copyright (C) 2001 David C Luff - david.luff@nottingham.ac.uk
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <simgear/compiler.h>
+
+#include <string>
+SG_USING_STD(string);
+
+//#include STL_IOSTREAM
+//#if !defined(SG_HAVE_NATIVE_SGI_COMPILERS)
+//SG_USING_STD(cout);
+//#endif
+
+//#include <simgear/debug/logstream.hxx>
+//#include <simgear/misc/sgstream.hxx>
+//#include <simgear/math/sg_geodesy.hxx>
+#include <simgear/misc/sg_path.hxx>
+
+//#ifndef FG_OLD_WEATHER
+//#include <WeatherCM/FGLocalWeatherDatabase.h>
+//#else
+//# include <Weather/weather.hxx>
+//#endif
+
+#include <Main/fg_props.hxx>
+#include <Airports/runways.hxx>
+
+#include "atis.hxx"
+
+// Constructor
+FGATIS::FGATIS() {
+}
+
+// Destructor
+FGATIS::~FGATIS() {
+}
+
+string FGATIS::get_transmission() {
+//void FGATIS::get_transmission() {
+
+ string transmission = "";
+ double visibility;
+ double temperature;
+ char buf[10];
+
+// Only update every so-many loops - FIXME - possibly register this with the event scheduler
+// Ack this doesn't work since the static counter is shared between all instances of FGATIS
+// OK, for now the radiostack is handling only calling this every-so-often but that is not really
+// a proper solution since the atis knows when the transmission is going to change not the radio.
+ //static int i=0;
+ //if(i == 0) {
+ transmission = "";
+
+ // Start with the transmitted station name.
+ transmission += name;
+
+ // Add the recording identifier
+ // TODO - this is hardwired for now - ultimately we need to start with a random one and then increment it with each recording
+ transmission += " Charlie";
+
+ // Output the recording time. - we'll just output the last whole hour for now.
+ string time_str = fgGetString("sim/time/gmt-string");
+ // FIXME - this only gets GMT time but that appears to be all the clock outputs for now
+ //cout << "in atis.cxx, time = " << time_str << endl;
+ transmission = transmission + " Weather " + time_str.substr(0,3) + "00 hours Zulu";
+
+ // Get the temperature
+ // Hardwire the temperature for now - is the local weather database running yet?
+ transmission += " Temperature 25 degrees Celcius";
+
+ // Get the pressure / altimeter
+
+ // Get the visibility
+ visibility = fgGetDouble("/environment/visibility-m");
+ sprintf(buf, "%d", int(visibility/1600));
+ transmission += " Visibility ";
+ transmission += buf;
+ transmission += " miles";
+
+ // Get the cloudbase
+ if(fgGetBool("/environment/clouds/status")) {
+ double cloudbase = fgGetDouble("/environment/clouds/altitude-ft");
+ // For some reason the altitude returned doesn't seem to correspond to the actual cloud altitude.
+ char buf3[10];
+ cout << "cloudbase = " << cloudbase << endl;
+ sprintf(buf3, "%i", int(cloudbase));
+ transmission = transmission + " Cloudbase " + buf3 + " feet";
+ }
+
+ // Based on the airport-id and wind get the active runway
+ //FGRunway *r;
+ SGPath path( globals->get_fg_root() );
+ path.append( "Airports" );
+ path.append( "runways.mk4" );
+ FGRunways runways( path.c_str() );
+
+ //Set the heading to into the wind
+ double hdg = fgGetDouble("/environment/wind-from-heading-deg");
+ double speed = fgGetDouble("/environment/wind-speed-knots");
+
+ //cout << "in atis.cxx, hdg = " << hdg << " speed = " << speed << endl;
+
+ //If no wind use 270degrees
+ if(speed == 0) {
+ hdg = 270;
+ transmission += " Winds light and variable";
+ } else {
+ //add a description of the wind to the transmission
+ char buf2[48];
+ sprintf(buf2, "%s %i %s %i %s", " Winds ", int(speed), " knots from ", int(hdg), " degrees");
+ transmission += buf2;
+ }
+
+ string rwy_no = runways.search(ident, hdg);
+ if(rwy_no != "NN") {
+ transmission += " Landing and departing runway ";
+ transmission += rwy_no;
+ //cout << "in atis.cxx, r.rwy_no = " << rwy_no << " r.id = " << r->id << " r.heading = " << r->heading << endl;
+ }
+
+ // Anything else?
+
+ // TODO - unhardwire the identifier
+ transmission += " Advise controller on initial contact you have Charlie";
+
+ //}
+
+// i++;
+// if(i == 600) {
+// i=0;
+// }
+
+ return(transmission);
+}
\ No newline at end of file
--- /dev/null
+// atis.hxx -- ATIS class
+//
+// Written by Curtis Olson, started April 2000.
+//
+// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+#ifndef _FG_ATIS_HXX
+#define _FG_ATIS_HXX
+
+#include <stdio.h>
+
+#include <simgear/compiler.h>
+#include <simgear/math/sg_geodesy.hxx>
+#include <simgear/misc/sgstream.hxx>
+#include <simgear/magvar/magvar.hxx>
+#include <simgear/timing/sg_time.hxx>
+
+#ifdef SG_HAVE_STD_INCLUDES
+# include <istream>
+#include <iomanip>
+#elif defined( SG_HAVE_NATIVE_SGI_COMPILERS )
+# include <iostream.h>
+#elif defined( __BORLANDC__ )
+# include <iostream>
+#else
+# include <istream.h>
+#include <iomanip.h>
+#endif
+
+#if ! defined( SG_HAVE_NATIVE_SGI_COMPILERS )
+SG_USING_STD(istream);
+#endif
+
+#include <string>
+
+SG_USING_STD(string);
+
+//DCL - a complete guess for now.
+#define FG_ATIS_DEFAULT_RANGE 30
+
+class FGATIS {
+
+ char type;
+ double lon, lat;
+ double elev;
+ double x, y, z;
+ int freq;
+ int range;
+ string ident; // Code of the airport its at.
+ string name; // Name transmitted in the broadcast.
+ string info; // The actual ATIS transmission
+ // This is not stored in default.atis but is generated
+ // from the prevailing conditions when required.
+
+ // for failure modeling
+ string trans_ident; // transmitted ident
+ bool atis_failed; // atis failed?
+
+public:
+
+ FGATIS(void);
+ ~FGATIS(void);
+
+ inline char get_type() const { return type; }
+ inline double get_lon() const { return lon; }
+ inline double get_lat() const { return lat; }
+ inline double get_elev() const { return elev; }
+ inline double get_x() const { return x; }
+ inline double get_y() const { return y; }
+ inline double get_z() const { return z; }
+ inline int get_freq() const { return freq; }
+ inline int get_range() const { return range; }
+ inline const char *get_ident() { return ident.c_str(); }
+ inline string get_trans_ident() { return trans_ident; }
+ string get_transmission(void);
+// void get_transmission();
+
+ /* inline void set_type( char t ) { type = t; }
+ inline void set_lon( double l ) { lon = l; }
+ inline void set_lat( double l ) { lat = l; }
+ inline void set_elev( double e ) { elev = e; }
+ inline void set_freq( int f ) { freq = f; }
+ inline void set_range( int r ) { range = r; }
+ inline void set_dme( bool b ) { dme = b; }
+ inline void set_ident( char *i ) { strncpy( ident, i, 5 ); } */
+
+ friend istream& operator>> ( istream&, FGATIS& );
+};
+
+
+inline istream&
+operator >> ( istream& in, FGATIS& a )
+{
+ double f;
+ char ch;
+
+ static bool first_time = true;
+ static double julian_date = 0;
+ static const double MJD0 = 2415020.0;
+ if ( first_time ) {
+ julian_date = sgTimeCurrentMJD( 0 ) + MJD0;
+ first_time = false;
+ }
+
+ in >> a.type;
+
+ if ( a.type == '[' )
+ return in >> skipeol;
+
+ in >> a.lat >> a.lon >> a.elev >> f >> a.range
+ >> a.ident;
+
+ a.name = "";
+ in >> ch;
+ a.name += ch;
+ while(1) {
+ //in >> noskipws
+ in.unsetf(ios::skipws);
+ in >> ch;
+ a.name += ch;
+ if((ch == '"') || (ch == 0x0A)) {
+ break;
+ } // we shouldn't need the 0x0A but it makes a nice safely in case someone leaves off the "
+ }
+ in.setf(ios::skipws);
+ //cout << "atis.name = " << a.name << '\n';
+
+ a.freq = (int)(f*100.0 + 0.5);
+
+ // cout << a.ident << endl;
+
+ // generate cartesian coordinates
+ Point3D geod( a.lon * SGD_DEGREES_TO_RADIANS, a.lat * SGD_DEGREES_TO_RADIANS, a.elev );
+ Point3D cart = sgGeodToCart( geod );
+ a.x = cart.x();
+ a.y = cart.y();
+ a.z = cart.z();
+
+ a.trans_ident = a.ident;
+ a.atis_failed = false;
+
+ return in >> skipeol;
+}
+
+#endif // _FG_ATIS_HXX
--- /dev/null
+// atislist.cxx -- navaids management class
+//
+// Written by Curtis Olson, started April 2000.
+//
+// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <simgear/debug/logstream.hxx>
+#include <simgear/misc/sgstream.hxx>
+#include <simgear/math/sg_geodesy.hxx>
+
+#include "atislist.hxx"
+
+
+FGATISList *current_atislist;
+
+
+// Constructor
+FGATISList::FGATISList( void ) {
+}
+
+
+// Destructor
+FGATISList::~FGATISList( void ) {
+}
+
+
+// load the navaids and build the map
+bool FGATISList::init( SGPath path ) {
+ FGATIS a;
+
+ atislist.erase( atislist.begin(), atislist.end() );
+
+ sg_gzifstream in( path.str() );
+ if ( !in.is_open() ) {
+ SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << path.str() );
+ exit(-1);
+ }
+
+ // read in each line of the file
+
+ in >> skipeol;
+ in >> skipcomment;
+
+#ifdef __MWERKS__
+
+ char c = 0;
+ while ( in.get(c) && c != '\0' && a.get_type() != '[' ) {
+ in.putback(c);
+ in >> a;
+ if ( a.get_type() != '[' ) {
+ atislist[a.get_freq()].push_back(a);
+ }
+ in >> skipcomment;
+ }
+
+#else
+
+ double min = 100000;
+ double max = 0;
+
+ while ( ! in.eof() && a.get_type() != '[' ) {
+ in >> a;
+ //cout << "id = " << a.get_ident() << endl;
+ //cout << " type = " << a.get_type() << endl;
+ //cout << " lon = " << a.get_lon() << endl;
+ //cout << " lat = " << a.get_lat() << endl;
+ //cout << " elev = " << a.get_elev() << endl;
+ //cout << " freq = " << a.get_freq() << endl;
+ //cout << " range = " << a.get_range() << endl;
+ if ( a.get_type() != '[' ) {
+ atislist[a.get_freq()].push_back(a);
+ }
+ in >> skipcomment;
+
+ if ( a.get_type() != 'N' ) {
+ if ( a.get_freq() < min ) {
+ min = a.get_freq();
+ }
+ if ( a.get_freq() > max ) {
+ max = a.get_freq();
+ }
+ }
+ }
+
+ // cout << "min freq = " << min << endl;
+ // cout << "max freq = " << max << endl;
+
+#endif
+
+ return true;
+}
+
+
+// query the database for the specified frequency, lon and lat are in
+// degrees, elev is in meters
+bool FGATISList::query( double lon, double lat, double elev, double freq,
+ FGATIS *a )
+{
+ atis_list_type stations = atislist[(int)(freq*100.0 + 0.5)];
+
+ atis_list_iterator current = stations.begin();
+ atis_list_iterator last = stations.end();
+
+ // double az1, az2, s;
+ Point3D aircraft = sgGeodToCart( Point3D(lon, lat, elev) );
+ Point3D station;
+ double d;
+ for ( ; current != last ; ++current ) {
+ //cout << "testing " << current->get_ident() << endl;
+ station = Point3D(current->get_x(), current->get_y(), current->get_z());
+ //cout << "aircraft = " << aircraft << endl;
+ //cout << "station = " << station << endl;
+
+ d = aircraft.distance3Dsquared( station );
+
+ //cout << " dist = " << sqrt(d)
+ // << " range = " << current->get_range() * SG_NM_TO_METER << endl;
+
+ // match up to twice the published range so we can model
+ // reduced signal strength
+ if ( d < (2 * current->get_range() * SG_NM_TO_METER
+ * 2 * current->get_range() * SG_NM_TO_METER ) ) {
+ //cout << "matched = " << current->get_ident() << endl;
+ *a = *current;
+ return true;
+ }
+ }
+
+ return false;
+}
--- /dev/null
+// atislist.hxx -- atis management class
+//
+// Written by Curtis Olson, started April 2000.
+//
+// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+#ifndef _FG_ATISLIST_HXX
+#define _FG_ATISLIST_HXX
+
+
+#include <simgear/compiler.h>
+#include <simgear/misc/sg_path.hxx>
+
+#include <map>
+#include <vector>
+
+#include "atis.hxx"
+
+SG_USING_STD(map);
+SG_USING_STD(vector);
+
+
+class FGATISList {
+
+ // convenience types
+ typedef vector < FGATIS > atis_list_type;
+ typedef atis_list_type::iterator atis_list_iterator;
+ typedef atis_list_type::const_iterator atis_list_const_iterator;
+
+ // typedef map < int, atis_list_type, less<int> > atis_map_type;
+ typedef map < int, atis_list_type > atis_map_type;
+ typedef atis_map_type::iterator atis_map_iterator;
+ typedef atis_map_type::const_iterator atis_map_const_iterator;
+
+ atis_map_type atislist;
+
+public:
+
+ FGATISList();
+ ~FGATISList();
+
+ // load all atis and build the map
+ bool init( SGPath path );
+
+ // query the database for the specified frequency, lon and lat are
+ // in degrees, elev is in meters
+ bool query( double lon, double lat, double elev, double freq, FGATIS *a );
+};
+
+
+extern FGATISList *current_atislist;
+
+
+#endif // _FG_ATISLIST_HXX