1
0
Fork 0

Merge branch 'next' of git://gitorious.org/fg/flightgear into next

This commit is contained in:
Frederic Bouvier 2010-09-05 16:59:26 +02:00
commit 4175619392
6 changed files with 2020 additions and 1882 deletions

File diff suppressed because it is too large Load diff

View file

@ -101,6 +101,80 @@ using namespace osg;
static osg::ref_ptr<osgViewer::Viewer> viewer;
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)
{
viewer = new osgViewer::Viewer;
@ -175,8 +249,19 @@ void fgOSOpenWindow(bool stencil)
viewer->setSceneData(new osg::Group);
globals->get_renderer()->setViewer(viewer.get());
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;
void fgOSExit(int code)

File diff suppressed because it is too large Load diff

View file

@ -364,10 +364,12 @@ void FGAISchedule::scheduleFlights()
currentDestination = flight->getArrivalAirport()->getId();
if (!initialized) {
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) {
hits++;
}
runCount++;
//runCount++;
initialized = true;
}
@ -508,6 +510,7 @@ void FGAISchedule::setScore ()
score = 0.0;
}
}
runCount++;
}
bool compareSchedules(FGAISchedule*a, FGAISchedule*b)

View file

@ -18,7 +18,7 @@
*
*
**************************************************************************/
/*
* Traffic manager parses airlines timetable-like data and uses this to
* determine the approximate position of each AI aircraft in its database.
@ -72,18 +72,18 @@
using std::sort;
using std::strcmp;
/******************************************************************************
* TrafficManager
*****************************************************************************/
FGTrafficManager::FGTrafficManager()
{
//score = 0;
//runCount = 0;
acCounter = 0;
//score = 0;
//runCount = 0;
acCounter = 0;
}
FGTrafficManager:: ~FGTrafficManager()
FGTrafficManager::~FGTrafficManager()
{
// Save the heuristics data
bool saveData = false;
@ -92,11 +92,11 @@ FGTrafficManager:: ~FGTrafficManager()
SGPath cacheData(fgGetString("/sim/fg-home"));
cacheData.append("ai");
string airport = fgGetString("/sim/presets/airport-id");
if ((airport) != "") {
if ((airport) != "") {
char buffer[128];
::snprintf(buffer, 128, "%c/%c/%c/",
airport[0], airport[1], airport[2]);
airport[0], airport[1], airport[2]);
cacheData.append(buffer);
if (!cacheData.exists()) {
cacheData.create_dir(0777);
@ -106,60 +106,80 @@ FGTrafficManager:: ~FGTrafficManager()
saveData = true;
cachefile.open(cacheData.str().c_str());
}
}
for (ScheduleVectorIterator sched = scheduledAircraft.begin(); sched != scheduledAircraft.end(); sched++) {
if (saveData) {
cachefile << (*sched)->getRegistration() << " "
<< (*sched)-> getRunCount() << " "
<< (*sched)->getHits() << endl;
}
delete (*sched);
}
if (saveData) {
cachefile.close();
}
scheduledAircraft.clear();
flights.clear();
for (ScheduleVectorIterator sched = scheduledAircraft.begin();
sched != scheduledAircraft.end(); sched++) {
if (saveData) {
cachefile << (*sched)->getRegistration() << " "
<< (*sched)->getRunCount() << " "
<< (*sched)->getHits() << endl;
}
delete(*sched);
}
if (saveData) {
cachefile.close();
}
scheduledAircraft.clear();
flights.clear();
}
void FGTrafficManager::init()
{
ulDir* d, *d2;
ulDirEnt* dent, *dent2;
SGPath aircraftDir = globals->get_fg_root();
SGPath path = aircraftDir;
heuristicsVector heuristics;
HeuristicMap heurMap;
aircraftDir.append("AI/Traffic");
if ((d = ulOpenDir(aircraftDir.c_str())) != NULL)
{
while((dent = ulReadDir(d)) != NULL) {
if (string(dent->d_name) != string(".") &&
string(dent->d_name) != string("..") &&
dent->d_isdir)
{
SGPath currACDir = aircraftDir;
currACDir.append(dent->d_name);
if ((d2 = ulOpenDir(currACDir.c_str())) == NULL)
return;
while ((dent2 = ulReadDir(d2)) != NULL) {
SGPath currFile = currACDir;
currFile.append(dent2->d_name);
if (currFile.extension() == string("xml"))
{
SGPath currFile = currACDir;
currFile.append(dent2->d_name);
SG_LOG(SG_GENERAL, SG_DEBUG, "Scanning " << currFile.str() << " for traffic");
readXML(currFile.str(),*this);
}
}
ulCloseDir(d2);
}
}
ulCloseDir(d);
{
ulDir *d, *d2;
ulDirEnt *dent, *dent2;
heuristicsVector heuristics;
HeuristicMap heurMap;
if (string(fgGetString("/sim/traffic-manager/datafile")) == string("")) {
SGPath aircraftDir = globals->get_fg_root();
SGPath path = aircraftDir;
aircraftDir.append("AI/Traffic");
if ((d = ulOpenDir(aircraftDir.c_str())) != NULL) {
while ((dent = ulReadDir(d)) != NULL) {
if (string(dent->d_name) != string(".") &&
string(dent->d_name) != string("..") && dent->d_isdir) {
SGPath currACDir = aircraftDir;
currACDir.append(dent->d_name);
if ((d2 = ulOpenDir(currACDir.c_str())) == NULL)
return;
while ((dent2 = ulReadDir(d2)) != NULL) {
SGPath currFile = currACDir;
currFile.append(dent2->d_name);
if (currFile.extension() == string("xml")) {
SGPath currFile = currACDir;
currFile.append(dent2->d_name);
SG_LOG(SG_GENERAL, SG_DEBUG,
"Scanning " << currFile.
str() << " for traffic");
readXML(currFile.str(), *this);
}
}
ulCloseDir(d2);
}
}
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")) {
//cerr << "Processing Heuristics" << endl;
@ -170,97 +190,103 @@ void FGTrafficManager::init()
if ((airport) != "") {
char buffer[128];
::snprintf(buffer, 128, "%c/%c/%c/",
airport[0], airport[1], airport[2]);
airport[0], airport[1], airport[2]);
cacheData.append(buffer);
cacheData.append(airport + "-cache.txt");
if (cacheData.exists()) {
ifstream data(cacheData.c_str());
while (1) {
Heuristic *h = new Heuristic;
data >> h->registration >> h->runCount >> h->hits;
Heuristic h; // = new Heuristic;
data >> h.registration >> h.runCount >> h.hits;
if (data.eof())
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);
}
}
}
for (currAircraft = scheduledAircraft.begin();
currAircraft != scheduledAircraft.end();
currAircraft++) {
for (currAircraft = scheduledAircraft.begin();
currAircraft != scheduledAircraft.end(); currAircraft++) {
string registration = (*currAircraft)->getRegistration();
HeuristicMapIterator itr = heurMap.find(registration);
//cerr << "Processing heuristics for" << (*currAircraft)->getRegistration() << endl;
if (itr == heurMap.end()) {
//cerr << "No heuristics found for " << registration << endl;
} else {
(*currAircraft)->setrunCount(itr->second->runCount);
(*currAircraft)->setHits (itr->second->hits);
(*currAircraft)->setScore();
(*currAircraft)->setrunCount(itr->second.runCount);
(*currAircraft)->setHits(itr->second.hits);
//cerr <<"Runcount " << itr->second->runCount << ".Hits " << itr->second->hits << endl;
}
}
//cerr << "Done" << endl;
for (heuristicsVectorIterator hvi = heuristics.begin();
hvi != heuristics.end();
hvi++) {
delete (*hvi);
}
sort (scheduledAircraft.begin(), scheduledAircraft.end(), compareSchedules);
//for (heuristicsVectorIterator hvi = heuristics.begin();
// hvi != heuristics.end(); hvi++) {
// delete(*hvi);
//}
}
// 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();
currAircraftClosest = scheduledAircraft.begin();
}
void FGTrafficManager::update(double /*dt*/)
void FGTrafficManager::update(double /*dt */ )
{
if (fgGetBool("/environment/metar/valid") == false) {
return;
}
time_t now = time(NULL) + fgGetLong("/sim/time/warp");
if (scheduledAircraft.size() == 0) {
return;
}
SGVec3d userCart = SGVec3d::fromGeod(SGGeod::fromDeg(
fgGetDouble("/position/longitude-deg"),
fgGetDouble("/position/latitude-deg")));
if(currAircraft == scheduledAircraft.end())
{
currAircraft = scheduledAircraft.begin();
if (fgGetBool("/environment/metar/valid") == false) {
return;
}
//cerr << "Processing << " << (*currAircraft)->getRegistration() << " with score " << (*currAircraft)->getScore() << endl;
if (!((*currAircraft)->update(now, userCart)))
{
// NOTE: With traffic manager II, this statement below is no longer true
// after proper initialization, we shouldnt get here.
// But let's make sure
//SG_LOG( SG_GENERAL, SG_ALERT, "Failed to update aircraft schedule in traffic manager");
time_t now = time(NULL) + fgGetLong("/sim/time/warp");
if (scheduledAircraft.size() == 0) {
return;
}
currAircraft++;
SGVec3d userCart =
SGVec3d::fromGeod(SGGeod::
fromDeg(fgGetDouble("/position/longitude-deg"),
fgGetDouble("/position/latitude-deg")));
if (currAircraft == scheduledAircraft.end()) {
currAircraft = scheduledAircraft.begin();
}
//cerr << "Processing << " << (*currAircraft)->getRegistration() << " with score " << (*currAircraft)->getScore() << endl;
if (!((*currAircraft)->update(now, userCart))) {
// NOTE: With traffic manager II, this statement below is no longer true
// after proper initialization, we shouldnt get here.
// But let's make sure
//SG_LOG( SG_GENERAL, SG_ALERT, "Failed to update aircraft schedule in traffic manager");
}
currAircraft++;
}
void FGTrafficManager::release(int id)
{
releaseList.push_back(id);
releaseList.push_back(id);
}
bool FGTrafficManager::isReleased(int id)
{
IdListIterator i = releaseList.begin();
while (i != releaseList.end())
{
if ((*i) == id)
{
releaseList.erase(i);
return true;
}
i++;
IdListIterator i = releaseList.begin();
while (i != releaseList.end()) {
if ((*i) == id) {
releaseList.erase(i);
return true;
}
i++;
}
return false;
return false;
}
/*
void FGTrafficManager::readTimeTableFromFile(SGPath infileName)
{
string model;
@ -316,9 +342,10 @@ void FGTrafficManager::readTimeTableFromFile(SGPath infileName)
FlightType = tokens[9];
radius = atof(tokens[8].c_str());
offset = atof(tokens[7].c_str());;
//cerr << "Found AC string " << model << " " << livery << " " << homePort << " "
// << registration << " " << flightReq << " " << isHeavy << " " << acType << " " << airline << " " << m_class
// << " " << FlightType << " " << radius << " " << offset << endl;
SG_LOG(SG_GENERAL, SG_ALERT, "Adding Aircraft" << model << " " << livery << " " << homePort << " "
<< registration << " " << flightReq << " " << isHeavy
<< " " << acType << " " << airline << " " << m_class
<< " " << FlightType << " " << radius << " " << offset);
scheduledAircraft.push_back(new FGAISchedule(model,
livery,
homePort,
@ -350,7 +377,7 @@ void FGTrafficManager::readTimeTableFromFile(SGPath infileName)
string requiredAircraft = tokens[9];
if (weekdays.size() != 7) {
cerr << "Found misconfigured weekdays string" << weekdays << endl;
SG_LOG(SG_GENERAL, SG_ALERT, "Found misconfigured weekdays string" << weekdays);
exit(1);
}
depTime.clear();
@ -365,31 +392,32 @@ void FGTrafficManager::readTimeTableFromFile(SGPath infileName)
arrivalWeekdayNeedsIncrement = true;
}
for (int i = 0; i < 7; i++) {
int j = i+1;
if (weekdays[i] != '.') {
char buffer[4];
snprintf(buffer, 4, "%d/", i);
snprintf(buffer, 4, "%d/", j);
string departureTime = string(buffer) + depTimeGen + string(":00");
string arrivalTime;
if (!arrivalWeekdayNeedsIncrement) {
arrivalTime = string(buffer) + arrTimeGen + string(":00");
}
if (arrivalWeekdayNeedsIncrement && i != 6 ) {
snprintf(buffer, 4, "%d/", i+1);
snprintf(buffer, 4, "%d/", j+1);
arrivalTime = string(buffer) + arrTimeGen + string(":00");
}
if (arrivalWeekdayNeedsIncrement && i == 6 ) {
snprintf(buffer, 4, "%d/", 0);
arrivalTime = string(buffer) + arrTimeGen + string(":00");
}
cerr << "Adding flight: " << callsign << " "
<< fltrules << " "
<< departurePort << " "
<< arrivalPort << " "
<< cruiseAlt << " "
<< departureTime << " "
<< arrivalTime << " "
<< repeat << " "
<< requiredAircraft << endl;
SG_LOG(SG_GENERAL, SG_ALERT, "Adding flight " << callsign << " "
<< fltrules << " "
<< departurePort << " "
<< arrivalPort << " "
<< cruiseAlt << " "
<< departureTime << " "
<< arrivalTime << " "
<< repeat << " "
<< requiredAircraft);
flights[requiredAircraft].push_back(new FGScheduledFlight(callsign,
fltrules,
@ -407,9 +435,9 @@ void FGTrafficManager::readTimeTableFromFile(SGPath infileName)
}
//exit(1);
}*/
}
/*
void FGTrafficManager::Tokenize(const string& str,
vector<string>& tokens,
const string& delimiters)
@ -429,213 +457,235 @@ void FGTrafficManager::Tokenize(const string& str,
pos = str.find_first_of(delimiters, lastPos);
}
}
*/
void FGTrafficManager::startXML () {
//cout << "Start XML" << endl;
requiredAircraft = "";
homePort = "";
}
void FGTrafficManager::endXML () {
//cout << "End XML" << endl;
}
void FGTrafficManager::startElement (const char * name, const XMLAttributes &atts) {
const char * attval;
//cout << "Start element " << name << endl;
//FGTrafficManager temp;
//for (int i = 0; i < atts.size(); i++)
// if (string(atts.getName(i)) == string("include"))
attval = atts.getValue("include");
if (attval != 0)
{
//cout << "including " << attval << endl;
SGPath path =
globals->get_fg_root();
path.append("/Traffic/");
path.append(attval);
readXML(path.str(), *this);
}
elementValueStack.push_back( "" );
// cout << " " << atts.getName(i) << '=' << atts.getValue(i) << endl;
}
void FGTrafficManager::endElement (const char * name) {
//cout << "End element " << name << endl;
const string& value = elementValueStack.back();
if (!strcmp(name, "model"))
mdl = value;
else if (!strcmp(name, "livery"))
livery = value;
else if (!strcmp(name, "home-port"))
homePort = value;
else if (!strcmp(name, "registration"))
registration = value;
else if (!strcmp(name, "airline"))
airline = value;
else if (!strcmp(name, "actype"))
acType = value;
else if (!strcmp(name, "required-aircraft"))
requiredAircraft = value;
else if (!strcmp(name, "flighttype"))
flighttype = value;
else if (!strcmp(name, "radius"))
radius = atoi(value.c_str());
else if (!strcmp(name, "offset"))
offset = atoi(value.c_str());
else if (!strcmp(name, "performance-class"))
m_class = value;
else if (!strcmp(name, "heavy"))
{
if(value == string("true"))
heavy = true;
else
heavy = false;
}
else if (!strcmp(name, "callsign"))
callsign = value;
else if (!strcmp(name, "fltrules"))
fltrules = value;
else if (!strcmp(name, "port"))
port = value;
else if (!strcmp(name, "time"))
timeString = value;
else if (!strcmp(name, "departure"))
{
departurePort = port;
departureTime = timeString;
}
else if (!strcmp(name, "cruise-alt"))
cruiseAlt = atoi(value.c_str());
else if (!strcmp(name, "arrival"))
{
arrivalPort = port;
arrivalTime = timeString;
}
else if (!strcmp(name, "repeat"))
repeat = value;
else if (!strcmp(name, "flight"))
{
// We have loaded and parsed all the information belonging to this flight
// so we temporarily store it.
//cerr << "Pusing back flight " << callsign << endl;
//cerr << callsign << " " << fltrules << " "<< departurePort << " " << arrivalPort << " "
// << cruiseAlt << " " << departureTime<< " "<< arrivalTime << " " << repeat << endl;
//Prioritize aircraft
string apt = fgGetString("/sim/presets/airport-id");
//cerr << "Airport information: " << apt << " " << departurePort << " " << arrivalPort << endl;
//if (departurePort == apt) score++;
//flights.push_back(new FGScheduledFlight(callsign,
// fltrules,
// departurePort,
// arrivalPort,
// cruiseAlt,
// departureTime,
// arrivalTime,
// repeat));
if (requiredAircraft == "") {
char buffer[16];
snprintf(buffer, 16, "%d", acCounter);
requiredAircraft = buffer;
}
SG_LOG(SG_GENERAL, SG_DEBUG, "Adding flight: " << callsign << " "
<< fltrules << " "
<< departurePort << " "
<< arrivalPort << " "
<< cruiseAlt << " "
<< departureTime << " "
<< arrivalTime << " "
<< repeat << " "
<< requiredAircraft);
flights[requiredAircraft].push_back(new FGScheduledFlight(callsign,
fltrules,
departurePort,
arrivalPort,
cruiseAlt,
departureTime,
arrivalTime,
repeat,
requiredAircraft));
requiredAircraft = "";
}
else if (!strcmp(name, "aircraft"))
{
int proportion = (int) (fgGetDouble("/sim/traffic-manager/proportion") * 100);
int randval = rand() & 100;
if (randval < proportion) {
//scheduledAircraft.push_back(new FGAISchedule(mdl,
// livery,
// registration,
// heavy,
// acType,
// airline,
// m_class,
// flighttype,
// radius,
// offset,
// score,
// flights));
if (requiredAircraft == "") {
char buffer[16];
snprintf(buffer, 16, "%d", acCounter);
requiredAircraft = buffer;
}
if (homePort == "") {
homePort = departurePort;
}
scheduledAircraft.push_back(new FGAISchedule(mdl,
livery,
homePort,
registration,
requiredAircraft,
heavy,
acType,
airline,
m_class,
flighttype,
radius,
offset));
// while(flights.begin() != flights.end()) {
// flights.pop_back();
// }
}
acCounter++;
void FGTrafficManager::startXML()
{
//cout << "Start XML" << endl;
requiredAircraft = "";
homePort = "";
//for (FGScheduledFlightVecIterator flt = flights.begin(); flt != flights.end(); flt++)
// {
// delete (*flt);
// }
//flights.clear();
SG_LOG( SG_GENERAL, SG_BULK, "Reading aircraft : "
<< registration
<< " with prioritization score "
<< score);
score = 0;
}
void FGTrafficManager::endXML()
{
//cout << "End XML" << endl;
}
void FGTrafficManager::startElement(const char *name,
const XMLAttributes & atts)
{
const char *attval;
//cout << "Start element " << name << endl;
//FGTrafficManager temp;
//for (int i = 0; i < atts.size(); i++)
// if (string(atts.getName(i)) == string("include"))
attval = atts.getValue("include");
if (attval != 0) {
//cout << "including " << attval << endl;
SGPath path = globals->get_fg_root();
path.append("/Traffic/");
path.append(attval);
readXML(path.str(), *this);
}
elementValueStack.pop_back();
elementValueStack.push_back("");
// cout << " " << atts.getName(i) << '=' << atts.getValue(i) << endl;
}
void FGTrafficManager::data (const char * s, int len) {
string token = string(s,len);
//cout << "Character data " << string(s,len) << endl;
elementValueStack.back() += token;
void FGTrafficManager::endElement(const char *name)
{
//cout << "End element " << name << endl;
const string & value = elementValueStack.back();
if (!strcmp(name, "model"))
mdl = value;
else if (!strcmp(name, "livery"))
livery = value;
else if (!strcmp(name, "home-port"))
homePort = value;
else if (!strcmp(name, "registration"))
registration = value;
else if (!strcmp(name, "airline"))
airline = value;
else if (!strcmp(name, "actype"))
acType = value;
else if (!strcmp(name, "required-aircraft"))
requiredAircraft = value;
else if (!strcmp(name, "flighttype"))
flighttype = value;
else if (!strcmp(name, "radius"))
radius = atoi(value.c_str());
else if (!strcmp(name, "offset"))
offset = atoi(value.c_str());
else if (!strcmp(name, "performance-class"))
m_class = value;
else if (!strcmp(name, "heavy")) {
if (value == string("true"))
heavy = true;
else
heavy = false;
} else if (!strcmp(name, "callsign"))
callsign = value;
else if (!strcmp(name, "fltrules"))
fltrules = value;
else if (!strcmp(name, "port"))
port = value;
else if (!strcmp(name, "time"))
timeString = value;
else if (!strcmp(name, "departure")) {
departurePort = port;
departureTime = timeString;
} else if (!strcmp(name, "cruise-alt"))
cruiseAlt = atoi(value.c_str());
else if (!strcmp(name, "arrival")) {
arrivalPort = port;
arrivalTime = timeString;
} else if (!strcmp(name, "repeat"))
repeat = value;
else if (!strcmp(name, "flight")) {
// We have loaded and parsed all the information belonging to this flight
// so we temporarily store it.
//cerr << "Pusing back flight " << callsign << endl;
//cerr << callsign << " " << fltrules << " "<< departurePort << " " << arrivalPort << " "
// << cruiseAlt << " " << departureTime<< " "<< arrivalTime << " " << repeat << endl;
//Prioritize aircraft
string apt = fgGetString("/sim/presets/airport-id");
//cerr << "Airport information: " << apt << " " << departurePort << " " << arrivalPort << endl;
//if (departurePort == apt) score++;
//flights.push_back(new FGScheduledFlight(callsign,
// fltrules,
// departurePort,
// arrivalPort,
// cruiseAlt,
// departureTime,
// arrivalTime,
// repeat));
if (requiredAircraft == "") {
char buffer[16];
snprintf(buffer, 16, "%d", acCounter);
requiredAircraft = buffer;
}
SG_LOG(SG_GENERAL, SG_DEBUG, "Adding flight: " << callsign << " "
<< fltrules << " "
<< departurePort << " "
<< arrivalPort << " "
<< cruiseAlt << " "
<< departureTime << " "
<< arrivalTime << " " << repeat << " " << requiredAircraft);
// For database maintainance purposes, it may be convenient to
//
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,
fltrules,
departurePort,
arrivalPort,
cruiseAlt,
departureTime,
arrivalTime,
repeat,
requiredAircraft));
requiredAircraft = "";
} else if (!strcmp(name, "aircraft")) {
string isHeavy;
if (heavy) {
isHeavy = "true";
} else {
isHeavy = "false";
}
/*
cerr << "Traffic Dump AC," << homePort << "," << registration << "," << requiredAircraft
<< "," << acType << "," << livery << ","
<< airline << "," << offset << "," << radius << "," << flighttype << "," << isHeavy << "," << mdl << endl;*/
int proportion =
(int) (fgGetDouble("/sim/traffic-manager/proportion") * 100);
int randval = rand() & 100;
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,
// livery,
// registration,
// heavy,
// acType,
// airline,
// m_class,
// flighttype,
// radius,
// offset,
// score,
// flights));
if (requiredAircraft == "") {
char buffer[16];
snprintf(buffer, 16, "%d", acCounter);
requiredAircraft = buffer;
}
if (homePort == "") {
homePort = departurePort;
}
scheduledAircraft.push_back(new FGAISchedule(mdl,
livery,
homePort,
registration,
requiredAircraft,
heavy,
acType,
airline,
m_class,
flighttype,
radius, offset));
// while(flights.begin() != flights.end()) {
// flights.pop_back();
// }
} else {
cerr << "Skipping : " << randval;
}
acCounter++;
requiredAircraft = "";
homePort = "";
//for (FGScheduledFlightVecIterator flt = flights.begin(); flt != flights.end(); flt++)
// {
// delete (*flt);
// }
//flights.clear();
SG_LOG(SG_GENERAL, SG_BULK, "Reading aircraft : "
<< registration << " with prioritization score " << score);
score = 0;
}
elementValueStack.pop_back();
}
void FGTrafficManager::pi (const char * target, const char * data) {
//cout << "Processing instruction " << target << ' ' << data << endl;
void FGTrafficManager::data(const char *s, int len)
{
string token = string(s, len);
//cout << "Character data " << string(s,len) << endl;
elementValueStack.back() += token;
}
void FGTrafficManager::warning (const char * message, int line, int column) {
SG_LOG(SG_IO, SG_WARN, "Warning: " << message << " (" << line << ',' << column << ')');
void FGTrafficManager::pi(const char *target, const char *data)
{
//cout << "Processing instruction " << target << ' ' << data << endl;
}
void FGTrafficManager::error (const char * message, int line, int column) {
SG_LOG(SG_IO, SG_ALERT, "Error: " << message << " (" << line << ',' << column << ')');
void FGTrafficManager::warning(const char *message, int line, int column)
{
SG_LOG(SG_IO, SG_WARN,
"Warning: " << message << " (" << line << ',' << column << ')');
}
void FGTrafficManager::error(const char *message, int line, int column)
{
SG_LOG(SG_IO, SG_ALERT,
"Error: " << message << " (" << line << ',' << column << ')');
}

View file

@ -65,11 +65,11 @@ public:
unsigned int hits;
};
typedef vector<Heuristic*> heuristicsVector;
typedef vector<Heuristic*>::iterator heuristicsVectorIterator;
typedef vector<Heuristic> heuristicsVector;
typedef vector<Heuristic>::iterator heuristicsVectorIterator;
typedef std::map < std::string, Heuristic *> HeuristicMap;
typedef HeuristicMap::iterator HeuristicMapIterator;
typedef std::map < std::string, Heuristic> HeuristicMap;
typedef HeuristicMap::iterator HeuristicMapIterator;
@ -93,8 +93,8 @@ private:
FGScheduledFlightMap flights;
//void readTimeTableFromFile(SGPath infilename);
//void Tokenize(const string& str, vector<string>& tokens, const string& delimiters = " ");
void readTimeTableFromFile(SGPath infilename);
void Tokenize(const string& str, vector<string>& tokens, const string& delimiters = " ");
public:
FGTrafficManager();