X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAirports%2Fgroundnetwork.hxx;h=a70fa2c099c2b78384517af64a07e4a603902a06;hb=49030e700ba276d5cd6ffa4f4e661a266fa0105c;hp=f4a8dd41fd583cb554fb5fa35474b155b2ee9078;hpb=5b2e16ca730fc0e7f6730192a2744131b195e7fa;p=flightgear.git diff --git a/src/Airports/groundnetwork.hxx b/src/Airports/groundnetwork.hxx index f4a8dd41f..a70fa2c09 100644 --- a/src/Airports/groundnetwork.hxx +++ b/src/Airports/groundnetwork.hxx @@ -25,61 +25,27 @@ #define _GROUNDNETWORK_HXX_ #include +#include - -#include STL_STRING +#include #include -SG_USING_STD(string); -SG_USING_STD(vector); - +using std::string; +using std::vector; +#include "gnnode.hxx" #include "parking.hxx" -//#include - - +#include class FGTaxiSegment; // forward reference class FGAIFlightPlan; // forward reference +class FGAirport; // forward reference -typedef vector FGTaxiSegmentVector; -typedef vector FGTaxiSegmentPointerVector; -typedef vector::iterator FGTaxiSegmentVectorIterator; -typedef vector::iterator FGTaxiSegmentPointerVectorIterator; +typedef vector FGTaxiSegmentVector; +typedef vector::iterator FGTaxiSegmentVectorIterator; -/************************************************************************************** - * class FGTaxiNode - *************************************************************************************/ -class FGTaxiNode -{ -private: - double lat; - double lon; - int index; - FGTaxiSegmentPointerVector next; // a vector to all the segments leaving from this node - -public: - FGTaxiNode(); - FGTaxiNode(double, double, int); - - void setIndex(int idx) { index = idx;}; - void setLatitude (double val) { lat = val;}; - void setLongitude(double val) { lon = val;}; - void setLatitude (const string& val) { lat = processPosition(val); }; - void setLongitude(const string& val) { lon = processPosition(val); }; - void addSegment(FGTaxiSegment *segment) { next.push_back(segment); }; - - double getLatitude() { return lat;}; - double getLongitude(){ return lon;}; - - int getIndex() { return index; }; - FGTaxiNode *getAddress() { return this;}; - FGTaxiSegmentPointerVectorIterator getBeginRoute() { return next.begin(); }; - FGTaxiSegmentPointerVectorIterator getEndRoute() { return next.end(); }; -}; - -typedef vector FGTaxiNodeVector; -typedef vector::iterator FGTaxiNodeVectorIterator; +//typedef vector FGTaxiSegmentPointerVector; +//typedef vector::iterator FGTaxiSegmentPointerVectorIterator; /*************************************************************************************** * class FGTaxiSegment @@ -90,35 +56,103 @@ private: int startNode; int endNode; double length; + double course; + double headingDiff; + bool isActive; + bool isPushBackRoute; FGTaxiNode *start; FGTaxiNode *end; int index; + FGTaxiSegment *oppositeDirection; + + public: - FGTaxiSegment(); - FGTaxiSegment(FGTaxiNode *, FGTaxiNode *, int); + FGTaxiSegment() : + startNode(0), + endNode(0), + length(0), + course(0), + headingDiff(0), + isActive(0), + isPushBackRoute(0), + start(0), + end(0), + index(0), + oppositeDirection(0) + { + }; + + FGTaxiSegment (const FGTaxiSegment &other) : + startNode (other.startNode), + endNode (other.endNode), + length (other.length), + course (other.course), + headingDiff (other.headingDiff), + isActive (other.isActive), + isPushBackRoute (other.isPushBackRoute), + start (other.start), + end (other.end), + index (other.index), + oppositeDirection (other.oppositeDirection) + { + }; + + FGTaxiSegment& operator=(const FGTaxiSegment &other) + { + startNode = other.startNode; + endNode = other.endNode; + length = other.length; + course = other.course; + headingDiff = other.headingDiff; + isActive = other.isActive; + isPushBackRoute = other.isPushBackRoute; + start = other.start; + end = other.end; + index = other.index; + oppositeDirection = other.oppositeDirection; + return *this; + }; void setIndex (int val) { index = val; }; void setStartNodeRef (int val) { startNode = val; }; void setEndNodeRef (int val) { endNode = val; }; + void setOpposite(FGTaxiSegment *opp) { oppositeDirection = opp; }; + void setStart(FGTaxiNodeVector *nodes); void setEnd (FGTaxiNodeVector *nodes); + void setPushBackType(bool val) { isPushBackRoute = val; }; void setTrackDistance(); FGTaxiNode * getEnd() { return end;}; + FGTaxiNode * getStart() { return start; }; double getLength() { return length; }; int getIndex() { return index; }; + + bool isPushBack() { return isPushBackRoute; }; + + int getPenalty(int nGates); + + FGTaxiSegment *getAddress() { return this;}; + + bool operator<(const FGTaxiSegment &other) const { return index < other.index; }; + bool hasSmallerHeadingDiff (const FGTaxiSegment &other) const { return headingDiff < other.headingDiff; }; + FGTaxiSegment *opposite() { return oppositeDirection; }; + void setCourseDiff(double crse); - FGTaxiSegment *getAddress() { return this;}; }; + + typedef vector intVec; typedef vector::iterator intVecIterator; + + /*************************************************************************************** * class FGTaxiRoute **************************************************************************************/ @@ -128,17 +162,39 @@ private: intVec nodes; intVec routes; double distance; + int depth; intVecIterator currNode; intVecIterator currRoute; public: FGTaxiRoute() { distance = 0; currNode = nodes.begin(); currRoute = routes.begin();}; - FGTaxiRoute(intVec nds, intVec rts, double dist) { + FGTaxiRoute(intVec nds, intVec rts, double dist, int dpth) { nodes = nds; routes = rts; distance = dist; currNode = nodes.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; + }; + + FGTaxiRoute(const FGTaxiRoute& copy) : + nodes(copy.nodes), + routes(copy.routes), + distance(copy.distance), + depth(copy.depth), + currNode(nodes.begin()), + currRoute(routes.begin()) + {}; + bool operator< (const FGTaxiRoute &other) const {return distance < other.distance; }; bool empty () { return nodes.begin() == nodes.end(); }; bool next(int *nde); @@ -147,134 +203,12 @@ public: void first() { currNode = nodes.begin(); currRoute = routes.begin(); }; int size() { return nodes.size(); }; + int getDepth() { return depth; }; }; typedef vector TaxiRouteVector; typedef vector::iterator TaxiRouteVectorIterator; -/************************************************************************************** - * class FGATCInstruction - * like class FGATC Controller, this class definition should go into its own file - * and or directory... For now, just testing this stuff out though... - *************************************************************************************/ -class FGATCInstruction -{ -private: - bool holdPattern; - bool holdPosition; - bool changeSpeed; - bool changeHeading; - bool changeAltitude; - - double speed; - double heading; - double alt; -public: - - FGATCInstruction(); - bool hasInstruction (); - bool getHoldPattern () { return holdPattern; }; - bool getHoldPosition () { return holdPosition; }; - bool getChangeSpeed () { return changeSpeed; }; - bool getChangeHeading () { return changeHeading; }; - bool getChangeAltitude() { return changeAltitude; }; - - double getSpeed () { return speed; }; - double getHeading () { return heading; }; - double getAlt () { return alt; }; - - void setHoldPattern (bool val) { holdPattern = val; }; - void setHoldPosition (bool val) { holdPosition = val; }; - void setChangeSpeed (bool val) { changeSpeed = val; }; - void setChangeHeading (bool val) { changeHeading = val; }; - void setChangeAltitude(bool val) { changeAltitude = val; }; - - void setSpeed (double val) { speed = val; }; - void setHeading (double val) { heading = val; }; - void setAlt (double val) { alt = val; }; -}; - - -/************************************************************************************** - * class FGTrafficRecord - *************************************************************************************/ -class FGTrafficRecord -{ -private: - int id, waitsForId; - int currentPos; - intVec intentions; - FGATCInstruction instruction; - double latitude, longitude, heading, speed, altitude, radius; - - -public: - FGTrafficRecord() {}; - - void setId(int val) { id = val; }; - void setRadius(double rad) { radius = rad;}; - void setPositionAndIntentions(int pos, FGAIFlightPlan *route); - int getId() { return id;}; - FGATCInstruction getInstruction() { return instruction;}; - bool hasInstruction() { return instruction.hasInstruction(); }; - void setPositionAndHeading(double lat, double lon, double hdg, double spd, double alt); - bool checkPositionAndIntentions(FGTrafficRecord &other); - - double getLatitude () { return latitude ; }; - double getLongitude() { return longitude; }; - double getHeading () { return heading ; }; - double getSpeed () { return speed ; }; - double getAltitude () { return altitude ; }; - double getRadius () { return radius ; }; - - int getWaitsForId () { return waitsForId; }; - - void setSpeedAdjustment(double spd) { instruction.setChangeSpeed(true); - instruction.setSpeed(spd); }; - void setHeadingAdjustment(double heading) { instruction.setChangeHeading(true); - instruction.setHeading(heading); }; - void clearSpeedAdjustment () { instruction.setChangeSpeed (false); }; - void clearHeadingAdjustment() { instruction.setChangeHeading(false); }; - - bool hasHeadingAdjustment() { return instruction.getChangeHeading(); }; - - void setWaitsForId(int id) { waitsForId = id; }; - -}; - -typedef vector TrafficVector; -typedef vector::iterator TrafficVectorIterator; - - - - -/************************************************************************************** - * class FGATCController - * NOTE: this class serves as an abstraction layer for all sorts of ATC controller, - * Ground and air, so eventually it should move to its own file / directory. - *************************************************************************************/ -class FGATCController -{ -private: - double dt_count; -public: - FGATCController() { dt_count = 0;}; - virtual ~FGATCController() {}; - virtual void announcePosition(int id, FGAIFlightPlan *intendedRoute, int currentRoute, - double lat, double lon, - double hdg, double spd, double alt, double radius) = 0; - virtual void signOff(int id) = 0; - virtual void update(int id, double lat, double lon, - double heading, double speed, double alt) = 0; - virtual bool hasInstruction(int id) = 0; - virtual FGATCInstruction getInstruction(int id) = 0; - - double getDt() { return dt_count; }; - void setDt(double dt) { dt_count = dt;}; -}; - - - /************************************************************************************** * class FGGroundNetWork *************************************************************************************/ @@ -282,22 +216,35 @@ class FGGroundNetwork : public FGATCController { private: bool hasNetwork; + //int maxDepth; + int count; FGTaxiNodeVector nodes; + FGTaxiNodeVector pushBackNodes; FGTaxiSegmentVector segments; //intVec route; - intVec nodesStack; - intVec routesStack; + //intVec nodesStack; + //intVec routesStack; TaxiRouteVector routes; TrafficVector activeTraffic; TrafficVectorIterator currTraffic; - + SGWayPoint destination; + bool foundRoute; double totalDistance, maxDistance; + FGTowerController *towerController; + FGAirport *parent; + + + //void printRoutingError(string); + + void checkSpeedAdjustment(int id, double lat, double lon, + double heading, double speed, double alt); + void checkHoldPosition(int id, double lat, double lon, + double heading, double speed, double alt); - void printRoutingError(string); - public: FGGroundNetwork(); + ~FGGroundNetwork(); void addNode (const FGTaxiNode& node); void addNodes (FGParkingVec *parkings); @@ -305,18 +252,26 @@ public: void init(); bool exists() { return hasNetwork; }; + void setTowerController(FGTowerController *twrCtrlr) { towerController = twrCtrlr; }; int findNearestNode(double lat, double lon); FGTaxiNode *findNode(int idx); FGTaxiSegment *findSegment(int idx); - FGTaxiRoute findShortestRoute(int start, int end); - void trace(FGTaxiNode *, int, int, double dist); + FGTaxiRoute findShortestRoute(int start, int end, bool fullSearch=true); + //void trace(FGTaxiNode *, int, int, double dist); + + int getNrOfNodes() { return nodes.size(); }; + + void setParent(FGAirport *par) { parent = par; }; virtual void announcePosition(int id, FGAIFlightPlan *intendedRoute, int currentRoute, - double lat, double lon, double hdg, double spd, double alt, double radius); + double lat, double lon, double hdg, double spd, double alt, + double radius, int leg, FGAIAircraft *aircraft); virtual void signOff(int id); - virtual void update(int id, double lat, double lon, double heading, double speed, double alt); + virtual void update(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 checkForCircularWaits(int id); };