Merge branch 'next' of git://gitorious.org/fg/flightgear into next
This commit is contained in:
commit
4175619392
6 changed files with 2020 additions and 1882 deletions
|
@ -101,6 +101,80 @@ using namespace osg;
|
||||||
static osg::ref_ptr<osgViewer::Viewer> viewer;
|
static osg::ref_ptr<osgViewer::Viewer> viewer;
|
||||||
static osg::ref_ptr<osg::Camera> mainCamera;
|
static osg::ref_ptr<osg::Camera> mainCamera;
|
||||||
|
|
||||||
|
static void setStereoMode( const char * mode )
|
||||||
|
{
|
||||||
|
DisplaySettings::StereoMode stereoMode;
|
||||||
|
bool stereoOn = true;
|
||||||
|
|
||||||
|
if (strcmp(mode,"QUAD_BUFFER")==0)
|
||||||
|
{
|
||||||
|
stereoMode = DisplaySettings::QUAD_BUFFER;
|
||||||
|
}
|
||||||
|
else if (strcmp(mode,"ANAGLYPHIC")==0)
|
||||||
|
{
|
||||||
|
stereoMode = DisplaySettings::ANAGLYPHIC;
|
||||||
|
}
|
||||||
|
else if (strcmp(mode,"HORIZONTAL_SPLIT")==0)
|
||||||
|
{
|
||||||
|
stereoMode = DisplaySettings::HORIZONTAL_SPLIT;
|
||||||
|
}
|
||||||
|
else if (strcmp(mode,"VERTICAL_SPLIT")==0)
|
||||||
|
{
|
||||||
|
stereoMode = DisplaySettings::VERTICAL_SPLIT;
|
||||||
|
}
|
||||||
|
else if (strcmp(mode,"LEFT_EYE")==0)
|
||||||
|
{
|
||||||
|
stereoMode = DisplaySettings::LEFT_EYE;
|
||||||
|
}
|
||||||
|
else if (strcmp(mode,"RIGHT_EYE")==0)
|
||||||
|
{
|
||||||
|
stereoMode = DisplaySettings::RIGHT_EYE;
|
||||||
|
}
|
||||||
|
else if (strcmp(mode,"HORIZONTAL_INTERLACE")==0)
|
||||||
|
{
|
||||||
|
stereoMode = DisplaySettings::HORIZONTAL_INTERLACE;
|
||||||
|
}
|
||||||
|
else if (strcmp(mode,"VERTICAL_INTERLACE")==0)
|
||||||
|
{
|
||||||
|
stereoMode = DisplaySettings::VERTICAL_INTERLACE;
|
||||||
|
}
|
||||||
|
else if (strcmp(mode,"CHECKERBOARD")==0)
|
||||||
|
{
|
||||||
|
stereoMode = DisplaySettings::CHECKERBOARD;
|
||||||
|
} else {
|
||||||
|
stereoOn = false;
|
||||||
|
}
|
||||||
|
DisplaySettings::instance()->setStereo( stereoOn );
|
||||||
|
DisplaySettings::instance()->setStereoMode( stereoMode );
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char * getStereoMode()
|
||||||
|
{
|
||||||
|
DisplaySettings::StereoMode stereoMode = DisplaySettings::instance()->getStereoMode();
|
||||||
|
bool stereoOn = DisplaySettings::instance()->getStereo();
|
||||||
|
if( !stereoOn ) return "OFF";
|
||||||
|
if( stereoMode == DisplaySettings::QUAD_BUFFER ) {
|
||||||
|
return "QUAD_BUFFER";
|
||||||
|
} else if( stereoMode == DisplaySettings::ANAGLYPHIC ) {
|
||||||
|
return "ANAGLYPHIC";
|
||||||
|
} else if( stereoMode == DisplaySettings::HORIZONTAL_SPLIT ) {
|
||||||
|
return "HORIZONTAL_SPLIT";
|
||||||
|
} else if( stereoMode == DisplaySettings::VERTICAL_SPLIT ) {
|
||||||
|
return "VERTICAL_SPLIT";
|
||||||
|
} else if( stereoMode == DisplaySettings::LEFT_EYE ) {
|
||||||
|
return "LEFT_EYE";
|
||||||
|
} else if( stereoMode == DisplaySettings::RIGHT_EYE ) {
|
||||||
|
return "RIGHT_EYE";
|
||||||
|
} else if( stereoMode == DisplaySettings::HORIZONTAL_INTERLACE ) {
|
||||||
|
return "HORIZONTAL_INTERLACE";
|
||||||
|
} else if( stereoMode == DisplaySettings::VERTICAL_INTERLACE ) {
|
||||||
|
return "VERTICAL_INTERLACE";
|
||||||
|
} else if( stereoMode == DisplaySettings::CHECKERBOARD ) {
|
||||||
|
return "CHECKERBOARD";
|
||||||
|
}
|
||||||
|
return "OFF";
|
||||||
|
}
|
||||||
|
|
||||||
void fgOSOpenWindow(bool stencil)
|
void fgOSOpenWindow(bool stencil)
|
||||||
{
|
{
|
||||||
viewer = new osgViewer::Viewer;
|
viewer = new osgViewer::Viewer;
|
||||||
|
@ -175,8 +249,19 @@ void fgOSOpenWindow(bool stencil)
|
||||||
viewer->setSceneData(new osg::Group);
|
viewer->setSceneData(new osg::Group);
|
||||||
globals->get_renderer()->setViewer(viewer.get());
|
globals->get_renderer()->setViewer(viewer.get());
|
||||||
CameraGroup::setDefault(cameraGroup);
|
CameraGroup::setDefault(cameraGroup);
|
||||||
|
|
||||||
|
DisplaySettings * displaySettings = DisplaySettings::instance();
|
||||||
|
fgTie("/sim/rendering/osg-displaysettings/eye-separation", displaySettings, &DisplaySettings::getEyeSeparation, &DisplaySettings::setEyeSeparation );
|
||||||
|
fgTie("/sim/rendering/osg-displaysettings/screen-distance", displaySettings, &DisplaySettings::getScreenDistance, &DisplaySettings::setScreenDistance );
|
||||||
|
fgTie("/sim/rendering/osg-displaysettings/screen-width", displaySettings, &DisplaySettings::getScreenWidth, &DisplaySettings::setScreenWidth );
|
||||||
|
fgTie("/sim/rendering/osg-displaysettings/screen-height", displaySettings, &DisplaySettings::getScreenHeight, &DisplaySettings::setScreenHeight );
|
||||||
|
fgTie("/sim/rendering/osg-displaysettings/stereo-mode", getStereoMode, setStereoMode );
|
||||||
|
fgTie("/sim/rendering/osg-displaysettings/double-buffer", displaySettings, &DisplaySettings::getDoubleBuffer, &DisplaySettings::setDoubleBuffer );
|
||||||
|
fgTie("/sim/rendering/osg-displaysettings/depth-buffer", displaySettings, &DisplaySettings::getDepthBuffer, &DisplaySettings::setDepthBuffer );
|
||||||
|
fgTie("/sim/rendering/osg-displaysettings/rgb", displaySettings, &DisplaySettings::getRGB, &DisplaySettings::setRGB );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int status = 0;
|
static int status = 0;
|
||||||
|
|
||||||
void fgOSExit(int code)
|
void fgOSExit(int code)
|
||||||
|
|
|
@ -364,10 +364,12 @@ void FGAISchedule::scheduleFlights()
|
||||||
currentDestination = flight->getArrivalAirport()->getId();
|
currentDestination = flight->getArrivalAirport()->getId();
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
string departurePort = flight->getDepartureAirport()->getId();
|
string departurePort = flight->getDepartureAirport()->getId();
|
||||||
|
//cerr << "Scheduled " << registration << " " << score << " for Flight "
|
||||||
|
// << flight-> getCallSign() << " from " << departurePort << " to " << currentDestination << endl;
|
||||||
if (fgGetString("/sim/presets/airport-id") == departurePort) {
|
if (fgGetString("/sim/presets/airport-id") == departurePort) {
|
||||||
hits++;
|
hits++;
|
||||||
}
|
}
|
||||||
runCount++;
|
//runCount++;
|
||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -508,6 +510,7 @@ void FGAISchedule::setScore ()
|
||||||
score = 0.0;
|
score = 0.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
runCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool compareSchedules(FGAISchedule*a, FGAISchedule*b)
|
bool compareSchedules(FGAISchedule*a, FGAISchedule*b)
|
||||||
|
|
|
@ -107,7 +107,8 @@ FGTrafficManager:: ~FGTrafficManager()
|
||||||
cachefile.open(cacheData.str().c_str());
|
cachefile.open(cacheData.str().c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (ScheduleVectorIterator sched = scheduledAircraft.begin(); sched != scheduledAircraft.end(); sched++) {
|
for (ScheduleVectorIterator sched = scheduledAircraft.begin();
|
||||||
|
sched != scheduledAircraft.end(); sched++) {
|
||||||
if (saveData) {
|
if (saveData) {
|
||||||
cachefile << (*sched)->getRegistration() << " "
|
cachefile << (*sched)->getRegistration() << " "
|
||||||
<< (*sched)->getRunCount() << " "
|
<< (*sched)->getRunCount() << " "
|
||||||
|
@ -127,20 +128,19 @@ void FGTrafficManager::init()
|
||||||
{
|
{
|
||||||
ulDir *d, *d2;
|
ulDir *d, *d2;
|
||||||
ulDirEnt *dent, *dent2;
|
ulDirEnt *dent, *dent2;
|
||||||
SGPath aircraftDir = globals->get_fg_root();
|
|
||||||
SGPath path = aircraftDir;
|
|
||||||
heuristicsVector heuristics;
|
heuristicsVector heuristics;
|
||||||
HeuristicMap heurMap;
|
HeuristicMap heurMap;
|
||||||
|
|
||||||
|
if (string(fgGetString("/sim/traffic-manager/datafile")) == string("")) {
|
||||||
|
SGPath aircraftDir = globals->get_fg_root();
|
||||||
|
SGPath path = aircraftDir;
|
||||||
|
|
||||||
aircraftDir.append("AI/Traffic");
|
aircraftDir.append("AI/Traffic");
|
||||||
if ((d = ulOpenDir(aircraftDir.c_str())) != NULL)
|
if ((d = ulOpenDir(aircraftDir.c_str())) != NULL) {
|
||||||
{
|
|
||||||
while ((dent = ulReadDir(d)) != NULL) {
|
while ((dent = ulReadDir(d)) != NULL) {
|
||||||
if (string(dent->d_name) != string(".") &&
|
if (string(dent->d_name) != string(".") &&
|
||||||
string(dent->d_name) != string("..") &&
|
string(dent->d_name) != string("..") && dent->d_isdir) {
|
||||||
dent->d_isdir)
|
|
||||||
{
|
|
||||||
SGPath currACDir = aircraftDir;
|
SGPath currACDir = aircraftDir;
|
||||||
currACDir.append(dent->d_name);
|
currACDir.append(dent->d_name);
|
||||||
if ((d2 = ulOpenDir(currACDir.c_str())) == NULL)
|
if ((d2 = ulOpenDir(currACDir.c_str())) == NULL)
|
||||||
|
@ -148,11 +148,12 @@ void FGTrafficManager::init()
|
||||||
while ((dent2 = ulReadDir(d2)) != NULL) {
|
while ((dent2 = ulReadDir(d2)) != NULL) {
|
||||||
SGPath currFile = currACDir;
|
SGPath currFile = currACDir;
|
||||||
currFile.append(dent2->d_name);
|
currFile.append(dent2->d_name);
|
||||||
if (currFile.extension() == string("xml"))
|
if (currFile.extension() == string("xml")) {
|
||||||
{
|
|
||||||
SGPath currFile = currACDir;
|
SGPath currFile = currACDir;
|
||||||
currFile.append(dent2->d_name);
|
currFile.append(dent2->d_name);
|
||||||
SG_LOG(SG_GENERAL, SG_DEBUG, "Scanning " << currFile.str() << " for traffic");
|
SG_LOG(SG_GENERAL, SG_DEBUG,
|
||||||
|
"Scanning " << currFile.
|
||||||
|
str() << " for traffic");
|
||||||
readXML(currFile.str(), *this);
|
readXML(currFile.str(), *this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -161,6 +162,25 @@ void FGTrafficManager::init()
|
||||||
}
|
}
|
||||||
ulCloseDir(d);
|
ulCloseDir(d);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
fgSetBool("/sim/traffic-manager/heuristics", false);
|
||||||
|
SGPath path = string(fgGetString("/sim/traffic-manager/datafile"));
|
||||||
|
string ext = path.extension();
|
||||||
|
if (path.extension() == "xml") {
|
||||||
|
if (path.exists()) {
|
||||||
|
readXML(path.str(), *this);
|
||||||
|
}
|
||||||
|
} else if (path.extension() == "conf") {
|
||||||
|
if (path.exists()) {
|
||||||
|
readTimeTableFromFile(path);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SG_LOG(SG_GENERAL, SG_ALERT,
|
||||||
|
"Unknown data format " << path.str()
|
||||||
|
<< " for traffic");
|
||||||
|
}
|
||||||
|
//exit(1);
|
||||||
|
}
|
||||||
if (fgGetBool("/sim/traffic-manager/heuristics")) {
|
if (fgGetBool("/sim/traffic-manager/heuristics")) {
|
||||||
//cerr << "Processing Heuristics" << endl;
|
//cerr << "Processing Heuristics" << endl;
|
||||||
// Load the heuristics data
|
// Load the heuristics data
|
||||||
|
@ -176,38 +196,46 @@ void FGTrafficManager::init()
|
||||||
if (cacheData.exists()) {
|
if (cacheData.exists()) {
|
||||||
ifstream data(cacheData.c_str());
|
ifstream data(cacheData.c_str());
|
||||||
while (1) {
|
while (1) {
|
||||||
Heuristic *h = new Heuristic;
|
Heuristic h; // = new Heuristic;
|
||||||
data >> h->registration >> h->runCount >> h->hits;
|
data >> h.registration >> h.runCount >> h.hits;
|
||||||
if (data.eof())
|
if (data.eof())
|
||||||
break;
|
break;
|
||||||
heurMap[h->registration] = h;
|
HeuristicMapIterator itr = heurMap.find(h.registration);
|
||||||
|
if (itr != heurMap.end()) {
|
||||||
|
SG_LOG(SG_GENERAL, SG_WARN,"Traffic Manager Warning: found duplicate tailnumber " <<
|
||||||
|
h.registration << " for AI aircraft");
|
||||||
|
}
|
||||||
|
heurMap[h.registration] = h;
|
||||||
heuristics.push_back(h);
|
heuristics.push_back(h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (currAircraft = scheduledAircraft.begin();
|
for (currAircraft = scheduledAircraft.begin();
|
||||||
currAircraft != scheduledAircraft.end();
|
currAircraft != scheduledAircraft.end(); currAircraft++) {
|
||||||
currAircraft++) {
|
|
||||||
string registration = (*currAircraft)->getRegistration();
|
string registration = (*currAircraft)->getRegistration();
|
||||||
HeuristicMapIterator itr = heurMap.find(registration);
|
HeuristicMapIterator itr = heurMap.find(registration);
|
||||||
//cerr << "Processing heuristics for" << (*currAircraft)->getRegistration() << endl;
|
//cerr << "Processing heuristics for" << (*currAircraft)->getRegistration() << endl;
|
||||||
if (itr == heurMap.end()) {
|
if (itr == heurMap.end()) {
|
||||||
//cerr << "No heuristics found for " << registration << endl;
|
//cerr << "No heuristics found for " << registration << endl;
|
||||||
} else {
|
} else {
|
||||||
(*currAircraft)->setrunCount(itr->second->runCount);
|
(*currAircraft)->setrunCount(itr->second.runCount);
|
||||||
(*currAircraft)->setHits (itr->second->hits);
|
(*currAircraft)->setHits(itr->second.hits);
|
||||||
(*currAircraft)->setScore();
|
|
||||||
//cerr <<"Runcount " << itr->second->runCount << ".Hits " << itr->second->hits << endl;
|
//cerr <<"Runcount " << itr->second->runCount << ".Hits " << itr->second->hits << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//cerr << "Done" << endl;
|
//cerr << "Done" << endl;
|
||||||
for (heuristicsVectorIterator hvi = heuristics.begin();
|
//for (heuristicsVectorIterator hvi = heuristics.begin();
|
||||||
hvi != heuristics.end();
|
// hvi != heuristics.end(); hvi++) {
|
||||||
hvi++) {
|
// delete(*hvi);
|
||||||
delete (*hvi);
|
//}
|
||||||
}
|
}
|
||||||
sort (scheduledAircraft.begin(), scheduledAircraft.end(), compareSchedules);
|
// Do sorting and scoring separately, to take advantage of the "homeport| variable
|
||||||
|
for (currAircraft = scheduledAircraft.begin();
|
||||||
|
currAircraft != scheduledAircraft.end(); currAircraft++) {
|
||||||
|
(*currAircraft)->setScore();
|
||||||
}
|
}
|
||||||
|
sort(scheduledAircraft.begin(), scheduledAircraft.end(),
|
||||||
|
compareSchedules);
|
||||||
currAircraft = scheduledAircraft.begin();
|
currAircraft = scheduledAircraft.begin();
|
||||||
currAircraftClosest = scheduledAircraft.begin();
|
currAircraftClosest = scheduledAircraft.begin();
|
||||||
}
|
}
|
||||||
|
@ -222,17 +250,16 @@ void FGTrafficManager::update(double /*dt*/)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SGVec3d userCart = SGVec3d::fromGeod(SGGeod::fromDeg(
|
SGVec3d userCart =
|
||||||
fgGetDouble("/position/longitude-deg"),
|
SGVec3d::fromGeod(SGGeod::
|
||||||
|
fromDeg(fgGetDouble("/position/longitude-deg"),
|
||||||
fgGetDouble("/position/latitude-deg")));
|
fgGetDouble("/position/latitude-deg")));
|
||||||
|
|
||||||
if(currAircraft == scheduledAircraft.end())
|
if (currAircraft == scheduledAircraft.end()) {
|
||||||
{
|
|
||||||
currAircraft = scheduledAircraft.begin();
|
currAircraft = scheduledAircraft.begin();
|
||||||
}
|
}
|
||||||
//cerr << "Processing << " << (*currAircraft)->getRegistration() << " with score " << (*currAircraft)->getScore() << endl;
|
//cerr << "Processing << " << (*currAircraft)->getRegistration() << " with score " << (*currAircraft)->getScore() << endl;
|
||||||
if (!((*currAircraft)->update(now, userCart)))
|
if (!((*currAircraft)->update(now, userCart))) {
|
||||||
{
|
|
||||||
// NOTE: With traffic manager II, this statement below is no longer true
|
// NOTE: With traffic manager II, this statement below is no longer true
|
||||||
// after proper initialization, we shouldnt get here.
|
// after proper initialization, we shouldnt get here.
|
||||||
// But let's make sure
|
// But let's make sure
|
||||||
|
@ -249,10 +276,8 @@ void FGTrafficManager::release(int id)
|
||||||
bool FGTrafficManager::isReleased(int id)
|
bool FGTrafficManager::isReleased(int id)
|
||||||
{
|
{
|
||||||
IdListIterator i = releaseList.begin();
|
IdListIterator i = releaseList.begin();
|
||||||
while (i != releaseList.end())
|
while (i != releaseList.end()) {
|
||||||
{
|
if ((*i) == id) {
|
||||||
if ((*i) == id)
|
|
||||||
{
|
|
||||||
releaseList.erase(i);
|
releaseList.erase(i);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -260,7 +285,8 @@ bool FGTrafficManager::isReleased(int id)
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
|
|
||||||
void FGTrafficManager::readTimeTableFromFile(SGPath infileName)
|
void FGTrafficManager::readTimeTableFromFile(SGPath infileName)
|
||||||
{
|
{
|
||||||
string model;
|
string model;
|
||||||
|
@ -316,9 +342,10 @@ void FGTrafficManager::readTimeTableFromFile(SGPath infileName)
|
||||||
FlightType = tokens[9];
|
FlightType = tokens[9];
|
||||||
radius = atof(tokens[8].c_str());
|
radius = atof(tokens[8].c_str());
|
||||||
offset = atof(tokens[7].c_str());;
|
offset = atof(tokens[7].c_str());;
|
||||||
//cerr << "Found AC string " << model << " " << livery << " " << homePort << " "
|
SG_LOG(SG_GENERAL, SG_ALERT, "Adding Aircraft" << model << " " << livery << " " << homePort << " "
|
||||||
// << registration << " " << flightReq << " " << isHeavy << " " << acType << " " << airline << " " << m_class
|
<< registration << " " << flightReq << " " << isHeavy
|
||||||
// << " " << FlightType << " " << radius << " " << offset << endl;
|
<< " " << acType << " " << airline << " " << m_class
|
||||||
|
<< " " << FlightType << " " << radius << " " << offset);
|
||||||
scheduledAircraft.push_back(new FGAISchedule(model,
|
scheduledAircraft.push_back(new FGAISchedule(model,
|
||||||
livery,
|
livery,
|
||||||
homePort,
|
homePort,
|
||||||
|
@ -350,7 +377,7 @@ void FGTrafficManager::readTimeTableFromFile(SGPath infileName)
|
||||||
string requiredAircraft = tokens[9];
|
string requiredAircraft = tokens[9];
|
||||||
|
|
||||||
if (weekdays.size() != 7) {
|
if (weekdays.size() != 7) {
|
||||||
cerr << "Found misconfigured weekdays string" << weekdays << endl;
|
SG_LOG(SG_GENERAL, SG_ALERT, "Found misconfigured weekdays string" << weekdays);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
depTime.clear();
|
depTime.clear();
|
||||||
|
@ -365,23 +392,24 @@ void FGTrafficManager::readTimeTableFromFile(SGPath infileName)
|
||||||
arrivalWeekdayNeedsIncrement = true;
|
arrivalWeekdayNeedsIncrement = true;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 7; i++) {
|
for (int i = 0; i < 7; i++) {
|
||||||
|
int j = i+1;
|
||||||
if (weekdays[i] != '.') {
|
if (weekdays[i] != '.') {
|
||||||
char buffer[4];
|
char buffer[4];
|
||||||
snprintf(buffer, 4, "%d/", i);
|
snprintf(buffer, 4, "%d/", j);
|
||||||
string departureTime = string(buffer) + depTimeGen + string(":00");
|
string departureTime = string(buffer) + depTimeGen + string(":00");
|
||||||
string arrivalTime;
|
string arrivalTime;
|
||||||
if (!arrivalWeekdayNeedsIncrement) {
|
if (!arrivalWeekdayNeedsIncrement) {
|
||||||
arrivalTime = string(buffer) + arrTimeGen + string(":00");
|
arrivalTime = string(buffer) + arrTimeGen + string(":00");
|
||||||
}
|
}
|
||||||
if (arrivalWeekdayNeedsIncrement && i != 6 ) {
|
if (arrivalWeekdayNeedsIncrement && i != 6 ) {
|
||||||
snprintf(buffer, 4, "%d/", i+1);
|
snprintf(buffer, 4, "%d/", j+1);
|
||||||
arrivalTime = string(buffer) + arrTimeGen + string(":00");
|
arrivalTime = string(buffer) + arrTimeGen + string(":00");
|
||||||
}
|
}
|
||||||
if (arrivalWeekdayNeedsIncrement && i == 6 ) {
|
if (arrivalWeekdayNeedsIncrement && i == 6 ) {
|
||||||
snprintf(buffer, 4, "%d/", 0);
|
snprintf(buffer, 4, "%d/", 0);
|
||||||
arrivalTime = string(buffer) + arrTimeGen + string(":00");
|
arrivalTime = string(buffer) + arrTimeGen + string(":00");
|
||||||
}
|
}
|
||||||
cerr << "Adding flight: " << callsign << " "
|
SG_LOG(SG_GENERAL, SG_ALERT, "Adding flight " << callsign << " "
|
||||||
<< fltrules << " "
|
<< fltrules << " "
|
||||||
<< departurePort << " "
|
<< departurePort << " "
|
||||||
<< arrivalPort << " "
|
<< arrivalPort << " "
|
||||||
|
@ -389,7 +417,7 @@ void FGTrafficManager::readTimeTableFromFile(SGPath infileName)
|
||||||
<< departureTime << " "
|
<< departureTime << " "
|
||||||
<< arrivalTime << " "
|
<< arrivalTime << " "
|
||||||
<< repeat << " "
|
<< repeat << " "
|
||||||
<< requiredAircraft << endl;
|
<< requiredAircraft);
|
||||||
|
|
||||||
flights[requiredAircraft].push_back(new FGScheduledFlight(callsign,
|
flights[requiredAircraft].push_back(new FGScheduledFlight(callsign,
|
||||||
fltrules,
|
fltrules,
|
||||||
|
@ -407,9 +435,9 @@ void FGTrafficManager::readTimeTableFromFile(SGPath infileName)
|
||||||
|
|
||||||
}
|
}
|
||||||
//exit(1);
|
//exit(1);
|
||||||
}*/
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
void FGTrafficManager::Tokenize(const string& str,
|
void FGTrafficManager::Tokenize(const string& str,
|
||||||
vector<string>& tokens,
|
vector<string>& tokens,
|
||||||
const string& delimiters)
|
const string& delimiters)
|
||||||
|
@ -429,30 +457,32 @@ void FGTrafficManager::Tokenize(const string& str,
|
||||||
pos = str.find_first_of(delimiters, lastPos);
|
pos = str.find_first_of(delimiters, lastPos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
void FGTrafficManager::startXML () {
|
|
||||||
|
void FGTrafficManager::startXML()
|
||||||
|
{
|
||||||
//cout << "Start XML" << endl;
|
//cout << "Start XML" << endl;
|
||||||
requiredAircraft = "";
|
requiredAircraft = "";
|
||||||
homePort = "";
|
homePort = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
void FGTrafficManager::endXML () {
|
void FGTrafficManager::endXML()
|
||||||
|
{
|
||||||
//cout << "End XML" << endl;
|
//cout << "End XML" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FGTrafficManager::startElement (const char * name, const XMLAttributes &atts) {
|
void FGTrafficManager::startElement(const char *name,
|
||||||
|
const XMLAttributes & atts)
|
||||||
|
{
|
||||||
const char *attval;
|
const char *attval;
|
||||||
//cout << "Start element " << name << endl;
|
//cout << "Start element " << name << endl;
|
||||||
//FGTrafficManager temp;
|
//FGTrafficManager temp;
|
||||||
//for (int i = 0; i < atts.size(); i++)
|
//for (int i = 0; i < atts.size(); i++)
|
||||||
// if (string(atts.getName(i)) == string("include"))
|
// if (string(atts.getName(i)) == string("include"))
|
||||||
attval = atts.getValue("include");
|
attval = atts.getValue("include");
|
||||||
if (attval != 0)
|
if (attval != 0) {
|
||||||
{
|
|
||||||
//cout << "including " << attval << endl;
|
//cout << "including " << attval << endl;
|
||||||
SGPath path =
|
SGPath path = globals->get_fg_root();
|
||||||
globals->get_fg_root();
|
|
||||||
path.append("/Traffic/");
|
path.append("/Traffic/");
|
||||||
path.append(attval);
|
path.append(attval);
|
||||||
readXML(path.str(), *this);
|
readXML(path.str(), *this);
|
||||||
|
@ -461,7 +491,8 @@ void FGTrafficManager::startElement (const char * name, const XMLAttributes &at
|
||||||
// cout << " " << atts.getName(i) << '=' << atts.getValue(i) << endl;
|
// cout << " " << atts.getName(i) << '=' << atts.getValue(i) << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FGTrafficManager::endElement (const char * name) {
|
void FGTrafficManager::endElement(const char *name)
|
||||||
|
{
|
||||||
//cout << "End element " << name << endl;
|
//cout << "End element " << name << endl;
|
||||||
const string & value = elementValueStack.back();
|
const string & value = elementValueStack.back();
|
||||||
|
|
||||||
|
@ -487,14 +518,12 @@ void FGTrafficManager::endElement (const char * name) {
|
||||||
offset = atoi(value.c_str());
|
offset = atoi(value.c_str());
|
||||||
else if (!strcmp(name, "performance-class"))
|
else if (!strcmp(name, "performance-class"))
|
||||||
m_class = value;
|
m_class = value;
|
||||||
else if (!strcmp(name, "heavy"))
|
else if (!strcmp(name, "heavy")) {
|
||||||
{
|
|
||||||
if (value == string("true"))
|
if (value == string("true"))
|
||||||
heavy = true;
|
heavy = true;
|
||||||
else
|
else
|
||||||
heavy = false;
|
heavy = false;
|
||||||
}
|
} else if (!strcmp(name, "callsign"))
|
||||||
else if (!strcmp(name, "callsign"))
|
|
||||||
callsign = value;
|
callsign = value;
|
||||||
else if (!strcmp(name, "fltrules"))
|
else if (!strcmp(name, "fltrules"))
|
||||||
fltrules = value;
|
fltrules = value;
|
||||||
|
@ -502,22 +531,17 @@ void FGTrafficManager::endElement (const char * name) {
|
||||||
port = value;
|
port = value;
|
||||||
else if (!strcmp(name, "time"))
|
else if (!strcmp(name, "time"))
|
||||||
timeString = value;
|
timeString = value;
|
||||||
else if (!strcmp(name, "departure"))
|
else if (!strcmp(name, "departure")) {
|
||||||
{
|
|
||||||
departurePort = port;
|
departurePort = port;
|
||||||
departureTime = timeString;
|
departureTime = timeString;
|
||||||
}
|
} else if (!strcmp(name, "cruise-alt"))
|
||||||
else if (!strcmp(name, "cruise-alt"))
|
|
||||||
cruiseAlt = atoi(value.c_str());
|
cruiseAlt = atoi(value.c_str());
|
||||||
else if (!strcmp(name, "arrival"))
|
else if (!strcmp(name, "arrival")) {
|
||||||
{
|
|
||||||
arrivalPort = port;
|
arrivalPort = port;
|
||||||
arrivalTime = timeString;
|
arrivalTime = timeString;
|
||||||
}
|
} else if (!strcmp(name, "repeat"))
|
||||||
else if (!strcmp(name, "repeat"))
|
|
||||||
repeat = value;
|
repeat = value;
|
||||||
else if (!strcmp(name, "flight"))
|
else if (!strcmp(name, "flight")) {
|
||||||
{
|
|
||||||
// We have loaded and parsed all the information belonging to this flight
|
// We have loaded and parsed all the information belonging to this flight
|
||||||
// so we temporarily store it.
|
// so we temporarily store it.
|
||||||
//cerr << "Pusing back flight " << callsign << endl;
|
//cerr << "Pusing back flight " << callsign << endl;
|
||||||
|
@ -547,10 +571,18 @@ void FGTrafficManager::endElement (const char * name) {
|
||||||
<< arrivalPort << " "
|
<< arrivalPort << " "
|
||||||
<< cruiseAlt << " "
|
<< cruiseAlt << " "
|
||||||
<< departureTime << " "
|
<< departureTime << " "
|
||||||
<< arrivalTime << " "
|
<< arrivalTime << " " << repeat << " " << requiredAircraft);
|
||||||
<< repeat << " "
|
// For database maintainance purposes, it may be convenient to
|
||||||
<< requiredAircraft);
|
//
|
||||||
|
if (fgGetBool("/sim/traffic-manager/dumpdata") == true) {
|
||||||
|
SG_LOG(SG_GENERAL, SG_ALERT, "Traffic Dump FLIGHT," << callsign << ","
|
||||||
|
<< fltrules << ","
|
||||||
|
<< departurePort << ","
|
||||||
|
<< arrivalPort << ","
|
||||||
|
<< cruiseAlt << ","
|
||||||
|
<< departureTime << ","
|
||||||
|
<< arrivalTime << "," << repeat << "," << requiredAircraft);
|
||||||
|
}
|
||||||
flights[requiredAircraft].push_back(new FGScheduledFlight(callsign,
|
flights[requiredAircraft].push_back(new FGScheduledFlight(callsign,
|
||||||
fltrules,
|
fltrules,
|
||||||
departurePort,
|
departurePort,
|
||||||
|
@ -561,12 +593,26 @@ void FGTrafficManager::endElement (const char * name) {
|
||||||
repeat,
|
repeat,
|
||||||
requiredAircraft));
|
requiredAircraft));
|
||||||
requiredAircraft = "";
|
requiredAircraft = "";
|
||||||
|
} else if (!strcmp(name, "aircraft")) {
|
||||||
|
string isHeavy;
|
||||||
|
if (heavy) {
|
||||||
|
isHeavy = "true";
|
||||||
|
} else {
|
||||||
|
isHeavy = "false";
|
||||||
}
|
}
|
||||||
else if (!strcmp(name, "aircraft"))
|
/*
|
||||||
{
|
cerr << "Traffic Dump AC," << homePort << "," << registration << "," << requiredAircraft
|
||||||
int proportion = (int) (fgGetDouble("/sim/traffic-manager/proportion") * 100);
|
<< "," << acType << "," << livery << ","
|
||||||
|
<< airline << "," << offset << "," << radius << "," << flighttype << "," << isHeavy << "," << mdl << endl;*/
|
||||||
|
int proportion =
|
||||||
|
(int) (fgGetDouble("/sim/traffic-manager/proportion") * 100);
|
||||||
int randval = rand() & 100;
|
int randval = rand() & 100;
|
||||||
if (randval < proportion) {
|
if (randval <= proportion) {
|
||||||
|
if (fgGetBool("/sim/traffic-manager/dumpdata") == true) {
|
||||||
|
SG_LOG(SG_GENERAL, SG_ALERT, "Traffic Dump AC," << homePort << "," << registration << "," << requiredAircraft
|
||||||
|
<< "," << acType << "," << livery << ","
|
||||||
|
<< airline << "," << offset << "," << radius << "," << flighttype << "," << isHeavy << "," << mdl);
|
||||||
|
}
|
||||||
//scheduledAircraft.push_back(new FGAISchedule(mdl,
|
//scheduledAircraft.push_back(new FGAISchedule(mdl,
|
||||||
// livery,
|
// livery,
|
||||||
// registration,
|
// registration,
|
||||||
|
@ -597,12 +643,13 @@ void FGTrafficManager::endElement (const char * name) {
|
||||||
airline,
|
airline,
|
||||||
m_class,
|
m_class,
|
||||||
flighttype,
|
flighttype,
|
||||||
radius,
|
radius, offset));
|
||||||
offset));
|
|
||||||
|
|
||||||
// while(flights.begin() != flights.end()) {
|
// while(flights.begin() != flights.end()) {
|
||||||
// flights.pop_back();
|
// flights.pop_back();
|
||||||
// }
|
// }
|
||||||
|
} else {
|
||||||
|
cerr << "Skipping : " << randval;
|
||||||
}
|
}
|
||||||
acCounter++;
|
acCounter++;
|
||||||
requiredAircraft = "";
|
requiredAircraft = "";
|
||||||
|
@ -613,29 +660,32 @@ void FGTrafficManager::endElement (const char * name) {
|
||||||
// }
|
// }
|
||||||
//flights.clear();
|
//flights.clear();
|
||||||
SG_LOG(SG_GENERAL, SG_BULK, "Reading aircraft : "
|
SG_LOG(SG_GENERAL, SG_BULK, "Reading aircraft : "
|
||||||
<< registration
|
<< registration << " with prioritization score " << score);
|
||||||
<< " with prioritization score "
|
|
||||||
<< score);
|
|
||||||
score = 0;
|
score = 0;
|
||||||
}
|
}
|
||||||
elementValueStack.pop_back();
|
elementValueStack.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FGTrafficManager::data (const char * s, int len) {
|
void FGTrafficManager::data(const char *s, int len)
|
||||||
|
{
|
||||||
string token = string(s, len);
|
string token = string(s, len);
|
||||||
//cout << "Character data " << string(s,len) << endl;
|
//cout << "Character data " << string(s,len) << endl;
|
||||||
elementValueStack.back() += token;
|
elementValueStack.back() += token;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FGTrafficManager::pi (const char * target, const char * data) {
|
void FGTrafficManager::pi(const char *target, const char *data)
|
||||||
|
{
|
||||||
//cout << "Processing instruction " << target << ' ' << data << endl;
|
//cout << "Processing instruction " << target << ' ' << data << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FGTrafficManager::warning (const char * message, int line, int column) {
|
void FGTrafficManager::warning(const char *message, int line, int column)
|
||||||
SG_LOG(SG_IO, SG_WARN, "Warning: " << message << " (" << line << ',' << column << ')');
|
{
|
||||||
|
SG_LOG(SG_IO, SG_WARN,
|
||||||
|
"Warning: " << message << " (" << line << ',' << column << ')');
|
||||||
}
|
}
|
||||||
|
|
||||||
void FGTrafficManager::error (const char * message, int line, int column) {
|
void FGTrafficManager::error(const char *message, int line, int column)
|
||||||
SG_LOG(SG_IO, SG_ALERT, "Error: " << message << " (" << line << ',' << column << ')');
|
{
|
||||||
|
SG_LOG(SG_IO, SG_ALERT,
|
||||||
|
"Error: " << message << " (" << line << ',' << column << ')');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,10 +65,10 @@ public:
|
||||||
unsigned int hits;
|
unsigned int hits;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef vector<Heuristic*> heuristicsVector;
|
typedef vector<Heuristic> heuristicsVector;
|
||||||
typedef vector<Heuristic*>::iterator heuristicsVectorIterator;
|
typedef vector<Heuristic>::iterator heuristicsVectorIterator;
|
||||||
|
|
||||||
typedef std::map < std::string, Heuristic *> HeuristicMap;
|
typedef std::map < std::string, Heuristic> HeuristicMap;
|
||||||
typedef HeuristicMap::iterator HeuristicMapIterator;
|
typedef HeuristicMap::iterator HeuristicMapIterator;
|
||||||
|
|
||||||
|
|
||||||
|
@ -93,8 +93,8 @@ private:
|
||||||
|
|
||||||
FGScheduledFlightMap flights;
|
FGScheduledFlightMap flights;
|
||||||
|
|
||||||
//void readTimeTableFromFile(SGPath infilename);
|
void readTimeTableFromFile(SGPath infilename);
|
||||||
//void Tokenize(const string& str, vector<string>& tokens, const string& delimiters = " ");
|
void Tokenize(const string& str, vector<string>& tokens, const string& delimiters = " ");
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FGTrafficManager();
|
FGTrafficManager();
|
||||||
|
|
Loading…
Add table
Reference in a new issue