#include <simgear/compiler.h>
#include <string>
-#include <vector>
-#include <list>
-#include <map>
#include "gnnode.hxx"
#include "parking.hxx"
-#include <ATC/trafficcontrol.hxx>
+class FGAirportDynamicsXMLLoader;
-class Block;
-class FGRunway;
-class FGTaxiSegment; // forward reference
-class FGAIFlightPlan; // forward reference
-class FGAirport; // forward reference
-
-typedef std::vector<FGTaxiSegment*> FGTaxiSegmentVector;
-typedef FGTaxiSegmentVector::iterator FGTaxiSegmentVectorIterator;
-
-typedef std::map<int, FGTaxiNode_ptr> IndexTaxiNodeMap;
+typedef std::vector<int> intVec;
+typedef std::vector<int>::iterator intVecIterator;
class Block
{
bool operator< (const Block &other) const { return blocktime < other.blocktime; };
};
-typedef std::vector<Block> BlockList;
-typedef BlockList::iterator BlockListIterator;
-
/***************************************************************************************
* class FGTaxiSegment
**************************************************************************************/
class FGTaxiSegment
{
private:
- int startNode;
- int endNode;
- double length;
- double heading;
+ // weak (non-owning) pointers deliberately here:
+ // the ground-network owns the nodes
+ const FGTaxiNode* startNode;
+ const FGTaxiNode* endNode;
+
bool isActive;
- bool isPushBackRoute;
BlockList blockTimes;
- FGTaxiNode *start;
- FGTaxiNode *end;
+
int index;
- FGTaxiSegment *oppositeDirection;
+ FGTaxiSegment *oppositeDirection; // also deliberatley weak
+ friend class FGGroundNetwork;
public:
- FGTaxiSegment(int start, int end, bool isPushBack);
+ FGTaxiSegment(FGTaxiNode* start, FGTaxiNode* end);
void setIndex (int val) {
index = val;
};
-
- void setOpposite(FGTaxiSegment *opp) {
- oppositeDirection = opp;
- };
-
- bool bindToNodes(const IndexTaxiNodeMap& nodes);
void setDimensions(double elevation);
void block(int id, time_t blockTime, time_t now);
void unblock(time_t now);
bool hasBlock(time_t now);
- FGTaxiNode * getEnd() {
- return end;
- };
- FGTaxiNode * getStart() {
- return start;
- };
- double getLength() {
- return length;
- };
- int getIndex() {
- return index;
- };
+ FGTaxiNodeRef getEnd() const;
+ FGTaxiNodeRef getStart() const;
+
+ double getLength() const;
// compute the center of the arc
SGGeod getCenter() const;
- double getHeading() {
- return heading;
- };
- bool isPushBack() {
- return isPushBackRoute;
+ double getHeading() const;
+
+ int getIndex() {
+ return index;
};
int getPenalty(int nGates);
bool operator<(const FGTaxiSegment &other) const {
return index < other.index;
};
- //bool hasSmallerHeadingDiff (const FGTaxiSegment &other) const { return headingDiff < other.headingDiff; };
+
FGTaxiSegment *opposite() {
return oppositeDirection;
};
};
-
-
-
-typedef std::vector<int> intVec;
-typedef std::vector<int>::iterator intVecIterator;
-
-
-
/***************************************************************************************
* class FGTaxiRoute
**************************************************************************************/
class FGTaxiRoute
{
private:
- intVec nodes;
+ FGTaxiNodeVector nodes;
intVec routes;
double distance;
-// int depth;
- intVecIterator currNode;
- intVecIterator currRoute;
+ FGTaxiNodeVector::iterator currNode;
+ intVec::iterator currRoute;
public:
FGTaxiRoute() {
currNode = nodes.begin();
currRoute = routes.begin();
};
- FGTaxiRoute(intVec nds, intVec rts, double dist, int dpth) {
+
+ FGTaxiRoute(const FGTaxiNodeVector& nds, intVec rts, double dist, int dpth) {
nodes = nds;
routes = rts;
distance = dist;
currNode = nodes.begin();
currRoute = routes.begin();
-// depth = dpth;
};
FGTaxiRoute& operator= (const FGTaxiRoute &other) {
nodes = other.nodes;
routes = other.routes;
distance = other.distance;
-// depth = other.depth;
currNode = nodes.begin();
currRoute = routes.begin();
return *this;
nodes(copy.nodes),
routes(copy.routes),
distance(copy.distance),
-// depth(copy.depth),
currNode(nodes.begin()),
currRoute(routes.begin())
{};
return distance < other.distance;
};
bool empty () {
- return nodes.begin() == nodes.end();
+ return nodes.empty();
};
- bool next(int *nde);
- bool next(int *nde, int *rte);
- void rewind(int legNr);
-
+ bool next(FGTaxiNodeRef& nde, int *rte);
+
void first() {
currNode = nodes.begin();
currRoute = routes.begin();
int nodesLeft() {
return nodes.end() - currNode;
};
-
-// int getDepth() { return depth; };
};
-typedef std::vector<FGTaxiRoute> TaxiRouteVector;
-typedef std::vector<FGTaxiRoute>::iterator TaxiRouteVectorIterator;
-
/**************************************************************************************
* class FGGroundNetWork
*************************************************************************************/
-class FGGroundNetwork : public FGATCController
+class FGGroundNetwork
{
private:
+ friend class FGAirportDynamicsXMLLoader;
+
+ FGAirportDynamics* dynamics; // weak back-pointer to our owner
bool hasNetwork;
bool networkInitialized;
- time_t nextSave;
- //int maxDepth;
- int count;
+
int version;
- IndexTaxiNodeMap nodes;
- FGTaxiNodeVector pushBackNodes;
-
FGTaxiSegmentVector segments;
- TaxiRouteVector routes;
- TrafficVector activeTraffic;
- TrafficVectorIterator currTraffic;
-
- bool foundRoute;
- double totalDistance, maxDistance;
- FGTowerController *towerController;
FGAirport *parent;
+ FGParkingList m_parkings;
+ FGTaxiNodeVector m_nodes;
+
+ FGTaxiNodeRef findNodeByIndex(int index) const;
//void printRoutingError(string);
double heading, double speed, double alt);
- void parseCache();
+ void addSegment(const FGTaxiNodeRef& from, const FGTaxiNodeRef& to);
+ void addParking(const FGParkingRef& park);
+
+ FGTaxiNodeVector segmentsFrom(const FGTaxiNodeRef& from) const;
+
public:
FGGroundNetwork();
~FGGroundNetwork();
-
- void addNode (FGTaxiNode* node);
- void addNodes (FGParkingVec *parkings);
- void addSegment(FGTaxiSegment* seg);
- void setVersion (int v) { version = v;};
+ void setVersion (int v) { version = v;};
int getVersion() { return version; };
- void init();
+ void init(FGAirportDynamics* pr);
bool exists() {
return hasNetwork;
};
- void setTowerController(FGTowerController *twrCtrlr) {
- towerController = twrCtrlr;
- };
- int findNearestNode(const SGGeod& aGeod);
- int findNearestNodeOnRunway(const SGGeod& aGeod, FGRunway* aRunway = NULL);
+ FGTaxiNodeRef findNearestNode(const SGGeod& aGeod) const;
+ FGTaxiNodeRef findNearestNodeOnRunway(const SGGeod& aGeod, FGRunway* aRunway = NULL) const;
- FGTaxiNode *findNode(unsigned idx);
- FGTaxiSegment *findSegment(unsigned idx);
- FGTaxiRoute findShortestRoute(int start, int end, bool fullSearch=true);
- //void trace(FGTaxiNode *, int, int, double dist);
+ FGTaxiSegment *findSegment(unsigned int idx) const;
- int getNrOfNodes() {
- return nodes.size();
- };
+ FGTaxiSegment* findOppositeSegment(unsigned int index) const;
- void setParent(FGAirport *par) {
- parent = par;
- };
+ const FGParkingList& allParkings() const;
+
+ /**
+ * Find the taxiway segment joining two (ground-net) nodes. Returns
+ * NULL if no such segment exists.
+ * It is permitted to pass HULL for the 'to' indicating that any
+ * segment originating at 'from' is acceptable.
+ */
+ FGTaxiSegment *findSegment(const FGTaxiNode* from, const FGTaxiNode* to) const;
+
+ FGTaxiRoute findShortestRoute(FGTaxiNode* start, FGTaxiNode* end, bool fullSearch=true);
+
+
+ void blockSegmentsEndingAt(FGTaxiSegment* seg, int blockId,
+ time_t blockTime, time_t now);
- virtual void announcePosition(int id, FGAIFlightPlan *intendedRoute, int currentRoute,
- double lat, double lon, double hdg, double spd, double alt,
- double radius, int leg, FGAIAircraft *aircraft);
- virtual void signOff(int id);
- virtual void updateAircraftInformation(int id, double lat, double lon, double heading, double speed, double alt, double dt);
- virtual bool hasInstruction(int id);
- virtual FGATCInstruction getInstruction(int id);
-
- bool checkTransmissionState(int minState, int MaxState, TrafficVectorIterator i, time_t now, AtcMsgId msgId,
- AtcMsgDir msgDir);
- bool checkForCircularWaits(int id);
- virtual void render(bool);
- virtual std::string getName();
- virtual void update(double dt);
-
- void saveElevationCache();
void addVersion(int v) {version = v; };
+ void unblockAllSegments(time_t now);
};