]> git.mxchange.org Git - flightgear.git/blob - src/Airports/dynamicloader.cxx
Merge branch 'next' of D:\Git_New\flightgear into next
[flightgear.git] / src / Airports / dynamicloader.cxx
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.
5 //
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.
10 //
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.
14 //
15
16 #ifdef HAVE_CONFIG_H
17 #  include <config.h>
18 #endif
19
20 #include <cstdlib>
21
22 #include "dynamicloader.hxx"
23
24 FGAirportDynamicsXMLLoader::FGAirportDynamicsXMLLoader(FGAirportDynamics* dyn):
25     XMLVisitor(), _dynamics(dyn) {}
26
27 void  FGAirportDynamicsXMLLoader::startXML () {
28   //cout << "FGAirportDynamicsLoader::Start XML" << endl;
29 }
30
31 void  FGAirportDynamicsXMLLoader::endXML () {
32   //cout << "End XML" << endl;
33 }
34
35 void  FGAirportDynamicsXMLLoader::startElement (const char * name, const XMLAttributes &atts) {
36   // const char *attval;
37   FGParking park;
38   FGTaxiNode taxiNode;
39   FGTaxiSegment taxiSegment;
40   int index = 0;
41   string idxStr;
42   taxiSegment.setIndex(index);
43   //cout << "Start element " << name << endl;
44   string attname;
45   string value;
46   string gateName;
47   string gateNumber;
48   string attval;
49   string lat;
50   string lon;
51   int holdPointType;
52   int pushBackPoint;
53   
54   if (name == string("Parking"))
55     {
56       pushBackPoint = 0;
57       for (int i = 0; i < atts.size(); i++)
58         {
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);
64           }
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()));
83           }
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)));
89
90            }
91         }
92       park.setPushBackPoint(pushBackPoint);
93       park.setName((gateName+gateNumber));
94       //cerr << "Parking " << idxStr << "( " << gateName << gateNumber << ") has pushBackPoint " << pushBackPoint << endl;
95       _dynamics->addParking(park);
96     }
97   if (name == string("node")) 
98     {
99       for (int i = 0; i < atts.size() ; i++)
100         {
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")) {
113                 holdPointType=0;
114             } else if (attval==string("normal")) {
115                  holdPointType=1;
116             } else if (attval==string("CAT II/III")) {
117                  holdPointType=3;
118             } else if (attval==string("PushBack")) {
119                  holdPointType=3;
120             } else {
121                  holdPointType=0;
122             }
123             //cerr << "Setting Holding point to " << holdPointType << endl;
124             taxiNode.setHoldPointType(holdPointType);
125           }
126         }
127       _dynamics->getGroundNetwork()->addNode(taxiNode);
128     }
129   if (name == string("arc")) 
130     {
131       taxiSegment.setIndex(++index);
132       for (int i = 0; i < atts.size() ; i++)
133         {
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)));
141         }
142       _dynamics->getGroundNetwork()->addSegment(taxiSegment);
143     }
144   // sort by radius, in asending order, so that smaller gates are first in the list
145 }
146
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;
152   }
153   if (name == string("UNICOM")) {
154        _dynamics->addUnicomFreq(atoi(value.c_str()));
155        //cerr << "UNICOM" << value<< endl;
156   }
157 if (name == string("CLEARANCE")) {
158        _dynamics->addClearanceFreq(atoi(value.c_str()));
159        //cerr << "Adding CLEARANCE" << value<< endl;
160   }
161 if (name == string("GROUND")) {
162        _dynamics->addGroundFreq(atoi(value.c_str()));
163        //cerr << "Adding GROUND" << value<< endl;
164   }
165
166 if (name == string("TOWER")) {
167        _dynamics->addTowerFreq(atoi(value.c_str()));
168       //cerr << "Adding TOWER" << value<< endl;
169   }
170 if (name == string("APPROACH")) {
171        _dynamics->addApproachFreq(atoi(value.c_str()));
172        //cerr << "Adding approach" << value<< endl;
173   }
174
175 }
176
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))
181     value += token;
182   else
183     value = string("");
184 }
185
186 void  FGAirportDynamicsXMLLoader::pi (const char * target, const char * data) {
187   //cout << "Processing instruction " << target << ' ' << data << endl;
188 }
189
190 void  FGAirportDynamicsXMLLoader::warning (const char * message, int line, int column) {
191   SG_LOG(SG_IO, SG_WARN, "Warning: " << message << " (" << line << ',' << column << ')');
192 }
193
194 void  FGAirportDynamicsXMLLoader::error (const char * message, int line, int column) {
195   SG_LOG(SG_IO, SG_ALERT, "Error: " << message << " (" << line << ',' << column << ')');
196 }