]> git.mxchange.org Git - flightgear.git/blobdiff - src/Traffic/SchedFlight.cxx
Bugfix - untie property.
[flightgear.git] / src / Traffic / SchedFlight.cxx
index b05c7a6a8f4118932b352e72d1e1d5cd4c42fc36..5575f6ee090f924b0f5aace94b140bced3cb5c17 100644 (file)
@@ -14,7 +14,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  *
  *
  **************************************************************************/
  *
  * TODO:
  * - Check the code for known portability issues
- * - Find an alternative for the depricated Point3D class
  *
  *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
 #include <stdlib.h>
 #include <time.h>
 #include <iostream>
 #include <string>
 #include <vector>
 
-#include <plib/sg.h>
-
 #include <simgear/compiler.h>
-#include <simgear/math/polar3d.hxx>
-#include <simgear/math/sg_geodesy.hxx>
 #include <simgear/props/props.hxx>
 #include <simgear/route/waypoint.hxx>
 #include <simgear/structure/subsystem_mgr.hxx>
 
 FGScheduledFlight::FGScheduledFlight()
 {
+   initialized = false;
+   available = true;
 }
   
 FGScheduledFlight::FGScheduledFlight(const FGScheduledFlight &other)
 {
-  callsign        = other.callsign;
-  fltRules        = other.fltRules;
-  departurePort   = other.departurePort;
-  departureTime   = other.departureTime;
-  cruiseAltitude  = other.cruiseAltitude;
-  arrivalPort     = other.arrivalPort;
-  arrivalTime     = other.arrivalTime;
-  repeatPeriod    = other.repeatPeriod;
-  initialized     = other.initialized;
+  callsign          = other.callsign;
+  fltRules          = other.fltRules;
+  departurePort     = other.departurePort;
+  depId             = other.depId;
+  arrId             = other.arrId;
+  departureTime     = other.departureTime;
+  cruiseAltitude    = other.cruiseAltitude;
+  arrivalPort       = other.arrivalPort;
+  arrivalTime       = other.arrivalTime;
+  repeatPeriod      = other.repeatPeriod;
+  initialized       = other.initialized;
+  requiredAircraft  = other.requiredAircraft;
+  available         = other.available;
 }
 
-FGScheduledFlight::FGScheduledFlight(string cs,
-                  string fr,
-                  string depPrt,
-                  string arrPrt,
+FGScheduledFlight::FGScheduledFlight(const string& cs,
+                  const string& fr,
+                  const string& depPrt,
+                  const string& arrPrt,
                   int cruiseAlt,
-                  string deptime,
-                  string arrtime,
-                  string rep)
+                  const string& deptime,
+                  const string& arrtime,
+                  const string& rep,
+                   const string& reqAC)
 {
   callsign          = cs;
   fltRules          = fr;
-  departurePort.id  = depPrt;
-  arrivalPort.id    = arrPrt;
+  //departurePort.setId(depPrt);
+  //arrivalPort.setId(arrPrt);
+  depId = depPrt;
+  arrId = arrPrt;
+  //cerr << "Constructor: departure " << depId << ". arrival " << arrId << endl;
   //departureTime     = processTimeString(deptime);
   //arrivalTime       = processTimeString(arrtime);
   cruiseAltitude    = cruiseAlt;
+  requiredAircraft  = reqAC;
 
   // Process the repeat period string
   if (rep.find("WEEK",0) != string::npos)
@@ -117,19 +128,22 @@ FGScheduledFlight::FGScheduledFlight(string cs,
     }
   else
     {
-      cerr << "Unknown repeat period" << endl;
-      exit(1);
+      repeatPeriod = 365*24*60*60;
+      SG_LOG( SG_GENERAL, SG_ALERT, "Unknown repeat period in flight plan "
+                                    "of flight '" << cs << "': " << rep );
     }
 
   // What we still need to do is preprocess the departure and
   // arrival times. 
   departureTime = processTimeString(deptime);
   arrivalTime   = processTimeString(arrtime);
+  //departureTime += rand() % 300; // Make sure departure times are not limited to 5 minute increments.
   if (departureTime > arrivalTime)
     {
       departureTime -= repeatPeriod;
     }
   initialized = false;
+  available   = true;
 }
 
 
@@ -137,11 +151,10 @@ FGScheduledFlight:: ~FGScheduledFlight()
 {
 }
 
-time_t FGScheduledFlight::processTimeString(string theTime)
+time_t FGScheduledFlight::processTimeString(const string& theTime)
 {
   int weekday;
   int timeOffsetInDays;
-  int targetDate;
   int targetHour;
   int targetMinute;
   int targetSecond;
@@ -165,6 +178,7 @@ time_t FGScheduledFlight::processTimeString(string theTime)
     {
       timeOffsetInDays = 0;
     }
+  // TODO: verify status of each token.
   targetHour   = atoi(timeCopy.substr(0,2).c_str());
   targetMinute = atoi(timeCopy.substr(3,5).c_str());
   targetSecond = atoi(timeCopy.substr(6,8).c_str());
@@ -225,7 +239,10 @@ FGAirport *FGScheduledFlight::getDepartureAirport()
     {
       initializeAirports();
     }
-  return &departurePort;
+  if (initialized)
+    return departurePort;
+  else
+    return 0;
 }
 FGAirport * FGScheduledFlight::getArrivalAirport  ()
 {
@@ -233,7 +250,10 @@ FGAirport * FGScheduledFlight::getArrivalAirport  ()
     {
       initializeAirports();
     }
-  return &arrivalPort;
+   if (initialized)
+     return arrivalPort;
+   else
+     return 0;
 }
 
 // Upon the first time of requesting airport information
@@ -243,15 +263,30 @@ FGAirport * FGScheduledFlight::getArrivalAirport  ()
 // but we should improve that. The best idea is probably to cancel
 // this flight entirely by removing it from the schedule, if one
 // of the airports cannot be found. 
-void FGScheduledFlight::initializeAirports()
+bool FGScheduledFlight::initializeAirports()
 {
-  if(!(fgFindAirportID(arrivalPort.id, &arrivalPort  )))
+  //cerr << "Initializing using : " << depId << " " << arrId << endl;
+  departurePort = FGAirport::findByIdent(depId);
+  if(departurePort == NULL)
     {
-      //cerr << ": Could not find " << arrivalPort.id << endl; 
+      SG_LOG( SG_GENERAL, SG_WARN, "Traffic manager could not find departure airport : " << depId);
+      return false;
     }
-  if(!(fgFindAirportID(departurePort.id, &departurePort)))
+  arrivalPort = FGAirport::findByIdent(arrId);
+  if(arrivalPort == NULL)
     {
-      //cerr << ": Could not find " << departurePort.id << endl;
+      SG_LOG( SG_GENERAL, SG_WARN, "Traffic manager could not find arrival airport   : " << arrId);
+      return false;
     }
+
+  //cerr << "Found : " << departurePort->getId() << endl;
+  //cerr << "Found : " << arrivalPort->getId() << endl;
   initialized = true;
+  return true;
 }
+
+
+bool compareScheduledFlights(FGScheduledFlight *a, FGScheduledFlight *b) 
+{ 
+  return (*a) < (*b); 
+};