} else if(!strcmp(buf, "H")) {
np->type = HOLD;
} else {
- cout << "**** ERROR ***** Unknown node type in taxi network...\n";
+ SG_LOG(SG_GENERAL, SG_ALERT, "**** ERROR ***** Unknown node type in taxi network...\n");
delete np;
return(false);
}
fin >> buf; // rwy exit information - gets parsed later - FRAGILE - will break if buf is reused.
// Now the name
+ fin >> ch; // strip the leading " off
np->name = "";
while(1) {
fin.unsetf(ios::skipws);
fin >> ch;
- np->name += ch;
if((ch == '"') || (ch == 0x0A)) {
break;
} // we shouldn't need the 0x0A but it makes a nice safely in case someone leaves off the "
+ np->name += ch;
}
fin.setf(ios::skipws);
network.push_back(np);
// FIXME - fragile - replies on buf not getting modified from exits read to here
// see if we also need to push it onto the runway exit list
- cout << "strlen(buf) = " << strlen(buf) << endl;
+ //cout << "strlen(buf) = " << strlen(buf) << endl;
if(strlen(buf) > 2) {
- cout << "Calling ParseRwyExits for " << buf << endl;
+ //cout << "Calling ParseRwyExits for " << buf << endl;
ParseRwyExits(np, buf);
}
} else if(!strcmp(buf, "A")) {
} else if(!strcmp(buf, "T")) {
ap->type = TAXIWAY;
} else {
- cout << "**** ERROR ***** Unknown arc type in taxi network...\n";
+ SG_LOG(SG_GENERAL, SG_ALERT, "**** ERROR ***** Unknown arc type in taxi network...\n");
delete ap;
return(false);
}
} else if(!strcmp(buf, "N")) {
ap->directed = false;
} else {
- cout << "**** ERROR ***** Unknown arc directed value in taxi network - should be Y/N !!!\n";
+ SG_LOG(SG_GENERAL, SG_ALERT, "**** ERROR ***** Unknown arc directed value in taxi network - should be Y/N !!!\n");
delete ap;
return(false);
}
gateCount++;
} else {
// Something has gone seriously pear-shaped
- cout << "********* ERROR - unknown ground network element type... aborting read of " << path.c_str() << '\n';
+ SG_LOG(SG_GENERAL, SG_ALERT, "********* ERROR - unknown ground network element type... aborting read of " << path.c_str() << '\n');
return(false);
}
}
}
+
+// WARNING - This is hardwired to my prototype logical network format
+// and will almost certainly change when Bernie's stuff comes on-line.
+node* FGGround::GetThresholdNode(string rwyID) {
+ // For now go through all the nodes and parse their names
+ // Maybe in the future we'll map threshold nodes by ID
+ //cout << "Size of network is " << network.size() << '\n';
+ for(unsigned int i=0; i<network.size(); ++i) {
+ //cout << "Name = " << network[i]->name << '\n';
+ if(network[i]->name.size()) {
+ string s = network[i]->name;
+ // Warning - the next bit is fragile and dependent on my current naming scheme
+ //cout << "substr = " << s.substr(0,3) << '\n';
+ //cout << "size of s = " << s.size() << '\n';
+ if(s.substr(0,3) == "rwy") {
+ //cout << "subsubstr = " << s.substr(4, s.size() - 4) << '\n';
+ if(s.substr(4, s.size() - 4) == rwyID) {
+ return network[i];
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
// Get a path from a point on a runway to a gate
// TODO !!
return(GetShortestPath(A, B));
};
+// Get a path from a node to a runway threshold
+ground_network_path_type FGGround::GetPath(node* A, string rwyID) {
+ node* b = GetThresholdNode(rwyID);
+ if(b == NULL) {
+ SG_LOG(SG_GENERAL, SG_ALERT, "ERROR - unable to find path to runway theshold in ground.cxx\n");
+ ground_network_path_type emptyPath;
+ emptyPath.erase(emptyPath.begin(), emptyPath.end());
+ return(emptyPath);
+ }
+ return GetShortestPath(A, b);
+}
// A shortest path algorithm from memory (ie. I can't find the bl&*dy book again!)
// I'm sure there must be enchancements that we can make to this, such as biasing the
unsigned int nodeID; //each node in an airport needs a unique ID number - this is ZERO-BASED to match array position
Point3D pos;
Point3D orthoPos;
- char* name;
+ string name;
node_type type;
arc_array_type arcs;
double max_turn_radius;
int max_weight; //units??
//airline_code airline; //For the future - we don't have any airline codes ATM
int id; // The gate number in the logical scheme of things
- string sid; // The real-world gate letter/number
+ string name; // The real-world gate letter/number
//node* pNode;
bool used;
double heading; // The direction the parked-up plane should point in degrees
node_array_type GetExits(int rwyID);
// Get a path from one node to another
- ground_network_path_type GetPath(node* A, node* B);
+ ground_network_path_type GetPath(node* A, node* B);
+
+ // Get a path from a node to a runway threshold
+ ground_network_path_type GetPath(node* A, string rwyID);
private:
// TODO - modify to return a suitable gate based on aircraft size/weight.
int GetRandomGateID();
+ // Return a pointer to the node at a runway threshold
+ // Returns NULL if unsuccessful.
+ node* GetThresholdNode(string rwyID);
+
// A shortest path algorithm sort of from memory (I can't find the bl&*dy book again!)
ground_network_path_type GetShortestPath(node* A, node* B);
};