#ifndef _FGSCHEDULE_HXX_
#define _FGSCHEDULE_HXX_
-#define TRAFFICTOAIDIST 150.0
+#define TRAFFICTOAIDISTTOSTART 150.0
+#define TRAFFICTOAIDISTTODIE 200.0
class FGAISchedule
{
private:
string modelPath;
+ string homePort;
string livery;
string registration;
string airline;
string acType;
string m_class;
string flightType;
+ string flightIdentifier;
+ string currentDestination;
bool heavy;
FGScheduledFlightVec flights;
- float lat;
- float lon;
+ SGGeod position;
double radius;
double groundOffset;
double distanceToUser;
int AIManagerRef;
- int score;
+ double score;
+ unsigned int runCount;
+ unsigned int hits;
bool firstRun;
-
-
+ double courseToDest;
+ bool initialized;
+ bool valid;
+
+ void scheduleFlights();
+
+ /**
+ * Transition this schedule from distant mode to AI mode;
+ * create the AIAircraft (and flight plan) and register with the AIManager
+ */
+ bool createAIAircraft(FGScheduledFlight* flight, double speedKnots, time_t deptime);
+
public:
FGAISchedule(); // constructor
- FGAISchedule(string, string, string, bool, string, string, string, string, double, double,
- int, FGScheduledFlightVec); // construct & init
+ FGAISchedule(string model,
+ string livery,
+ string homePort,
+ string registration,
+ string flightId,
+ bool heavy,
+ string acType,
+ string airline,
+ string m_class,
+ string flight_type,
+ double radius,
+ double offset); // construct & init
FGAISchedule(const FGAISchedule &other); // copy constructor
~FGAISchedule(); //destructor
- bool update(time_t now);
+ bool update(time_t now, const SGVec3d& userCart);
bool init();
double getSpeed ();
//void setClosestDistanceToUser();
- void next(); // forces the schedule to move on to the next flight.
+ bool next(); // forces the schedule to move on to the next flight.
- time_t getDepartureTime () { return flights.begin()->getDepartureTime (); };
- FGAirport * getDepartureAirport () { return flights.begin()->getDepartureAirport(); };
- FGAirport * getArrivalAirport () { return flights.begin()->getArrivalAirport (); };
- int getCruiseAlt () { return flights.begin()->getCruiseAlt (); };
+ // TODO: rework these four functions
+ time_t getDepartureTime () { return (*flights.begin())->getDepartureTime (); };
+ FGAirport * getDepartureAirport () { return (*flights.begin())->getDepartureAirport(); };
+ FGAirport * getArrivalAirport () { return (*flights.begin())->getArrivalAirport (); };
+ int getCruiseAlt () { return (*flights.begin())->getCruiseAlt (); };
double getRadius () { return radius; };
double getGroundOffset () { return groundOffset;};
const string& getFlightType () { return flightType;};
const string& getAirline () { return airline; };
const string& getAircraft () { return acType; };
- const string& getCallSign () { return flights.begin()->getCallSign (); };
+ const string& getCallSign () { return (*flights.begin())->getCallSign (); };
const string& getRegistration () { return registration;};
+ const string& getFlightRules () { return (*flights.begin())->getFlightRules (); };
bool getHeavy () { return heavy; };
+ double getCourse () { return courseToDest; };
+ unsigned int getRunCount () { return runCount; };
+ unsigned int getHits () { return hits; };
+
+ void setrunCount(unsigned int count) { runCount = count; };
+ void setHits (unsigned int count) { hits = count; };
+ void setScore ();
+ double getScore () { return score; };
+ void setHeading ();
+ void assign (FGScheduledFlight *ref) { flights.push_back(ref); };
+ void setFlightType (string val ) { flightType = val; };
+ FGScheduledFlight*findAvailableFlight (const string ¤tDestination, const string &req);
// used to sort in decending order of score: I've probably found a better way to
// decending order sorting, but still need to test that.
bool operator< (const FGAISchedule &other) const { return (score > other.score); };
+ void taint() { valid = false; };
//void * getAiRef () { return AIManagerRef; };
//FGAISchedule* getAddress () { return this;};
- // More member functions follow later
};
-typedef vector<FGAISchedule > ScheduleVector;
-typedef vector<FGAISchedule >::iterator ScheduleVectorIterator;
+typedef vector<FGAISchedule*> ScheduleVector;
+typedef vector<FGAISchedule*>::iterator ScheduleVectorIterator;
+
+bool compareSchedules(FGAISchedule*a, FGAISchedule*b);
#endif