#include <Navaids/positioned.hxx>
class SGPath;
+class FGRunway;
namespace flightgear
{
** global input files is changed.
*/
bool isRebuildRequired();
-
+
+ /**
+ * check if cached scenery paths have changed, and if so, drop scenery-
+ * dependant data such as ground-nets.
+ */
+ bool dropGroundnetsIfRequired();
+
/**
- * run the cache rebuild
+ * run the cache rebuild - returns true if rebuild is complete,
+ * otherwise keep going.
*/
- void rebuild();
+ bool rebuild();
bool isCachedFileModified(const SGPath& path) const;
void stampCacheFile(const SGPath& path);
string_list readStringListProperty(const std::string& key);
void writeStringListProperty(const std::string& key, const string_list& values);
- FGPositioned* loadById(PositionedID guid);
+ /**
+ * retrieve an FGPositioned from the cache.
+ * This may be trivial if the object is previously loaded, or require actual
+ * disk IO.
+ */
+ FGPositionedRef loadById(PositionedID guid);
PositionedID insertAirport(FGPositioned::Type ty, const std::string& ident,
const std::string& name);
void setRunwayReciprocal(PositionedID runway, PositionedID recip);
void setRunwayILS(PositionedID runway, PositionedID ils);
- void updateRunwayThreshold(PositionedID runwayID, const SGGeod &aThreshold,
- double aHeading, double aDisplacedThreshold,
- double aStopway);
-
PositionedID insertNavaid(FGPositioned::Type ty, const std::string& ident,
const std::string& name, const SGGeod& pos, int freq, int range, double multiuse,
PositionedID apt, PositionedID runway);
- void updateILS(PositionedID ils, const SGGeod& newPos, double aHdg);
+
+ // Assign colocated DME to a navaid
+ void setNavaidColocated(PositionedID navaid, PositionedID colocatedDME);
PositionedID insertCommStation(FGPositioned::Type ty,
const std::string& name, const SGGeod& pos, int freq, int range,
PositionedID apt);
PositionedID insertFix(const std::string& ident, const SGGeod& aPos);
- PositionedID createUserWaypoint(const std::string& ident, const SGGeod& aPos);
+ PositionedID createPOI(FGPositioned::Type ty, const std::string& ident, const SGGeod& aPos);
+
+ bool removePOI(FGPositioned::Type ty, const std::string& aIdent);
+
+ void dropGroundnetFor(PositionedID aAirport);
+
+ /**
+ * Remove all ground-nets globally from the cache.
+ * This includes parking and taxi-nodes and edges between them. It's useful
+ * when scenery paths change, since the ground-nets depend on the scenery.
+ * Using this we can avoid havind to rebuild the entire cache.
+ */
+ void dropAllGroundnets();
+
+ PositionedID insertParking(const std::string& name, const SGGeod& aPos,
+ PositionedID aAirport,
+ double aHeading, int aRadius, const std::string& aAircraftType,
+ const std::string& aAirlines);
+
+ void setParkingPushBackRoute(PositionedID parking, PositionedID pushBackNode);
+ PositionedID insertTaxiNode(const SGGeod& aPos, PositionedID aAirport, int aHoldType, bool aOnRunway);
+
+ void insertGroundnetEdge(PositionedID aAirport, PositionedID from, PositionedID to);
+
+ /// update the metar flag associated with an airport
void setAirportMetar(const std::string& icao, bool hasMetar);
+ /**
+ * Modify the position of an existing item.
+ */
void updatePosition(PositionedID item, const SGGeod &pos);
- FGPositioned::List findAllWithIdent(const std::string& ident,
- FGPositioned::Filter* filter, bool exact);
- FGPositioned::List findAllWithName(const std::string& ident,
- FGPositioned::Filter* filter, bool exact);
+ FGPositionedList findAllWithIdent( const std::string& ident,
+ FGPositioned::Filter* filter,
+ bool exact );
+ FGPositionedList findAllWithName( const std::string& ident,
+ FGPositioned::Filter* filter,
+ bool exact );
- FGPositionedRef findClosestWithIdent(const std::string& aIdent,
- const SGGeod& aPos, FGPositioned::Filter* aFilter);
+ FGPositionedRef findClosestWithIdent( const std::string& aIdent,
+ const SGGeod& aPos,
+ FGPositioned::Filter* aFilter );
+ /**
+ * Helper to implement the AirportSearch widget. Optimised text search of
+ * airport names and idents, returning a list suitable for passing directly
+ * to PLIB.
+ */
char** searchAirportNamesAndIdents(const std::string& aFilter);
+ /**
+ * Find the closest matching comm-station on a frequency, to a position.
+ * The filter with be used for both type ranging and to validate the result
+ * candidates.
+ */
FGPositionedRef findCommByFreq(int freqKhz, const SGGeod& pos, FGPositioned::Filter* filt);
+ /**
+ * find all items of a specified type (or range of types) at an airport
+ */
PositionedIDVec airportItemsOfType(PositionedID apt, FGPositioned::Type ty,
FGPositioned::Type maxTy = FGPositioned::INVALID);
+ /**
+ * find the first match item of the specified type and ident, at an airport
+ */
PositionedID airportItemWithIdent(PositionedID apt, FGPositioned::Type ty, const std::string& ident);
-
+
+ /**
+ * Find all navaids matching a particular frequency, sorted by range from the
+ * supplied position. Type-range will be determined from the filter
+ */
PositionedIDVec findNavaidsByFreq(int freqKhz, const SGGeod& pos, FGPositioned::Filter* filt);
/// overload version of the above that does not consider positioned when
/// returning results. Only used by TACAN carrier search
PositionedIDVec findNavaidsByFreq(int freqKhz, FGPositioned::Filter* filt);
+ /**
+ * Given a runway and type, find the corresponding navaid (ILS / GS / OM)
+ */
+ PositionedID findNavaidForRunway(PositionedID runway, FGPositioned::Type ty);
+
/**
* given a navaid name (or similar) from apt.dat / nav.dat, find the
* corresponding airport and runway IDs.
// airways
int findAirway(int network, const std::string& aName);
+ /**
+ * insert an edge between two positioned nodes, into the network.
+ * The airway identifier will be set accordingly. No reverse edge is created
+ * by this method - edges are directional so a reverses must be explicitly
+ * created.
+ */
void insertEdge(int network, int airwayID, PositionedID from, PositionedID to);
+ /// is the specified positioned a node on the network?
bool isInAirwayNetwork(int network, PositionedID pos);
/**
* in an airway
*/
AirwayEdgeVec airwayEdgesFrom(int network, PositionedID pos);
+
+// ground-network
+ PositionedIDVec groundNetNodes(PositionedID aAirport, bool onlyPushback);
+ void markGroundnetAsPushback(PositionedID nodeId);
+
+ PositionedID findGroundNetNode(PositionedID airport, const SGGeod& aPos,
+ bool onRunway, FGRunway* aRunway = NULL);
+ PositionedIDVec groundNetEdgesFrom(PositionedID pos, bool onlyPushback);
+
+ PositionedIDVec findAirportParking(PositionedID airport, const std::string& flightType,
+ int radius);
+
+
+ class Transaction
+ {
+ public:
+ Transaction(NavDataCache* cache);
+ ~Transaction();
+
+ void commit();
+ private:
+ NavDataCache* _instance;
+ bool _committed;
+ };
+
+ bool isReadOnly() const;
private:
NavDataCache();
+
+ friend class RebuildThread;
+ void doRebuild();
+
+ friend class Transaction;
+
+ void beginTransaction();
+ void commitTransaction();
+ void abortTransaction();
class NavDataCachePrivate;
std::auto_ptr<NavDataCachePrivate> d;