* Updated routing algorithm. Just sorting the schedules by usage heuristics doesn't work well for major multihub airlines.
* Improved groundnetwork routing algorithm. Don't uncesscarily block taxiways. Instead, use a "just-in-time" blocking system. The unblocking algorithm still needs some work, but the current version is already a major improvement over the previous version. * Some tweaks to the handover from ground to tower controller. Aircraft could refuse to take-off of even refuse to taxi onto the runway. This now seems to be solved.
This commit is contained in:
parent
34f86cd317
commit
538e632f45
6 changed files with 75 additions and 37 deletions
src
AIModel
ATC
Airports
Traffic
|
@ -941,7 +941,7 @@ bool FGAIFlightPlan::createLanding(FGAIAircraft * ac, FGAirport * apt,
|
||||||
}*/
|
}*/
|
||||||
double rolloutDistance =
|
double rolloutDistance =
|
||||||
(vTouchdownMetric * vTouchdownMetric - vTaxiMetric * vTaxiMetric) / (2 * decelMetric);
|
(vTouchdownMetric * vTouchdownMetric - vTaxiMetric * vTaxiMetric) / (2 * decelMetric);
|
||||||
cerr << " touchdown speed = " << vTouchdown << ". Rollout distance " << rolloutDistance << endl;
|
//cerr << " touchdown speed = " << vTouchdown << ". Rollout distance " << rolloutDistance << endl;
|
||||||
int nPoints = 50;
|
int nPoints = 50;
|
||||||
for (int i = 1; i < nPoints; i++) {
|
for (int i = 1; i < nPoints; i++) {
|
||||||
snprintf(buffer, 12, "landing03%d", i);
|
snprintf(buffer, 12, "landing03%d", i);
|
||||||
|
@ -983,7 +983,7 @@ bool FGAIFlightPlan::createLanding(FGAIAircraft * ac, FGAirport * apt,
|
||||||
pushBackWaypoint(wpt);
|
pushBackWaypoint(wpt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cerr << "Done. " << endl;
|
//cerr << "Done. " << endl;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
//Runway Threshold
|
//Runway Threshold
|
||||||
|
|
|
@ -187,12 +187,12 @@ void FGTrafficRecord::setPositionAndIntentions(int pos,
|
||||||
if ((*i) != pos) {
|
if ((*i) != pos) {
|
||||||
SG_LOG(SG_GENERAL, SG_ALERT,
|
SG_LOG(SG_GENERAL, SG_ALERT,
|
||||||
"Error in FGTrafficRecord::setPositionAndIntentions at " << SG_ORIGIN);
|
"Error in FGTrafficRecord::setPositionAndIntentions at " << SG_ORIGIN);
|
||||||
//cerr << "Pos : " << pos << " Curr " << *(intentions.begin()) << endl;
|
cerr << "Pos : " << pos << " Curr " << *(intentions.begin()) << endl;
|
||||||
for (intVecIterator i = intentions.begin();
|
for (intVecIterator i = intentions.begin();
|
||||||
i != intentions.end(); i++) {
|
i != intentions.end(); i++) {
|
||||||
//cerr << (*i) << " ";
|
cerr << (*i) << " ";
|
||||||
}
|
}
|
||||||
//cerr << endl;
|
cerr << endl;
|
||||||
}
|
}
|
||||||
intentions.erase(i);
|
intentions.erase(i);
|
||||||
} else {
|
} else {
|
||||||
|
@ -878,11 +878,11 @@ void FGTowerController::updateAircraftInformation(int id, double lat, double lon
|
||||||
// already exists here. So, we can simplify the current code.
|
// already exists here. So, we can simplify the current code.
|
||||||
|
|
||||||
ActiveRunwayVecIterator rwy = activeRunways.begin();
|
ActiveRunwayVecIterator rwy = activeRunways.begin();
|
||||||
if (parent->getId() == fgGetString("/sim/presets/airport-id")) {
|
//if (parent->getId() == fgGetString("/sim/presets/airport-id")) {
|
||||||
// for (rwy = activeRunways.begin(); rwy != activeRunways.end(); rwy++) {
|
// for (rwy = activeRunways.begin(); rwy != activeRunways.end(); rwy++) {
|
||||||
// rwy->printDepartureCue();
|
// rwy->printDepartureCue();
|
||||||
// }
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
rwy = activeRunways.begin();
|
rwy = activeRunways.begin();
|
||||||
while (rwy != activeRunways.end()) {
|
while (rwy != activeRunways.end()) {
|
||||||
|
@ -1318,6 +1318,7 @@ void FGStartupController::render(bool visible)
|
||||||
|
|
||||||
//for ( FGTaxiSegmentVectorIterator i = segments.begin(); i != segments.end(); i++) {
|
//for ( FGTaxiSegmentVectorIterator i = segments.begin(); i != segments.end(); i++) {
|
||||||
double dx = 0;
|
double dx = 0;
|
||||||
|
time_t now = time(NULL) + fgGetLong("/sim/time/warp");
|
||||||
for (TrafficVectorIterator i = activeTraffic.begin(); i != activeTraffic.end(); i++) {
|
for (TrafficVectorIterator i = activeTraffic.begin(); i != activeTraffic.end(); i++) {
|
||||||
if (i->isActive(300)) {
|
if (i->isActive(300)) {
|
||||||
// Handle start point
|
// Handle start point
|
||||||
|
@ -1387,7 +1388,7 @@ void FGStartupController::render(bool visible)
|
||||||
geode->addDrawable(geometry);
|
geode->addDrawable(geometry);
|
||||||
//osg::Node *custom_obj;
|
//osg::Node *custom_obj;
|
||||||
SGMaterial *mat;
|
SGMaterial *mat;
|
||||||
if (segment->hasBlock()) {
|
if (segment->hasBlock(now)) {
|
||||||
mat = matlib->find("UnidirectionalTaperRed");
|
mat = matlib->find("UnidirectionalTaperRed");
|
||||||
} else {
|
} else {
|
||||||
mat = matlib->find("UnidirectionalTaperGreen");
|
mat = matlib->find("UnidirectionalTaperGreen");
|
||||||
|
@ -1464,7 +1465,7 @@ void FGStartupController::render(bool visible)
|
||||||
geode->addDrawable(geometry);
|
geode->addDrawable(geometry);
|
||||||
//osg::Node *custom_obj;
|
//osg::Node *custom_obj;
|
||||||
SGMaterial *mat;
|
SGMaterial *mat;
|
||||||
if (segment->hasBlock()) {
|
if (segment->hasBlock(now)) {
|
||||||
mat = matlib->find("UnidirectionalTaperRed");
|
mat = matlib->find("UnidirectionalTaperRed");
|
||||||
} else {
|
} else {
|
||||||
mat = matlib->find("UnidirectionalTaperGreen");
|
mat = matlib->find("UnidirectionalTaperGreen");
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
#include <Airports/dynamics.hxx>
|
#include <Airports/dynamics.hxx>
|
||||||
|
|
||||||
#include <AIModel/AIAircraft.hxx>
|
#include <AIModel/AIAircraft.hxx>
|
||||||
|
#include <AIModel/performancedata.hxx>
|
||||||
#include <AIModel/AIFlightPlan.hxx>
|
#include <AIModel/AIFlightPlan.hxx>
|
||||||
|
|
||||||
#include <ATC/atc_mgr.hxx>
|
#include <ATC/atc_mgr.hxx>
|
||||||
|
@ -51,6 +52,7 @@
|
||||||
|
|
||||||
#include "groundnetwork.hxx"
|
#include "groundnetwork.hxx"
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* FGTaxiSegment
|
* FGTaxiSegment
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
@ -651,7 +653,11 @@ void FGGroundNetwork::announcePosition(int id,
|
||||||
rec.setPositionAndHeading(lat, lon, heading, speed, alt);
|
rec.setPositionAndHeading(lat, lon, heading, speed, alt);
|
||||||
rec.setRadius(radius); // only need to do this when creating the record.
|
rec.setRadius(radius); // only need to do this when creating the record.
|
||||||
rec.setAircraft(aircraft);
|
rec.setAircraft(aircraft);
|
||||||
|
if (leg == 2) {
|
||||||
activeTraffic.push_front(rec);
|
activeTraffic.push_front(rec);
|
||||||
|
} else {
|
||||||
|
activeTraffic.push_back(rec);
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
i->setPositionAndIntentions(currentPosition, intendedRoute);
|
i->setPositionAndIntentions(currentPosition, intendedRoute);
|
||||||
|
@ -985,6 +991,7 @@ void FGGroundNetwork::checkHoldPosition(int id, double lat,
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
time_t now = time(NULL) + fgGetLong("/sim/time/warp");
|
||||||
if (i == activeTraffic.end() || (activeTraffic.size() == 0)) {
|
if (i == activeTraffic.end() || (activeTraffic.size() == 0)) {
|
||||||
SG_LOG(SG_GENERAL, SG_ALERT,
|
SG_LOG(SG_GENERAL, SG_ALERT,
|
||||||
"AI error: Trying to access non-existing aircraft in FGGroundNetwork::checkHoldPosition at " << SG_ORIGIN);
|
"AI error: Trying to access non-existing aircraft in FGGroundNetwork::checkHoldPosition at " << SG_ORIGIN);
|
||||||
|
@ -996,7 +1003,9 @@ void FGGroundNetwork::checkHoldPosition(int id, double lat,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (current->getAircraft()->getTakeOffStatus() == 2) {
|
if (current->getAircraft()->getTakeOffStatus() == 2) {
|
||||||
|
//cerr << current->getAircraft()->getCallSign() << ". Taxi in position and hold" << endl;
|
||||||
current->setHoldPosition(false);
|
current->setHoldPosition(false);
|
||||||
|
current->clearSpeedAdjustment();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bool origStatus = current->hasHoldPosition();
|
bool origStatus = current->hasHoldPosition();
|
||||||
|
@ -1017,7 +1026,7 @@ void FGGroundNetwork::checkHoldPosition(int id, double lat,
|
||||||
} else {
|
} else {
|
||||||
nx = tx;
|
nx = tx;
|
||||||
}
|
}
|
||||||
if (tx->hasBlock() || nx->hasBlock() ) {
|
if (tx->hasBlock(now) || nx->hasBlock(now) ) {
|
||||||
current->setHoldPosition(true);
|
current->setHoldPosition(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1099,7 +1108,6 @@ void FGGroundNetwork::checkHoldPosition(int id, double lat,
|
||||||
bool currStatus = current->hasHoldPosition();
|
bool currStatus = current->hasHoldPosition();
|
||||||
current->setHoldPosition(origStatus);
|
current->setHoldPosition(origStatus);
|
||||||
// Either a Hold Position or a resume taxi transmission has been issued
|
// Either a Hold Position or a resume taxi transmission has been issued
|
||||||
time_t now = time(NULL) + fgGetLong("/sim/time/warp");
|
|
||||||
if ((now - lastTransmission) > 2) {
|
if ((now - lastTransmission) > 2) {
|
||||||
available = true;
|
available = true;
|
||||||
}
|
}
|
||||||
|
@ -1348,6 +1356,7 @@ void FGGroundNetwork::render(bool visible)
|
||||||
FGScenery * local_scenery = globals->get_scenery();
|
FGScenery * local_scenery = globals->get_scenery();
|
||||||
double elevation_meters = 0.0;
|
double elevation_meters = 0.0;
|
||||||
double elevation_feet = 0.0;
|
double elevation_feet = 0.0;
|
||||||
|
time_t now = time(NULL) + fgGetLong("/sim/time/warp");
|
||||||
//for ( FGTaxiSegmentVectorIterator i = segments.begin(); i != segments.end(); i++) {
|
//for ( FGTaxiSegmentVectorIterator i = segments.begin(); i != segments.end(); i++) {
|
||||||
double dx = 0;
|
double dx = 0;
|
||||||
for (TrafficVectorIterator i = activeTraffic.begin(); i != activeTraffic.end(); i++) {
|
for (TrafficVectorIterator i = activeTraffic.begin(); i != activeTraffic.end(); i++) {
|
||||||
|
@ -1417,7 +1426,7 @@ void FGGroundNetwork::render(bool visible)
|
||||||
geode->addDrawable(geometry);
|
geode->addDrawable(geometry);
|
||||||
//osg::Node *custom_obj;
|
//osg::Node *custom_obj;
|
||||||
SGMaterial *mat;
|
SGMaterial *mat;
|
||||||
if (segments[pos]->hasBlock()) {
|
if (segments[pos]->hasBlock(now)) {
|
||||||
mat = matlib->find("UnidirectionalTaperRed");
|
mat = matlib->find("UnidirectionalTaperRed");
|
||||||
} else {
|
} else {
|
||||||
mat = matlib->find("UnidirectionalTaperGreen");
|
mat = matlib->find("UnidirectionalTaperGreen");
|
||||||
|
@ -1491,7 +1500,7 @@ void FGGroundNetwork::render(bool visible)
|
||||||
geode->addDrawable(geometry);
|
geode->addDrawable(geometry);
|
||||||
//osg::Node *custom_obj;
|
//osg::Node *custom_obj;
|
||||||
SGMaterial *mat;
|
SGMaterial *mat;
|
||||||
if (segments[k]->hasBlock()) {
|
if (segments[k]->hasBlock(now)) {
|
||||||
mat = matlib->find("UnidirectionalTaperRed");
|
mat = matlib->find("UnidirectionalTaperRed");
|
||||||
} else {
|
} else {
|
||||||
mat = matlib->find("UnidirectionalTaperGreen");
|
mat = matlib->find("UnidirectionalTaperGreen");
|
||||||
|
@ -1516,8 +1525,9 @@ string FGGroundNetwork::getName() {
|
||||||
|
|
||||||
void FGGroundNetwork::update(double dt)
|
void FGGroundNetwork::update(double dt)
|
||||||
{
|
{
|
||||||
|
time_t now = time(NULL) + fgGetLong("/sim/time/warp");
|
||||||
for (FGTaxiSegmentVectorIterator tsi = segments.begin(); tsi != segments.end(); tsi++) {
|
for (FGTaxiSegmentVectorIterator tsi = segments.begin(); tsi != segments.end(); tsi++) {
|
||||||
(*tsi)->unblock();
|
(*tsi)->unblock(now);
|
||||||
}
|
}
|
||||||
int priority = 1;
|
int priority = 1;
|
||||||
//sort(activeTraffic.begin(), activeTraffic.end(), compare_trafficrecords);
|
//sort(activeTraffic.begin(), activeTraffic.end(), compare_trafficrecords);
|
||||||
|
@ -1527,6 +1537,8 @@ void FGGroundNetwork::update(double dt)
|
||||||
i != parent->getDynamics()->getStartupController()->getActiveTraffic().end(); i++) {
|
i != parent->getDynamics()->getStartupController()->getActiveTraffic().end(); i++) {
|
||||||
i->allowPushBack();
|
i->allowPushBack();
|
||||||
i->setPriority(priority++);
|
i->setPriority(priority++);
|
||||||
|
// in meters per second;
|
||||||
|
double vTaxi = (i->getAircraft()->getPerformance()->vTaxi() * SG_NM_TO_METER) / 3600;
|
||||||
if (i->isActive(60)) {
|
if (i->isActive(60)) {
|
||||||
|
|
||||||
// Check for all active aircraft whether it's current pos segment is
|
// Check for all active aircraft whether it's current pos segment is
|
||||||
|
@ -1540,7 +1552,7 @@ void FGGroundNetwork::update(double dt)
|
||||||
for (intVecIterator k = i->getIntentions().begin(); k != i->getIntentions().end(); k++) {
|
for (intVecIterator k = i->getIntentions().begin(); k != i->getIntentions().end(); k++) {
|
||||||
if ((*k) == posReverse) {
|
if ((*k) == posReverse) {
|
||||||
i->denyPushBack();
|
i->denyPushBack();
|
||||||
segments[posReverse-1]->block();
|
segments[posReverse-1]->block(now);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1548,13 +1560,15 @@ void FGGroundNetwork::update(double dt)
|
||||||
}
|
}
|
||||||
// if the current aircraft is still allowed to pushback, we can start reserving a route for if by blocking all the entry taxiways.
|
// if the current aircraft is still allowed to pushback, we can start reserving a route for if by blocking all the entry taxiways.
|
||||||
if (i->pushBackAllowed()) {
|
if (i->pushBackAllowed()) {
|
||||||
|
double length = 0;
|
||||||
int pos = i->getCurrentPosition();
|
int pos = i->getCurrentPosition();
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
FGTaxiSegment *seg = segments[pos-1];
|
FGTaxiSegment *seg = segments[pos-1];
|
||||||
FGTaxiNode *node = seg->getEnd();
|
FGTaxiNode *node = seg->getEnd();
|
||||||
|
length = seg->getLength();
|
||||||
for (FGTaxiSegmentVectorIterator tsi = segments.begin(); tsi != segments.end(); tsi++) {
|
for (FGTaxiSegmentVectorIterator tsi = segments.begin(); tsi != segments.end(); tsi++) {
|
||||||
if (((*tsi)->getEnd() == node) && ((*tsi) != seg)) {
|
if (((*tsi)->getEnd() == node) && ((*tsi) != seg)) {
|
||||||
(*tsi)->block();
|
(*tsi)->block(now);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1563,9 +1577,11 @@ void FGGroundNetwork::update(double dt)
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
FGTaxiSegment *seg = segments[pos-1];
|
FGTaxiSegment *seg = segments[pos-1];
|
||||||
FGTaxiNode *node = seg->getEnd();
|
FGTaxiNode *node = seg->getEnd();
|
||||||
|
length += seg->getLength();
|
||||||
|
time_t blockTime = now + (length / vTaxi);
|
||||||
for (FGTaxiSegmentVectorIterator tsi = segments.begin(); tsi != segments.end(); tsi++) {
|
for (FGTaxiSegmentVectorIterator tsi = segments.begin(); tsi != segments.end(); tsi++) {
|
||||||
if (((*tsi)->getEnd() == node) && ((*tsi) != seg)) {
|
if (((*tsi)->getEnd() == node) && ((*tsi) != seg)) {
|
||||||
(*tsi)->block();
|
(*tsi)->block(blockTime-30);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1574,10 +1590,13 @@ void FGGroundNetwork::update(double dt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (TrafficVectorIterator i = activeTraffic.begin(); i != activeTraffic.end(); i++) {
|
for (TrafficVectorIterator i = activeTraffic.begin(); i != activeTraffic.end(); i++) {
|
||||||
|
double length = 0;
|
||||||
|
double vTaxi = (i->getAircraft()->getPerformance()->vTaxi() * SG_NM_TO_METER) / 3600;
|
||||||
i->setPriority(priority++);
|
i->setPriority(priority++);
|
||||||
int pos = i->getCurrentPosition();
|
int pos = i->getCurrentPosition();
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
if (segments[pos-1]->hasBlock()) {
|
length = segments[pos-1]->getLength();
|
||||||
|
if (segments[pos-1]->hasBlock(now)) {
|
||||||
//SG_LOG(SG_GENERAL, SG_ALERT, "Taxiway incursion for AI aircraft" << i->getAircraft()->getCallSign());
|
//SG_LOG(SG_GENERAL, SG_ALERT, "Taxiway incursion for AI aircraft" << i->getAircraft()->getCallSign());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1586,7 +1605,7 @@ void FGGroundNetwork::update(double dt)
|
||||||
for (ivi = i->getIntentions().begin(); ivi != i->getIntentions().end(); ivi++) {
|
for (ivi = i->getIntentions().begin(); ivi != i->getIntentions().end(); ivi++) {
|
||||||
int segIndex = (*ivi);
|
int segIndex = (*ivi);
|
||||||
if (segIndex > 0) {
|
if (segIndex > 0) {
|
||||||
if (segments[segIndex-1]->hasBlock())
|
if (segments[segIndex-1]->hasBlock(now))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1596,9 +1615,11 @@ void FGGroundNetwork::update(double dt)
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
FGTaxiSegment *seg = segments[pos-1];
|
FGTaxiSegment *seg = segments[pos-1];
|
||||||
FGTaxiNode *node = seg->getEnd();
|
FGTaxiNode *node = seg->getEnd();
|
||||||
|
length += seg->getLength();
|
||||||
for (FGTaxiSegmentVectorIterator tsi = segments.begin(); tsi != segments.end(); tsi++) {
|
for (FGTaxiSegmentVectorIterator tsi = segments.begin(); tsi != segments.end(); tsi++) {
|
||||||
if (((*tsi)->getEnd() == node) && ((*tsi) != seg)) {
|
if (((*tsi)->getEnd() == node) && ((*tsi) != seg)) {
|
||||||
(*tsi)->block();
|
time_t blockTime = now + (length / vTaxi);
|
||||||
|
(*tsi)->block(blockTime - 30);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,7 +67,7 @@ private:
|
||||||
SGGeod center;
|
SGGeod center;
|
||||||
bool isActive;
|
bool isActive;
|
||||||
bool isPushBackRoute;
|
bool isPushBackRoute;
|
||||||
bool isBlocked;
|
time_t isBlocked;
|
||||||
FGTaxiNode *start;
|
FGTaxiNode *start;
|
||||||
FGTaxiNode *end;
|
FGTaxiNode *end;
|
||||||
int index;
|
int index;
|
||||||
|
@ -144,14 +144,21 @@ public:
|
||||||
isPushBackRoute = val;
|
isPushBackRoute = val;
|
||||||
};
|
};
|
||||||
void setDimensions(double elevation);
|
void setDimensions(double elevation);
|
||||||
void block() {
|
void block(time_t time) {
|
||||||
isBlocked = true;
|
if (isBlocked) {
|
||||||
|
if (time < isBlocked) {
|
||||||
|
isBlocked = time;
|
||||||
}
|
}
|
||||||
void unblock() {
|
} else {
|
||||||
isBlocked = false;
|
isBlocked = time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void unblock(time_t now) {
|
||||||
|
if ((now - isBlocked) > 60)
|
||||||
|
isBlocked = 0;
|
||||||
};
|
};
|
||||||
bool hasBlock() {
|
bool hasBlock(time_t now) {
|
||||||
return isBlocked;
|
return isBlocked ? (isBlocked < now) : 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
FGTaxiNode * getEnd() {
|
FGTaxiNode * getEnd() {
|
||||||
|
|
|
@ -374,18 +374,24 @@ void FGAISchedule::scheduleFlights(time_t now)
|
||||||
if (!flights.empty()) {
|
if (!flights.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
string startingPort;
|
//string startingPort;
|
||||||
string userPort = fgGetString("/sim/presets/airport-id");
|
string userPort = fgGetString("/sim/presets/airport-id");
|
||||||
SG_LOG(SG_GENERAL, SG_BULK, "Scheduling Flights for : " << modelPath << " " << registration << " " << homePort);
|
SG_LOG(SG_GENERAL, SG_BULK, "Scheduling Flights for : " << modelPath << " " << registration << " " << homePort);
|
||||||
FGScheduledFlight *flight = NULL;
|
FGScheduledFlight *flight = NULL;
|
||||||
do {
|
do {
|
||||||
|
if (currentDestination.empty()) {
|
||||||
|
flight = findAvailableFlight(userPort, flightIdentifier, now, (now+6400));
|
||||||
|
if (!flight)
|
||||||
flight = findAvailableFlight(currentDestination, flightIdentifier);
|
flight = findAvailableFlight(currentDestination, flightIdentifier);
|
||||||
|
} else {
|
||||||
|
flight = findAvailableFlight(currentDestination, flightIdentifier);
|
||||||
|
}
|
||||||
if (!flight) {
|
if (!flight) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
//if (startingPort.empty()) {
|
||||||
|
// startingPort = flight->getDepartureAirport()->getId();
|
||||||
|
//}
|
||||||
currentDestination = flight->getArrivalAirport()->getId();
|
currentDestination = flight->getArrivalAirport()->getId();
|
||||||
//cerr << "Current destination " << currentDestination << endl;
|
//cerr << "Current destination " << currentDestination << endl;
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
|
@ -393,7 +399,10 @@ void FGAISchedule::scheduleFlights(time_t now)
|
||||||
//cerr << "Scheduled " << registration << " " << score << " for Flight "
|
//cerr << "Scheduled " << registration << " " << score << " for Flight "
|
||||||
// << flight-> getCallSign() << " from " << departurePort << " to " << currentDestination << endl;
|
// << flight-> getCallSign() << " from " << departurePort << " to " << currentDestination << endl;
|
||||||
if (userPort == departurePort) {
|
if (userPort == departurePort) {
|
||||||
|
lastRun = 1;
|
||||||
hits++;
|
hits++;
|
||||||
|
} else {
|
||||||
|
lastRun = 0;
|
||||||
}
|
}
|
||||||
//runCount++;
|
//runCount++;
|
||||||
initialized = true;
|
initialized = true;
|
||||||
|
|
|
@ -128,7 +128,7 @@ class FGAISchedule
|
||||||
// decending order sorting, but still need to test that.
|
// decending order sorting, but still need to test that.
|
||||||
bool operator< (const FGAISchedule &other) const;
|
bool operator< (const FGAISchedule &other) const;
|
||||||
void taint() { valid = false; };
|
void taint() { valid = false; };
|
||||||
int getLastUsed() { return (int) valid;};
|
int getLastUsed() { return lastRun; };
|
||||||
void setLastUsed(unsigned int val) {lastRun = val; };
|
void setLastUsed(unsigned int val) {lastRun = val; };
|
||||||
//void * getAiRef () { return AIManagerRef; };
|
//void * getAiRef () { return AIManagerRef; };
|
||||||
//FGAISchedule* getAddress () { return this;};
|
//FGAISchedule* getAddress () { return this;};
|
||||||
|
|
Loading…
Add table
Reference in a new issue