2004-12-22 23:57:07 +00:00
|
|
|
// apt_loader.hxx -- a front end loader of the apt.dat file. This loader
|
|
|
|
// populates the runway and basic classes.
|
|
|
|
//
|
|
|
|
// Written by Curtis Olson, started December 2004.
|
|
|
|
//
|
|
|
|
// Copyright (C) 2004 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
|
|
|
|
// 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
|
2006-02-21 01:16:04 +00:00
|
|
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2004-12-22 23:57:07 +00:00
|
|
|
//
|
|
|
|
// $Id$
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FG_APT_LOADER_HXX
|
|
|
|
#define _FG_APT_LOADER_HXX
|
|
|
|
|
2016-05-22 23:04:15 +02:00
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
|
2004-12-22 23:57:07 +00:00
|
|
|
#include <simgear/compiler.h>
|
2016-05-22 23:04:15 +02:00
|
|
|
#include <simgear/structure/SGSharedPtr.hxx>
|
|
|
|
#include <simgear/math/SGGeod.hxx>
|
|
|
|
#include <Navaids/positioned.hxx>
|
2004-12-22 23:57:07 +00:00
|
|
|
|
2016-05-22 23:04:15 +02:00
|
|
|
// Forward declarations
|
2012-08-28 00:26:36 +01:00
|
|
|
class SGPath;
|
2016-05-22 23:04:15 +02:00
|
|
|
class NavDataCache;
|
|
|
|
class sg_gzifstream;
|
|
|
|
class FGPavement;
|
2004-12-22 23:57:07 +00:00
|
|
|
|
2012-08-28 00:26:36 +01:00
|
|
|
namespace flightgear
|
|
|
|
{
|
2016-05-22 23:04:15 +02:00
|
|
|
|
|
|
|
class APTLoader
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
APTLoader();
|
|
|
|
~APTLoader();
|
|
|
|
|
|
|
|
void parseAPT(const SGPath &aptdb_file);
|
|
|
|
|
|
|
|
private:
|
|
|
|
typedef SGSharedPtr<FGPavement> FGPavementPtr;
|
|
|
|
|
|
|
|
APTLoader(const APTLoader&); // disable copy constructor
|
|
|
|
APTLoader& operator=(const APTLoader&); // disable copy-assignment operator
|
|
|
|
|
|
|
|
// Tell whether an apt.dat line is blank or a comment line
|
|
|
|
bool isBlankOrCommentLine(const std::string& line);
|
|
|
|
void throwExceptionIfStreamError(const sg_gzifstream& input_stream,
|
|
|
|
const SGPath& path);
|
Initial support for NavData/<type>/*.dat[.gz] files in scenery paths
Load every file matching the pattern NavData/apt/*.dat[.gz] inside each
scenery path. These files are loaded in the same order as the components
of globals->get_unmangled_fg_scenery() they reside in. Inside a given
component, the order is determined by pathSortPredicate() in
simgear/misc/sg_dir.cxx (lexicographic order at the time of this
writing). For compatibility with existing scenery,
$FG_ROOT/Airports/apt.dat.gz is also loaded last.
The idea is that such files will have the same precedence order as the
globals->get_unmangled_fg_scenery() scenery components they come from.
This commit doesn't handle this fully yet, though: it blindly loads all
these files. A future commit will ensure that no airport is loaded twice
due to overlapping apt.dat files. This commit however handles all the
logic of navdata cache rebuilding when the list, the order of apt.dat
files, or any of their timestamps changes.
Although only apt.dat files receive a new treatment in this commit, the
changes to NavDataCache.[ch]xx are already generic so that extension of
this method to fix.dat, nav.dat, etc. will require almost no change to
NavDataCache.[ch]xx (however, changes will probably be needed in the
various loaders: in fixlist.[ch]xx, navdb.[ch]xx, etc.).
src/Navaids/CacheSchema.h:
- increment the SCHEMA_VERSION by 1. This ensures among others that if
someone uses a FlightGear version posterior to this change with
new-style scenery (having NavData/apt/*.dat[.gz] files inside
scenery paths), then goes back to a FlightGear version anterior to
this change, his NavCache is rebuilt ignoring the in-scenery-paths
NavData/apt/*.dat[.gz] files, as expected with the old FlightGear
version.
src/Navaids/NavDataCache.cxx:
- NavDataCachePrivate: replace aptDatPath (SGPath) with aptDatPaths
(PathList).
- NavDataCachePrivate::getDatFilesPaths(): new method that returns the
list of $scenery_path/NavData/<type>/*.dat[.gz] files found inside
scenery paths (where <type> is one of 'apt', 'fix', etc.), plus the
historical file (e.g., $FG_ROOT/Airports/apt.dat.gz for the 'apt'
type).
- NavDataCachePrivate::areDatFilesModified(): new method that tells
whether any of these files (for a given type) has changed since the
last NavCache rebuild, or if their ordered list has changed.
- NavDataCachePrivate::isCachedFileModified(): minor changes.
- NavDataCache::updateListsOfDatFiles(): new method that updates the
lists of dat files used for NavCache freshness checking and
rebuilding, i.e. currently sets/updates d->aptDatPaths using the new
method d->getDatFilesPaths(), and d->metarDatPath, d->navDatPath,
d->fixDatPath, d->poiDatPath, etc. as usual. This method will be
useful for instance in the built-in launcher after updating scenery
paths and before calling NavDataCache::isRebuildRequired().
- NavDataCache::NavDataCache(): use
NavDataCache::updateListsOfDatFiles() to initialize d->aptDatPaths,
d->metarDatPath, d->navDatPath, d->fixDatPath, d->poiDatPath, etc.
- NavDataCache::isRebuildRequired(): use
NavDataCachePrivate::areDatFilesModified() instead of just checking
$FG_ROOT/Airports/apt.dat.gz.
- NavDataCache::doRebuild(): load all apt.dat files listed in
d->aptDatPaths, instead of only $FG_ROOT/Airports/apt.dat.gz. Write
their ordered list and timestamps in the NavCache.
src/Navaids/NavDataCache.hxx:
- declare the new method NavDataCache::updateListsOfDatFiles().
- NavDataCache::DatFileType: new enum with values DATFILETYPE_APT,
DATFILETYPE_METAR, DATFILETYPE_AWY, DATFILETYPE_NAV,
DATFILETYPE_FIX, DATFILETYPE_POI, DATFILETYPE_CARRIER and
DATFILETYPE_TACAN_FREQ. Maybe some of the corresponding files won't
have to be moved to scenery paths, but simply listing them in the
enum doesn't change how they are dealt with. Those for which
per-scenery-path locations doesn't make sense can just be removed
from the enum.
- NavDataCache::datTypeStr: new static string_list giving an
std::string such as 'apt' for each value of the
NavDataCache::DatFileType enum.
- NavDataCache::defaultDatFile: new static string_list giving a path
(relative to $FG_ROOT) to the historical/default file for each value
of the NavDataCache::DatFileType enum.
src/Airports/apt_loader.cxx and src/Airports/apt_loader.hxx:
- always include a path to the apt.dat file being processed in log
messages, since they can now apply to many files;
- be clearer about code 99: it should normally be at the end of
apt.dat files, but technically, it is not an EOF;
- use the expression "row code" consistently with the apt.dat format
spec (for now: only in places where there is another change to do).
src/GUI/QtLauncher.cxx and src/GUI/QtLauncher_private.hxx:
- turn QtLauncher::setSceneryPaths() into a static method and call it
in runLauncherDialog() before instantiating NavDataCache, so that
NavDataCache::updateListsOfDatFiles() (called from NavDataCache's
constructor) can see all configured scenery paths.
2016-10-11 16:31:13 +02:00
|
|
|
void parseAirportLine(const std::string& aptDat,
|
|
|
|
const std::vector<std::string>& token);
|
|
|
|
void finishAirport(const std::string& aptDat);
|
2016-05-22 23:04:15 +02:00
|
|
|
void parseRunwayLine810(const std::vector<std::string>& token);
|
|
|
|
void parseRunwayLine850(const std::vector<std::string>& token);
|
|
|
|
void parseWaterRunwayLine850(const std::vector<std::string>& token);
|
|
|
|
void parseHelipadLine850(const std::vector<std::string>& token);
|
|
|
|
void parsePavementLine850(const std::vector<std::string>& token);
|
|
|
|
void parsePavementNodeLine850(int num, const std::vector<std::string>& token);
|
|
|
|
|
Initial support for NavData/<type>/*.dat[.gz] files in scenery paths
Load every file matching the pattern NavData/apt/*.dat[.gz] inside each
scenery path. These files are loaded in the same order as the components
of globals->get_unmangled_fg_scenery() they reside in. Inside a given
component, the order is determined by pathSortPredicate() in
simgear/misc/sg_dir.cxx (lexicographic order at the time of this
writing). For compatibility with existing scenery,
$FG_ROOT/Airports/apt.dat.gz is also loaded last.
The idea is that such files will have the same precedence order as the
globals->get_unmangled_fg_scenery() scenery components they come from.
This commit doesn't handle this fully yet, though: it blindly loads all
these files. A future commit will ensure that no airport is loaded twice
due to overlapping apt.dat files. This commit however handles all the
logic of navdata cache rebuilding when the list, the order of apt.dat
files, or any of their timestamps changes.
Although only apt.dat files receive a new treatment in this commit, the
changes to NavDataCache.[ch]xx are already generic so that extension of
this method to fix.dat, nav.dat, etc. will require almost no change to
NavDataCache.[ch]xx (however, changes will probably be needed in the
various loaders: in fixlist.[ch]xx, navdb.[ch]xx, etc.).
src/Navaids/CacheSchema.h:
- increment the SCHEMA_VERSION by 1. This ensures among others that if
someone uses a FlightGear version posterior to this change with
new-style scenery (having NavData/apt/*.dat[.gz] files inside
scenery paths), then goes back to a FlightGear version anterior to
this change, his NavCache is rebuilt ignoring the in-scenery-paths
NavData/apt/*.dat[.gz] files, as expected with the old FlightGear
version.
src/Navaids/NavDataCache.cxx:
- NavDataCachePrivate: replace aptDatPath (SGPath) with aptDatPaths
(PathList).
- NavDataCachePrivate::getDatFilesPaths(): new method that returns the
list of $scenery_path/NavData/<type>/*.dat[.gz] files found inside
scenery paths (where <type> is one of 'apt', 'fix', etc.), plus the
historical file (e.g., $FG_ROOT/Airports/apt.dat.gz for the 'apt'
type).
- NavDataCachePrivate::areDatFilesModified(): new method that tells
whether any of these files (for a given type) has changed since the
last NavCache rebuild, or if their ordered list has changed.
- NavDataCachePrivate::isCachedFileModified(): minor changes.
- NavDataCache::updateListsOfDatFiles(): new method that updates the
lists of dat files used for NavCache freshness checking and
rebuilding, i.e. currently sets/updates d->aptDatPaths using the new
method d->getDatFilesPaths(), and d->metarDatPath, d->navDatPath,
d->fixDatPath, d->poiDatPath, etc. as usual. This method will be
useful for instance in the built-in launcher after updating scenery
paths and before calling NavDataCache::isRebuildRequired().
- NavDataCache::NavDataCache(): use
NavDataCache::updateListsOfDatFiles() to initialize d->aptDatPaths,
d->metarDatPath, d->navDatPath, d->fixDatPath, d->poiDatPath, etc.
- NavDataCache::isRebuildRequired(): use
NavDataCachePrivate::areDatFilesModified() instead of just checking
$FG_ROOT/Airports/apt.dat.gz.
- NavDataCache::doRebuild(): load all apt.dat files listed in
d->aptDatPaths, instead of only $FG_ROOT/Airports/apt.dat.gz. Write
their ordered list and timestamps in the NavCache.
src/Navaids/NavDataCache.hxx:
- declare the new method NavDataCache::updateListsOfDatFiles().
- NavDataCache::DatFileType: new enum with values DATFILETYPE_APT,
DATFILETYPE_METAR, DATFILETYPE_AWY, DATFILETYPE_NAV,
DATFILETYPE_FIX, DATFILETYPE_POI, DATFILETYPE_CARRIER and
DATFILETYPE_TACAN_FREQ. Maybe some of the corresponding files won't
have to be moved to scenery paths, but simply listing them in the
enum doesn't change how they are dealt with. Those for which
per-scenery-path locations doesn't make sense can just be removed
from the enum.
- NavDataCache::datTypeStr: new static string_list giving an
std::string such as 'apt' for each value of the
NavDataCache::DatFileType enum.
- NavDataCache::defaultDatFile: new static string_list giving a path
(relative to $FG_ROOT) to the historical/default file for each value
of the NavDataCache::DatFileType enum.
src/Airports/apt_loader.cxx and src/Airports/apt_loader.hxx:
- always include a path to the apt.dat file being processed in log
messages, since they can now apply to many files;
- be clearer about code 99: it should normally be at the end of
apt.dat files, but technically, it is not an EOF;
- use the expression "row code" consistently with the apt.dat format
spec (for now: only in places where there is another change to do).
src/GUI/QtLauncher.cxx and src/GUI/QtLauncher_private.hxx:
- turn QtLauncher::setSceneryPaths() into a static method and call it
in runLauncherDialog() before instantiating NavDataCache, so that
NavDataCache::updateListsOfDatFiles() (called from NavDataCache's
constructor) can see all configured scenery paths.
2016-10-11 16:31:13 +02:00
|
|
|
void parseCommLine(const std::string& aptDat, int lineId,
|
|
|
|
const std::vector<std::string>& token);
|
2016-05-22 23:04:15 +02:00
|
|
|
|
|
|
|
double rwy_lat_accum;
|
|
|
|
double rwy_lon_accum;
|
|
|
|
double last_rwy_heading;
|
|
|
|
int rwy_count;
|
|
|
|
std::string last_apt_id;
|
|
|
|
double last_apt_elev;
|
|
|
|
SGGeod tower;
|
|
|
|
|
|
|
|
std::string pavement_ident;
|
|
|
|
bool pavement;
|
|
|
|
std::vector<FGPavementPtr> pavements;
|
|
|
|
|
|
|
|
NavDataCache* cache;
|
|
|
|
// Not an airport identifier in the sense of the apt.dat spec!
|
|
|
|
PositionedID currentAirportID;
|
|
|
|
};
|
|
|
|
|
2004-12-22 23:57:07 +00:00
|
|
|
// Load the airport data base from the specified aptdb file. The
|
|
|
|
// metar file is used to mark the airports as having metar available
|
|
|
|
// or not.
|
2010-01-05 20:04:54 +00:00
|
|
|
|
2012-08-28 00:26:36 +01:00
|
|
|
bool airportDBLoad(const SGPath& path);
|
|
|
|
|
|
|
|
bool metarDataLoad(const SGPath& path);
|
|
|
|
|
|
|
|
} // of namespace flighgear
|
2004-12-22 23:57:07 +00:00
|
|
|
|
|
|
|
#endif // _FG_APT_LOADER_HXX
|