2002-04-03 23:54:44 +00:00
|
|
|
// AIMgr.cxx - implementation of FGAIMgr
|
|
|
|
// - a global management class for FlightGear generated AI traffic
|
|
|
|
//
|
|
|
|
// Written by David Luff, started March 2002.
|
|
|
|
//
|
|
|
|
// Copyright (C) 2002 David C Luff - david.luff@nottingham.ac.uk
|
|
|
|
//
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU General Public License as
|
|
|
|
// published by the Free Software Foundation; either version 2 of the
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful, but
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// General Public License for more details.
|
|
|
|
//
|
|
|
|
// 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.
|
|
|
|
|
2003-03-07 13:58:33 +00:00
|
|
|
#include <Airports/simple.hxx>
|
2002-04-03 23:54:44 +00:00
|
|
|
#include <Main/fgfs.hxx>
|
|
|
|
#include <Main/fg_props.hxx>
|
2003-03-07 13:58:33 +00:00
|
|
|
#include <Main/globals.hxx>
|
|
|
|
#include <Simgear/misc/sg_path.hxx>
|
|
|
|
#include <Simgear/bucket/newbucket.hxx>
|
2002-04-03 23:54:44 +00:00
|
|
|
|
|
|
|
#include <list>
|
|
|
|
|
2003-03-07 13:58:33 +00:00
|
|
|
#ifdef _MSC_VER
|
|
|
|
# include <io.h>
|
|
|
|
#else
|
|
|
|
# include <sys/types.h> // for directory reading
|
|
|
|
# include <dirent.h> // for directory reading
|
|
|
|
#endif
|
|
|
|
|
2002-04-03 23:54:44 +00:00
|
|
|
#include "AIMgr.hxx"
|
|
|
|
#include "AILocalTraffic.hxx"
|
2003-03-07 13:58:33 +00:00
|
|
|
#include "ATCutils.hxx"
|
2002-04-03 23:54:44 +00:00
|
|
|
|
|
|
|
SG_USING_STD(list);
|
2003-03-07 14:06:52 +00:00
|
|
|
SG_USING_STD(cout);
|
2002-04-03 23:54:44 +00:00
|
|
|
|
|
|
|
FGAIMgr::FGAIMgr() {
|
2003-03-07 13:58:33 +00:00
|
|
|
ATC = globals->get_ATC_mgr();
|
2002-04-03 23:54:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
FGAIMgr::~FGAIMgr() {
|
|
|
|
}
|
|
|
|
|
|
|
|
void FGAIMgr::init() {
|
2003-03-07 13:58:33 +00:00
|
|
|
// go through the $FG_ROOT/ATC directory and find all *.taxi files
|
|
|
|
SGPath path(globals->get_fg_root());
|
|
|
|
path.append("ATC/");
|
|
|
|
string dir = path.dir();
|
|
|
|
string ext;
|
|
|
|
string file, f_ident;
|
|
|
|
int pos;
|
|
|
|
|
|
|
|
// WARNING - I (DCL) haven't tested this on MSVC - this is simply cribbed from TerraGear
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
long hfile;
|
|
|
|
struct _finddata_t de;
|
|
|
|
string path_str;
|
|
|
|
|
|
|
|
path_str = dir + "\\*.*";
|
|
|
|
|
|
|
|
if ( ( hfile = _findfirst( path.c_str(), &de ) ) == -1 ) {
|
|
|
|
cout << "cannot open directory " << dir << "\n";
|
|
|
|
} else {
|
|
|
|
// load all .taxi files
|
|
|
|
do {
|
|
|
|
file = de.name;
|
|
|
|
pos = file.find(".");
|
|
|
|
ext = file.substr(pos + 1);
|
|
|
|
if(ext == "taxi") {
|
|
|
|
cout << "TAXI FILE FOUND!!!\n";
|
|
|
|
f_ident = file.substr(0, pos);
|
|
|
|
FGAirport a;
|
|
|
|
if(dclFindAirportID(f_ident, &a)) {
|
|
|
|
SGBucket sgb(a.longitude, a.latitude);
|
|
|
|
int idx = sgb.gen_index();
|
|
|
|
airports[idx] = f_ident;
|
|
|
|
cout << "Mapping " << f_ident << " to bucket " << idx << '\n';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} while ( _findnext( hfile, &de ) == 0 );
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
|
|
|
|
DIR *d;
|
|
|
|
struct dirent *de;
|
|
|
|
|
|
|
|
if ( (d = opendir( dir.c_str() )) == NULL ) {
|
|
|
|
cout << "cannot open directory " << dir << "\n";
|
|
|
|
} else {
|
|
|
|
cout << "Opened directory " << dir << " OK :-)\n";
|
|
|
|
cout << "Contents are:\n";
|
|
|
|
// load all .taxi files
|
|
|
|
while ( (de = readdir(d)) != NULL ) {
|
|
|
|
file = de->d_name;
|
|
|
|
pos = file.find(".");
|
|
|
|
cout << file << '\n';
|
|
|
|
|
|
|
|
ext = file.substr(pos + 1);
|
|
|
|
if(ext == "taxi") {
|
|
|
|
cout << "TAXI FILE FOUND!!!\n";
|
|
|
|
f_ident = file.substr(0, pos);
|
|
|
|
FGAirport a;
|
|
|
|
if(dclFindAirportID(f_ident, &a)) {
|
|
|
|
SGBucket sgb(a.longitude, a.latitude);
|
|
|
|
int idx = sgb.gen_index();
|
|
|
|
airports[idx] = f_ident;
|
|
|
|
cout << "Mapping " << f_ident << " to bucket " << idx << '\n';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
closedir(d);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2002-12-04 20:03:18 +00:00
|
|
|
// Hard wire some local traffic for now.
|
|
|
|
// This is regardless of location and hence *very* ugly but it is a start.
|
2003-03-07 13:58:33 +00:00
|
|
|
ATC->AIRegisterAirport("KEMT");
|
2002-12-04 20:03:18 +00:00
|
|
|
FGAILocalTraffic* local_traffic = new FGAILocalTraffic;
|
2003-03-05 21:38:29 +00:00
|
|
|
//local_traffic->Init("KEMT", IN_PATTERN, TAKEOFF_ROLL);
|
|
|
|
local_traffic->Init("KEMT");
|
2002-12-04 20:03:18 +00:00
|
|
|
local_traffic->FlyCircuits(1, true); // Fly 2 circuits with touch & go in between
|
|
|
|
ai_list.push_back(local_traffic);
|
2002-04-03 23:54:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void FGAIMgr::bind() {
|
|
|
|
}
|
|
|
|
|
|
|
|
void FGAIMgr::unbind() {
|
|
|
|
}
|
|
|
|
|
2002-10-02 15:27:49 +00:00
|
|
|
void FGAIMgr::update(double dt) {
|
2002-12-04 20:03:18 +00:00
|
|
|
// Don't update any planes for first 50 runs through - this avoids some possible initialisation anomalies
|
|
|
|
static int i = 0;
|
|
|
|
if(i < 50) {
|
2003-03-05 21:38:29 +00:00
|
|
|
i++;
|
2002-12-04 20:03:18 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Traverse the list of active planes and run all their update methods
|
2003-03-05 21:38:29 +00:00
|
|
|
// TODO - spread the load - not all planes should need updating every frame.
|
|
|
|
// Note that this will require dt to be calculated for each plane though
|
|
|
|
// since they rely on it to calculate distance travelled.
|
2002-12-04 20:03:18 +00:00
|
|
|
ai_list_itr = ai_list.begin();
|
|
|
|
while(ai_list_itr != ai_list.end()) {
|
|
|
|
(*ai_list_itr)->Update(dt);
|
|
|
|
++ai_list_itr;
|
|
|
|
}
|
2002-04-04 01:32:00 +00:00
|
|
|
}
|