2 * NavDataCache.hxx - defines a unified binary cache for navigation
3 * data, parsed from various text / XML sources.
6 // Written by James Turner, started 2012.
8 // Copyright (C) 2012 James Turner
10 // This program is free software; you can redistribute it and/or
11 // modify it under the terms of the GNU General Public License as
12 // published by the Free Software Foundation; either version 2 of the
13 // License, or (at your option) any later version.
15 // This program is distributed in the hope that it will be useful, but
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 // General Public License for more details.
20 // You should have received a copy of the GNU General Public License
21 // along with this program; if not, write to the Free Software
22 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24 #ifndef FG_NAVDATACACHE_HXX
25 #define FG_NAVDATACACHE_HXX
29 #include <simgear/misc/strutils.hxx> // for string_list
30 #include <Navaids/positioned.hxx>
38 /// a pair of airport ID, runway ID
39 typedef std::pair<PositionedID, PositionedID> AirportRunwayPair;
41 typedef std::pair<FGPositioned::Type, PositionedID> TypedPositioned;
42 typedef std::vector<TypedPositioned> TypedPositionedVec;
44 // pair of airway ID, destination node ID
45 typedef std::pair<int, PositionedID> AirwayEdge;
46 typedef std::vector<AirwayEdge> AirwayEdgeVec;
59 static NavDataCache* instance();
62 static NavDataCache* createInstance();
67 * predicate - check if the cache needs to be rebuilt.
68 * This can happen is the cache file is missing or damaged, or one of the
69 ** global input files is changed.
71 bool isRebuildRequired();
74 * check if cached scenery paths have changed, and if so, drop scenery-
75 * dependant data such as ground-nets.
77 bool dropGroundnetsIfRequired();
90 * run the cache rebuild - returns the current phase or 'done'
92 RebuildPhase rebuild();
94 unsigned int rebuildPhaseCompletionPercentage() const;
95 void setRebuildPhaseProgress(RebuildPhase ph, unsigned int percent = 0);
97 bool isCachedFileModified(const SGPath& path) const;
98 void stampCacheFile(const SGPath& path);
100 int readIntProperty(const std::string& key);
101 double readDoubleProperty(const std::string& key);
102 std::string readStringProperty(const std::string& key);
104 void writeIntProperty(const std::string& key, int value);
105 void writeStringProperty(const std::string& key, const std::string& value);
106 void writeDoubleProperty(const std::string& key, const double& value);
108 string_list readStringListProperty(const std::string& key);
109 void writeStringListProperty(const std::string& key, const string_list& values);
112 * retrieve an FGPositioned from the cache.
113 * This may be trivial if the object is previously loaded, or require actual
116 FGPositionedRef loadById(PositionedID guid);
118 PositionedID insertAirport(FGPositioned::Type ty, const std::string& ident,
119 const std::string& name);
120 void insertTower(PositionedID airportId, const SGGeod& pos);
121 PositionedID insertRunway(FGPositioned::Type ty, const std::string& ident,
122 const SGGeod& pos, PositionedID apt,
123 double heading, double length, double width, double displacedThreshold,
124 double stopway, int surfaceCode);
125 void setRunwayReciprocal(PositionedID runway, PositionedID recip);
126 void setRunwayILS(PositionedID runway, PositionedID ils);
128 PositionedID insertNavaid(FGPositioned::Type ty, const std::string& ident,
129 const std::string& name, const SGGeod& pos, int freq, int range, double multiuse,
130 PositionedID apt, PositionedID runway);
132 // Assign colocated DME to a navaid
133 void setNavaidColocated(PositionedID navaid, PositionedID colocatedDME);
135 PositionedID insertCommStation(FGPositioned::Type ty,
136 const std::string& name, const SGGeod& pos, int freq, int range,
138 PositionedID insertFix(const std::string& ident, const SGGeod& aPos);
140 PositionedID createPOI(FGPositioned::Type ty, const std::string& ident, const SGGeod& aPos);
142 bool removePOI(FGPositioned::Type ty, const std::string& aIdent);
144 void dropGroundnetFor(PositionedID aAirport);
147 * Remove all ground-nets globally from the cache.
148 * This includes parking and taxi-nodes and edges between them. It's useful
149 * when scenery paths change, since the ground-nets depend on the scenery.
150 * Using this we can avoid havind to rebuild the entire cache.
152 void dropAllGroundnets();
154 PositionedID insertParking(const std::string& name, const SGGeod& aPos,
155 PositionedID aAirport,
156 double aHeading, int aRadius, const std::string& aAircraftType,
157 const std::string& aAirlines);
159 void setParkingPushBackRoute(PositionedID parking, PositionedID pushBackNode);
161 PositionedID insertTaxiNode(const SGGeod& aPos, PositionedID aAirport, int aHoldType, bool aOnRunway);
163 void insertGroundnetEdge(PositionedID aAirport, PositionedID from, PositionedID to);
165 /// update the metar flag associated with an airport
166 void setAirportMetar(const std::string& icao, bool hasMetar);
169 * Modify the position of an existing item.
171 void updatePosition(PositionedID item, const SGGeod &pos);
173 FGPositionedList findAllWithIdent( const std::string& ident,
174 FGPositioned::Filter* filter,
176 FGPositionedList findAllWithName( const std::string& ident,
177 FGPositioned::Filter* filter,
180 FGPositionedRef findClosestWithIdent( const std::string& aIdent,
182 FGPositioned::Filter* aFilter );
186 * Helper to implement the AirportSearch widget. Optimised text search of
187 * airport names and idents, returning a list suitable for passing directly
190 char** searchAirportNamesAndIdents(const std::string& aFilter);
193 * Find the closest matching comm-station on a frequency, to a position.
194 * The filter with be used for both type ranging and to validate the result
197 FGPositionedRef findCommByFreq(int freqKhz, const SGGeod& pos, FGPositioned::Filter* filt);
200 * find all items of a specified type (or range of types) at an airport
202 PositionedIDVec airportItemsOfType(PositionedID apt, FGPositioned::Type ty,
203 FGPositioned::Type maxTy = FGPositioned::INVALID);
206 * find the first match item of the specified type and ident, at an airport
208 PositionedID airportItemWithIdent(PositionedID apt, FGPositioned::Type ty, const std::string& ident);
211 * Find all navaids matching a particular frequency, sorted by range from the
212 * supplied position. Type-range will be determined from the filter
214 PositionedIDVec findNavaidsByFreq(int freqKhz, const SGGeod& pos, FGPositioned::Filter* filt);
216 /// overload version of the above that does not consider positioned when
217 /// returning results. Only used by TACAN carrier search
218 PositionedIDVec findNavaidsByFreq(int freqKhz, FGPositioned::Filter* filt);
221 * Given a runway and type, find the corresponding navaid (ILS / GS / OM)
223 PositionedID findNavaidForRunway(PositionedID runway, FGPositioned::Type ty);
226 * given a navaid name (or similar) from apt.dat / nav.dat, find the
227 * corresponding airport and runway IDs.
228 * Such names look like: 'LHBP 31L DME-ILS' or 'UEEE 23L MM'
230 AirportRunwayPair findAirportRunway(const std::string& name);
233 * Given an aiport, and runway and ILS identifier, find the corresponding cache
234 * entry. This matches the data we get in the ils.xml files for airports.
236 PositionedID findILS(PositionedID airport, const std::string& runway, const std::string& navIdent);
239 * Given an Octree node ID, return a bit-mask defining which of the child
240 * nodes exist. In practice this means an 8-bit value be sufficent, but
241 * an int works fine too.
243 int getOctreeBranchChildren(int64_t octreeNodeId);
245 void defineOctreeNode(Octree::Branch* pr, Octree::Node* nd);
248 * given an octree leaf, return all its child positioned items and their types
250 TypedPositionedVec getOctreeLeafChildren(int64_t octreeNodeId);
253 int findAirway(int network, const std::string& aName);
256 * insert an edge between two positioned nodes, into the network.
257 * The airway identifier will be set accordingly. No reverse edge is created
258 * by this method - edges are directional so a reverses must be explicitly
261 void insertEdge(int network, int airwayID, PositionedID from, PositionedID to);
263 /// is the specified positioned a node on the network?
264 bool isInAirwayNetwork(int network, PositionedID pos);
267 * retrive all the destination points reachcable from a positioned
270 AirwayEdgeVec airwayEdgesFrom(int network, PositionedID pos);
273 PositionedIDVec groundNetNodes(PositionedID aAirport, bool onlyPushback);
274 void markGroundnetAsPushback(PositionedID nodeId);
276 PositionedID findGroundNetNode(PositionedID airport, const SGGeod& aPos,
277 bool onRunway, FGRunway* aRunway = NULL);
278 PositionedIDVec groundNetEdgesFrom(PositionedID pos, bool onlyPushback);
280 PositionedIDVec findAirportParking(PositionedID airport, const std::string& flightType,
287 Transaction(NavDataCache* cache);
292 NavDataCache* _instance;
296 bool isReadOnly() const;
298 class ThreadedGUISearch
301 ThreadedGUISearch(const std::string& term);
302 ~ThreadedGUISearch();
304 PositionedIDVec results() const;
306 bool isComplete() const;
308 class ThreadedGUISearchPrivate;
309 std::auto_ptr<ThreadedGUISearchPrivate> d;
314 friend class RebuildThread;
317 friend class Transaction;
319 void beginTransaction();
320 void commitTransaction();
321 void abortTransaction();
323 class NavDataCachePrivate;
324 std::auto_ptr<NavDataCachePrivate> d;
327 } // of namespace flightgear
329 #endif // of FG_NAVDATACACHE_HXX