1 // This program is free software; you can redistribute it and/or
2 // modify it under the terms of the GNU General Public License as
3 // published by the Free Software Foundation; either version 2 of the
4 // License, or (at your option) any later version.
6 // This program is distributed in the hope that it will be useful, but
7 // WITHOUT ANY WARRANTY; without even the implied warranty of
8 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9 // General Public License for more details.
11 // You should have received a copy of the GNU General Public License
12 // along with this program; if not, write to the Free Software
13 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 #include "dynamicloader.hxx"
24 FGAirportDynamicsXMLLoader::FGAirportDynamicsXMLLoader(FGAirportDynamics* dyn):
25 XMLVisitor(), _dynamics(dyn) {}
27 void FGAirportDynamicsXMLLoader::startXML () {
28 //cout << "Start XML" << endl;
31 void FGAirportDynamicsXMLLoader::endXML () {
32 //cout << "End XML" << endl;
35 void FGAirportDynamicsXMLLoader::startElement (const char * name, const XMLAttributes &atts) {
36 // const char *attval;
39 FGTaxiSegment taxiSegment;
42 taxiSegment.setIndex(index);
43 //cout << "Start element " << name << endl;
54 if (name == string("Parking"))
57 for (int i = 0; i < atts.size(); i++)
59 //cout << " " << atts.getName(i) << '=' << atts.getValue(i) << endl;
60 attname = atts.getName(i);
61 if (attname == string("index")) {
62 park.setIndex(std::atoi(atts.getValue(i)));
63 idxStr = atts.getValue(i);
65 else if (attname == string("type"))
66 park.setType(atts.getValue(i));
67 else if (attname == string("name"))
68 gateName = atts.getValue(i);
69 else if (attname == string("number"))
70 gateNumber = atts.getValue(i);
71 else if (attname == string("lat"))
72 park.setLatitude(atts.getValue(i));
73 else if (attname == string("lon"))
74 park.setLongitude(atts.getValue(i));
75 else if (attname == string("heading"))
76 park.setHeading(std::atof(atts.getValue(i)));
77 else if (attname == string("radius")) {
78 string radius = atts.getValue(i);
79 if (radius.find("M") != string::npos)
80 radius = radius.substr(0, radius.find("M",0));
81 //cerr << "Radius " << radius <<endl;
82 park.setRadius(std::atof(radius.c_str()));
84 else if (attname == string("airlineCodes"))
85 park.setCodes(atts.getValue(i));
86 else if (attname == string("pushBackRoute")) {
87 pushBackPoint = std::atoi(atts.getValue(i));
88 //park.setPushBackPoint(std::atoi(atts.getValue(i)));
92 park.setPushBackPoint(pushBackPoint);
93 park.setName((gateName+gateNumber));
94 //cerr << "Parking " << idxStr << "( " << gateName << gateNumber << ") has pushBackPoint " << pushBackPoint << endl;
95 _dynamics->addParking(park);
97 if (name == string("node"))
99 for (int i = 0; i < atts.size() ; i++)
101 attname = atts.getName(i);
102 if (attname == string("index"))
103 taxiNode.setIndex(std::atoi(atts.getValue(i)));
104 if (attname == string("lat"))
105 taxiNode.setLatitude(atts.getValue(i));
106 if (attname == string("lon"))
107 taxiNode.setLongitude(atts.getValue(i));
108 if (attname == string("isOnRunway"))
109 taxiNode.setOnRunway((bool) std::atoi(atts.getValue(i)));
110 if (attname == string("holdPointType")) {
111 attval = atts.getValue(i);
112 if (attval==string("none")) {
114 } else if (attval==string("normal")) {
116 } else if (attval==string("CAT II/III")) {
118 } else if (attval==string("PushBack")) {
123 //cerr << "Setting Holding point to " << holdPointType << endl;
124 taxiNode.setHoldPointType(holdPointType);
127 _dynamics->getGroundNetwork()->addNode(taxiNode);
129 if (name == string("arc"))
131 taxiSegment.setIndex(++index);
132 for (int i = 0; i < atts.size() ; i++)
134 attname = atts.getName(i);
135 if (attname == string("begin"))
136 taxiSegment.setStartNodeRef(std::atoi(atts.getValue(i)));
137 if (attname == string("end"))
138 taxiSegment.setEndNodeRef(std::atoi(atts.getValue(i)));
139 if (attname == string("isPushBackRoute"))
140 taxiSegment.setPushBackType((bool) std::atoi(atts.getValue(i)));
142 _dynamics->getGroundNetwork()->addSegment(taxiSegment);
144 // sort by radius, in asending order, so that smaller gates are first in the list
147 void FGAirportDynamicsXMLLoader::endElement (const char * name) {
148 //cout << "End element " << name << endl;
149 if (name == string("AWOS")) {
150 _dynamics->addAwosFreq(atoi(value.c_str()));
151 //cerr << "Adding AWOS" << value<< endl;
153 if (name == string("UNICOM")) {
154 _dynamics->addUnicomFreq(atoi(value.c_str()));
155 //cerr << "UNICOM" << value<< endl;
157 if (name == string("CLEARANCE")) {
158 _dynamics->addClearanceFreq(atoi(value.c_str()));
159 //cerr << "Adding CLEARANCE" << value<< endl;
161 if (name == string("GROUND")) {
162 _dynamics->addGroundFreq(atoi(value.c_str()));
163 //cerr << "Adding GROUND" << value<< endl;
166 if (name == string("TOWER")) {
167 _dynamics->addTowerFreq(atoi(value.c_str()));
168 //cerr << "Adding TOWER" << value<< endl;
170 if (name == string("APPROACH")) {
171 _dynamics->addApproachFreq(atoi(value.c_str()));
172 //cerr << "Adding approach" << value<< endl;
177 void FGAirportDynamicsXMLLoader::data (const char * s, int len) {
178 string token = string(s,len);
179 //cout << "Character data " << string(s,len) << endl;
180 if ((token.find(" ") == string::npos && (token.find('\n')) == string::npos))
186 void FGAirportDynamicsXMLLoader::pi (const char * target, const char * data) {
187 //cout << "Processing instruction " << target << ' ' << data << endl;
190 void FGAirportDynamicsXMLLoader::warning (const char * message, int line, int column) {
191 SG_LOG(SG_IO, SG_WARN, "Warning: " << message << " (" << line << ',' << column << ')');
194 void FGAirportDynamicsXMLLoader::error (const char * message, int line, int column) {
195 SG_LOG(SG_IO, SG_ALERT, "Error: " << message << " (" << line << ',' << column << ')');