1
0
Fork 0

Add airport dynamics manager

- decouple dynamic airport data from the static (nav-db) data.
This commit is contained in:
James Turner 2015-12-05 00:25:29 +00:00
parent fc887b106b
commit 2af076e6cb
18 changed files with 242 additions and 65 deletions

View file

@ -27,6 +27,7 @@
#include <iostream> #include <iostream>
#include <Airports/dynamics.hxx> #include <Airports/dynamics.hxx>
#include <Airports/airportdynamicsmanager.hxx>
#include <Airports/airport.hxx> #include <Airports/airport.hxx>
#include <Scenery/scenery.hxx> #include <Scenery/scenery.hxx>
#include "atc_mgr.hxx" #include "atc_mgr.hxx"
@ -102,17 +103,17 @@ void FGATCManager::init() {
//time_t deptime = 0; // just make sure how flightplan processing is affected by this... //time_t deptime = 0; // just make sure how flightplan processing is affected by this...
FGAirport *apt = FGAirport::findByIdent(airport); FGAirportDynamicsRef dcs(flightgear::AirportDynamicsManager::find(airport));
if (apt && onGround) {// && !runway.empty()) { if (dcs && onGround) {// && !runway.empty()) {
FGAirportDynamics* dcs = apt->getDynamics();
ParkingAssignment pk(dcs->getParkingByName(parking)); ParkingAssignment pk(dcs->getParkingByName(parking));
// No valid parking location, so either at the runway or at a random location. // No valid parking location, so either at the runway or at a random location.
if (pk.isValid()) { if (pk.isValid()) {
dcs->setParkingAvailable(pk.parking(), false); dcs->setParkingAvailable(pk.parking(), false);
fp = new FGAIFlightPlan; fp = new FGAIFlightPlan;
controller = apt->getDynamics()->getStartupController(); controller = dcs->getStartupController();
int stationFreq = apt->getDynamics()->getGroundFrequency(1); int stationFreq = dcs->getGroundFrequency(1);
if (stationFreq > 0) if (stationFreq > 0)
{ {
//cerr << "Setting radio frequency to : " << stationFreq << endl; //cerr << "Setting radio frequency to : " << stationFreq << endl;
@ -128,7 +129,7 @@ void FGATCManager::init() {
fp->setGate(pk); fp->setGate(pk);
if (!(fp->createPushBack(&ai_ac, if (!(fp->createPushBack(&ai_ac,
false, false,
apt, dcs->parent(),
aircraftRadius, aircraftRadius,
fltType, fltType,
aircraftType, aircraftType,
@ -140,8 +141,8 @@ void FGATCManager::init() {
} else if (!runway.empty()) { } else if (!runway.empty()) {
controller = apt->getDynamics()->getTowerController(); controller = dcs->getTowerController();
int stationFreq = apt->getDynamics()->getTowerFrequency(2); int stationFreq = dcs->getTowerFrequency(2);
if (stationFreq > 0) if (stationFreq > 0)
{ {
//cerr << "Setting radio frequency to in airfrequency: " << stationFreq << endl; //cerr << "Setting radio frequency to in airfrequency: " << stationFreq << endl;
@ -151,7 +152,7 @@ void FGATCManager::init() {
leg = 3; leg = 3;
string fltType = "ga"; string fltType = "ga";
fp->setRunway(runway); fp->setRunway(runway);
fp->createTakeOff(&ai_ac, false, apt, 0, fltType); fp->createTakeOff(&ai_ac, false, dcs->parent(), 0, fltType);
ai_ac.setTakeOffStatus(2); ai_ac.setTakeOffStatus(2);
} else { } else {
// We're on the ground somewhere. Handle this case later. // We're on the ground somewhere. Handle this case later.
@ -189,6 +190,15 @@ void FGATCManager::addController(FGATCController *controller) {
activeStations.push_back(controller); activeStations.push_back(controller);
} }
void FGATCManager::removeController(FGATCController *controller)
{
AtcVecIterator it;
it = std::find(activeStations.begin(), activeStations.end(), controller);
if (it != activeStations.end()) {
activeStations.erase(it);
}
}
void FGATCManager::update ( double time ) { void FGATCManager::update ( double time ) {
//cerr << "ATC update code is running at time: " << time << endl; //cerr << "ATC update code is running at time: " << time << endl;
// Test code: let my virtual co-pilot handle ATC: // Test code: let my virtual co-pilot handle ATC:

View file

@ -59,6 +59,7 @@ public:
~FGATCManager(); ~FGATCManager();
void init(); void init();
void addController(FGATCController *controller); void addController(FGATCController *controller);
void removeController(FGATCController* controller);
void update(double time); void update(double time);
}; };

View file

@ -490,7 +490,8 @@ FGATCController::FGATCController()
FGATCController::~FGATCController() FGATCController::~FGATCController()
{ {
//cerr << "running FGATController destructor" << endl; FGATCManager *mgr = (FGATCManager*) globals->get_subsystem("ATC");
mgr->removeController(this);
} }
string FGATCController::getGateName(FGAIAircraft * ref) string FGATCController::getGateName(FGAIAircraft * ref)

View file

@ -15,6 +15,7 @@ set(SOURCES
sidstar.cxx sidstar.cxx
airport.cxx airport.cxx
xmlloader.cxx xmlloader.cxx
airportdynamicsmanager.cxx
) )
set(HEADERS set(HEADERS
@ -33,6 +34,7 @@ set(HEADERS
sidstar.hxx sidstar.hxx
airport.hxx airport.hxx
xmlloader.hxx xmlloader.hxx
airportdynamicsmanager.hxx
) )
flightgear_component(Airports "${SOURCES}" "${HEADERS}") flightgear_component(Airports "${SOURCES}" "${HEADERS}")

View file

@ -46,8 +46,9 @@
#include <Main/fg_props.hxx> #include <Main/fg_props.hxx>
#include <Airports/runways.hxx> #include <Airports/runways.hxx>
#include <Airports/pavement.hxx> #include <Airports/pavement.hxx>
#include <Airports/dynamics.hxx>
#include <Airports/xmlloader.hxx> #include <Airports/xmlloader.hxx>
#include <Airports/dynamics.hxx>
#include <Airports/airportdynamicsmanager.hxx>
#include <Navaids/procedure.hxx> #include <Navaids/procedure.hxx>
#include <Navaids/waypoint.hxx> #include <Navaids/waypoint.hxx>
#include <ATC/CommStation.hxx> #include <ATC/CommStation.hxx>
@ -74,7 +75,6 @@ FGAirport::FGAirport( PositionedID aGuid,
FGPositioned(aGuid, aType, id, location), FGPositioned(aGuid, aType, id, location),
_name(name), _name(name),
_has_metar(has_metar), _has_metar(has_metar),
_dynamics(0),
mTowerDataLoaded(false), mTowerDataLoaded(false),
mHasTower(false), mHasTower(false),
mRunwaysLoaded(false), mRunwaysLoaded(false),
@ -90,8 +90,6 @@ FGAirport::FGAirport( PositionedID aGuid,
FGAirport::~FGAirport() FGAirport::~FGAirport()
{ {
SG_LOG(SG_NAVAID, SG_INFO, "deleting airport:" << ident());
delete _dynamics;
} }
bool FGAirport::isAirport() const bool FGAirport::isAirport() const
@ -118,23 +116,6 @@ bool FGAirport::isAirportType(FGPositioned* pos)
return (pos->type() >= AIRPORT) && (pos->type() <= SEAPORT); return (pos->type() >= AIRPORT) && (pos->type() <= SEAPORT);
} }
FGAirportDynamics * FGAirport::getDynamics()
{
if (_dynamics) {
return _dynamics;
}
_dynamics = new FGAirportDynamics(this);
XMLLoader::load(_dynamics);
_dynamics->init();
FGRunwayPreference rwyPrefs(this);
XMLLoader::load(&rwyPrefs);
_dynamics->setRwyUse(rwyPrefs);
return _dynamics;
}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
unsigned int FGAirport::numRunways() const unsigned int FGAirport::numRunways() const
{ {
@ -983,6 +964,11 @@ void FGAirport::sortBySize(FGPositionedList& airportList)
} }
} }
FGAirportDynamicsRef FGAirport::getDynamics() const
{
return flightgear::AirportDynamicsManager::find(const_cast<FGAirport*>(this));
}
// get airport elevation // get airport elevation
double fgGetAirportElev( const std::string& id ) double fgGetAirportElev( const std::string& id )
{ {

View file

@ -89,7 +89,7 @@ class FGAirport : public FGPositioned
FGRunwayRef getActiveRunwayForUsage() const; FGRunwayRef getActiveRunwayForUsage() const;
FGAirportDynamics *getDynamics(); FGAirportDynamicsRef getDynamics() const;
unsigned int numRunways() const; unsigned int numRunways() const;
unsigned int numHelipads() const; unsigned int numHelipads() const;
@ -323,7 +323,6 @@ private:
std::string _name; std::string _name;
bool _has_metar; bool _has_metar;
FGAirportDynamics *_dynamics;
void loadRunways() const; void loadRunways() const;
void loadHelipads() const; void loadHelipads() const;

View file

@ -0,0 +1,107 @@
// airportdynamicsmanager.cxx - manager for dynamic (changeable)
// part of airport state
//
// Written by James Turner, started December 2015
//
// Copyright (C) 2015 James Turner <zakalawe@mac.com>
//
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "airportdynamicsmanager.hxx"
#include <simgear/structure/exception.hxx>
#include "airport.hxx"
#include "xmlloader.hxx"
#include "dynamics.hxx"
#include "runwayprefs.hxx"
#include <Main/globals.hxx>
namespace flightgear
{
AirportDynamicsManager::AirportDynamicsManager()
{
}
AirportDynamicsManager::~AirportDynamicsManager()
{
}
void AirportDynamicsManager::init()
{
}
void AirportDynamicsManager::shutdown()
{
m_dynamics.clear();
}
void AirportDynamicsManager::update(double dt)
{
SG_UNUSED(dt);
}
void AirportDynamicsManager::reinit()
{
shutdown();
init();
}
FGAirportDynamicsRef AirportDynamicsManager::dynamicsForICAO(const std::string &icao)
{
ICAODynamicsDict::iterator it = m_dynamics.find(icao);
if (it != m_dynamics.end()) {
return it->second;
}
FGAirportRef apt(FGAirport::findByIdent(icao));
if (!apt)
throw sg_exception("dynamicsForICAO: Invalid ICAO:" + icao);
FGAirportDynamicsRef d(new FGAirportDynamics(apt));
XMLLoader::load(d.ptr());
d->init();
FGRunwayPreference rwyPrefs(apt);
XMLLoader::load(&rwyPrefs);
d->setRwyUse(rwyPrefs);
m_dynamics[icao] = d;
return d;
}
FGAirportDynamicsRef AirportDynamicsManager::find(const std::string &icao)
{
AirportDynamicsManager* instance = static_cast<AirportDynamicsManager*>(globals->get_subsystem("airport-dynamics"));
if (!instance)
return FGAirportDynamicsRef();
return instance->dynamicsForICAO(icao);
}
FGAirportDynamicsRef AirportDynamicsManager::find(const FGAirportRef& apt)
{
return find(apt->ident());
}
} // of namespace flightgear

View file

@ -0,0 +1,58 @@
// airportdynamicsmanager.hxx - manager for dynamic (changeable)
// part of airport state
//
// Written by James Turner, started December 2015
//
// Copyright (C) 2015 James Turner <zakalawe@mac.com>
//
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#ifndef AIRPORTDYNAMICSMANAGER_H
#define AIRPORTDYNAMICSMANAGER_H
#include <simgear/structure/subsystem_mgr.hxx>
#include <simgear/structure/SGSharedPtr.hxx>
#include <map>
#include "airports_fwd.hxx"
namespace flightgear
{
class AirportDynamicsManager : public SGSubsystem
{
public:
AirportDynamicsManager();
virtual ~AirportDynamicsManager();
virtual void init();
virtual void shutdown();
virtual void update (double dt);
virtual void reinit();
static FGAirportDynamicsRef find(const std::string& icao);
static FGAirportDynamicsRef find(const FGAirportRef& apt);
FGAirportDynamicsRef dynamicsForICAO(const std::string& icao);
private:
typedef std::map<std::string, FGAirportDynamicsRef> ICAODynamicsDict;
ICAODynamicsDict m_dynamics;
};
} // of namespace
#endif // AIRPORTDYNAMICSMANAGER_H

View file

@ -79,6 +79,7 @@ typedef SGSharedPtr<FGHelipad> FGHelipadRef;
typedef SGSharedPtr<FGTaxiway> FGTaxiwayRef; typedef SGSharedPtr<FGTaxiway> FGTaxiwayRef;
typedef SGSharedPtr<FGPavement> FGPavementRef; typedef SGSharedPtr<FGPavement> FGPavementRef;
typedef SGSharedPtr<FGParking> FGParkingRef; typedef SGSharedPtr<FGParking> FGParkingRef;
typedef SGSharedPtr<FGAirportDynamics> FGAirportDynamicsRef;
typedef std::vector<FGRunwayRef> FGRunwayList; typedef std::vector<FGRunwayRef> FGRunwayList;
typedef std::map<std::string, FGRunwayRef> FGRunwayMap; typedef std::map<std::string, FGRunwayRef> FGRunwayMap;

View file

@ -53,19 +53,19 @@ using std::random_shuffle;
class ParkingAssignment::ParkingAssignmentPrivate class ParkingAssignment::ParkingAssignmentPrivate
{ {
public: public:
ParkingAssignmentPrivate(FGParking* pk, FGAirport* apt) : ParkingAssignmentPrivate(FGParking* pk, FGAirportDynamics* dyn) :
refCount(0), refCount(0),
parking(pk), parking(pk),
airport(apt) dynamics(dyn)
{ {
assert(pk); assert(pk);
assert(apt); assert(dyn);
retain(); // initial count of 1 retain(); // initial count of 1
} }
~ParkingAssignmentPrivate() ~ParkingAssignmentPrivate()
{ {
airport->getDynamics()->releaseParking(parking); dynamics->releaseParking(parking);
} }
void release() void release()
@ -82,7 +82,7 @@ public:
unsigned int refCount; unsigned int refCount;
FGParkingRef parking; FGParkingRef parking;
FGAirportRef airport; FGAirportDynamicsRef dynamics;
}; };
ParkingAssignment::ParkingAssignment() : ParkingAssignment::ParkingAssignment() :
@ -97,11 +97,11 @@ ParkingAssignment::~ParkingAssignment()
} }
} }
ParkingAssignment::ParkingAssignment(FGParking* pk, FGAirport* apt) : ParkingAssignment::ParkingAssignment(FGParking* pk, FGAirportDynamics* dyn) :
_sharedData(NULL) _sharedData(NULL)
{ {
if (pk) { if (pk) {
_sharedData = new ParkingAssignmentPrivate(pk, apt); _sharedData = new ParkingAssignmentPrivate(pk, dyn);
} }
} }
@ -164,13 +164,14 @@ FGAirportDynamics::FGAirportDynamics(FGAirport * ap):
// Destructor // Destructor
FGAirportDynamics::~FGAirportDynamics() FGAirportDynamics::~FGAirportDynamics()
{ {
SG_LOG(SG_AI, SG_INFO, "destroyed dynamics for:" << _ap->ident());
} }
// Initialization required after XMLRead // Initialization required after XMLRead
void FGAirportDynamics::init() void FGAirportDynamics::init()
{ {
groundNetwork.init(_ap); groundNetwork.init(this);
groundNetwork.setTowerController(&towerController); groundNetwork.setTowerController(&towerController);
} }
@ -213,18 +214,18 @@ ParkingAssignment FGAirportDynamics::getAvailableParking(double radius, const st
// most exact seach - airline codes must be present and match // most exact seach - airline codes must be present and match
FGParking* result = innerGetAvailableParking(radius, flType, airline, true); FGParking* result = innerGetAvailableParking(radius, flType, airline, true);
if (result) { if (result) {
return ParkingAssignment(result, _ap); return ParkingAssignment(result, this);
} }
// more tolerant - gates with empty airline codes are permitted // more tolerant - gates with empty airline codes are permitted
result = innerGetAvailableParking(radius, flType, airline, false); result = innerGetAvailableParking(radius, flType, airline, false);
if (result) { if (result) {
return ParkingAssignment(result, _ap); return ParkingAssignment(result, this);
} }
// fallback - ignore the airline code entirely // fallback - ignore the airline code entirely
result = innerGetAvailableParking(radius, flType, string(), false); result = innerGetAvailableParking(radius, flType, string(), false);
return result ? ParkingAssignment(result, _ap) : ParkingAssignment(); return result ? ParkingAssignment(result, this) : ParkingAssignment();
} }
ParkingAssignment FGAirportDynamics::getParkingByName(const std::string& name) const ParkingAssignment FGAirportDynamics::getParkingByName(const std::string& name) const
@ -233,7 +234,7 @@ ParkingAssignment FGAirportDynamics::getParkingByName(const std::string& name) c
FGParkingList::const_iterator it; FGParkingList::const_iterator it;
for (it = parkings.begin(); it != parkings.end(); ++it) { for (it = parkings.begin(); it != parkings.end(); ++it) {
if ((*it)->name() == name) { if ((*it)->name() == name) {
return ParkingAssignment(*it, _ap); return ParkingAssignment(*it, const_cast<FGAirportDynamics*>(this));
} }
} }

View file

@ -24,6 +24,8 @@
#include <set> #include <set>
#include <simgear/structure/SGReferenced.hxx>
#include <ATC/trafficcontrol.hxx> #include <ATC/trafficcontrol.hxx>
#include "airports_fwd.hxx" #include "airports_fwd.hxx"
#include "parking.hxx" #include "parking.hxx"
@ -37,7 +39,7 @@ public:
~ParkingAssignment(); ~ParkingAssignment();
// create a parking assignment (and mark it as unavailable) // create a parking assignment (and mark it as unavailable)
ParkingAssignment(FGParking* pk, FGAirport* apt); ParkingAssignment(FGParking* pk, FGAirportDynamics* apt);
ParkingAssignment(const ParkingAssignment& aOther); ParkingAssignment(const ParkingAssignment& aOther);
void operator=(const ParkingAssignment& aOther); void operator=(const ParkingAssignment& aOther);
@ -53,7 +55,8 @@ private:
ParkingAssignmentPrivate* _sharedData; ParkingAssignmentPrivate* _sharedData;
}; };
class FGAirportDynamics { class FGAirportDynamics : public SGReferenced
{
private: private:
FGAirport* _ap; FGAirport* _ap;
@ -140,7 +143,6 @@ public:
bool isParkingAvailable(FGParking* parking) const; bool isParkingAvailable(FGParking* parking) const;
FGParkingRef getParking(FGParking* i) const;
void releaseParking(FGParking* id); void releaseParking(FGParking* id);
FGParkingList getParkings(bool onlyAvailable, const std::string& type) const; FGParkingList getParkings(bool onlyAvailable, const std::string& type) const;

View file

@ -175,7 +175,8 @@ bool compare_trafficrecords(FGTrafficRecord a, FGTrafficRecord b)
} }
FGGroundNetwork::FGGroundNetwork() : FGGroundNetwork::FGGroundNetwork() :
parent(NULL) dynamics(NULL),
parent(NULL)
{ {
hasNetwork = false; hasNetwork = false;
totalDistance = 0; totalDistance = 0;
@ -199,7 +200,7 @@ FGGroundNetwork::~FGGroundNetwork()
// owning references to ground-net nodes will also drop // owning references to ground-net nodes will also drop
} }
void FGGroundNetwork::init(FGAirport* pr) void FGGroundNetwork::init(FGAirportDynamics* dyn)
{ {
if (networkInitialized) { if (networkInitialized) {
SG_LOG(SG_GENERAL, SG_WARN, "duplicate ground-network init"); SG_LOG(SG_GENERAL, SG_WARN, "duplicate ground-network init");
@ -207,7 +208,8 @@ void FGGroundNetwork::init(FGAirport* pr)
return; return;
} }
parent = pr; dynamics = dyn;
parent = dyn->parent();
assert(parent); assert(parent);
hasNetwork = true; hasNetwork = true;
nextSave = 0; nextSave = 0;
@ -407,8 +409,8 @@ void FGGroundNetwork::announcePosition(int id,
FGAIAircraft * aircraft) FGAIAircraft * aircraft)
{ {
assert(parent); assert(dynamics);
init(parent); init(dynamics);
TrafficVectorIterator i = activeTraffic.begin(); TrafficVectorIterator i = activeTraffic.begin();
// Search search if the current id alread has an entry // Search search if the current id alread has an entry
@ -495,11 +497,11 @@ bool FGGroundNetwork::checkTransmissionState(int minState, int maxState, Traffic
FGATCDialogNew::instance()->removeEntry(1); FGATCDialogNew::instance()->removeEntry(1);
} else { } else {
//cerr << "creating message for " << i->getAircraft()->getCallSign() << endl; //cerr << "creating message for " << i->getAircraft()->getCallSign() << endl;
transmit(&(*i), &(*parent->getDynamics()), msgId, msgDir, false); transmit(&(*i), dynamics, msgId, msgDir, false);
return false; return false;
} }
} }
transmit(&(*i), &(*parent->getDynamics()), msgId, msgDir, true); transmit(&(*i), dynamics, msgId, msgDir, true);
i->updateState(); i->updateState();
lastTransmission = now; lastTransmission = now;
available = false; available = false;
@ -846,11 +848,11 @@ void FGGroundNetwork::checkHoldPosition(int id, double lat,
if ((origStatus != currStatus) && available) { if ((origStatus != currStatus) && available) {
//cerr << "Issueing hold short instrudtion " << currStatus << " " << available << endl; //cerr << "Issueing hold short instrudtion " << currStatus << " " << available << endl;
if (currStatus == true) { // No has a hold short instruction if (currStatus == true) { // No has a hold short instruction
transmit(&(*current), &(*parent->getDynamics()), MSG_HOLD_POSITION, ATC_GROUND_TO_AIR, true); transmit(&(*current), dynamics, MSG_HOLD_POSITION, ATC_GROUND_TO_AIR, true);
//cerr << "Transmittin hold short instrudtion " << currStatus << " " << available << endl; //cerr << "Transmittin hold short instrudtion " << currStatus << " " << available << endl;
current->setState(1); current->setState(1);
} else { } else {
transmit(&(*current), &(*parent->getDynamics()), MSG_RESUME_TAXI, ATC_GROUND_TO_AIR, true); transmit(&(*current), dynamics, MSG_RESUME_TAXI, ATC_GROUND_TO_AIR, true);
//cerr << "Transmittig resume instrudtion " << currStatus << " " << available << endl; //cerr << "Transmittig resume instrudtion " << currStatus << " " << available << endl;
current->setState(2); current->setState(2);
} }
@ -1305,8 +1307,8 @@ void FGGroundNetwork::update(double dt)
//sort(activeTraffic.begin(), activeTraffic.end(), compare_trafficrecords); //sort(activeTraffic.begin(), activeTraffic.end(), compare_trafficrecords);
// Handle traffic that is under ground control first; this way we'll prevent clutter at the gate areas. // Handle traffic that is under ground control first; this way we'll prevent clutter at the gate areas.
// Don't allow an aircraft to pushback when a taxiing aircraft is currently using part of the intended route. // Don't allow an aircraft to pushback when a taxiing aircraft is currently using part of the intended route.
for (TrafficVectorIterator i = parent->getDynamics()->getStartupController()->getActiveTraffic().begin(); for (TrafficVectorIterator i = dynamics->getStartupController()->getActiveTraffic().begin();
i != parent->getDynamics()->getStartupController()->getActiveTraffic().end(); i++) { i != dynamics->getStartupController()->getActiveTraffic().end(); i++) {
i->allowPushBack(); i->allowPushBack();
i->setPriority(priority++); i->setPriority(priority++);
// in meters per second; // in meters per second;

View file

@ -177,6 +177,7 @@ class FGGroundNetwork : public FGATCController
private: private:
friend class FGAirportDynamicsXMLLoader; friend class FGAirportDynamicsXMLLoader;
FGAirportDynamics* dynamics; // weak back-pointer to our owner
bool hasNetwork; bool hasNetwork;
bool networkInitialized; bool networkInitialized;
time_t nextSave; time_t nextSave;
@ -218,7 +219,7 @@ public:
void setVersion (int v) { version = v;}; void setVersion (int v) { version = v;};
int getVersion() { return version; }; int getVersion() { return version; };
void init(FGAirport* pr); void init(FGAirportDynamics* pr);
bool exists() { bool exists() {
return hasNetwork; return hasNetwork;
}; };

View file

@ -49,9 +49,9 @@ void XMLLoader::load(FGAirportDynamics* d)
return; return;
} }
SG_LOG(SG_NAVAID, SG_INFO, "reading groundnet data from " << path); SG_LOG(SG_NAVAID, SG_INFO, "reading groundnet data from " << path);
SGTimeStamp t; SGTimeStamp t;
t.stamp();
try { try {
FGAirportDynamicsXMLLoader visitor(d); FGAirportDynamicsXMLLoader visitor(d);
readXML(path.str(), visitor); readXML(path.str(), visitor);

View file

@ -80,6 +80,7 @@
#include <Airports/runways.hxx> #include <Airports/runways.hxx>
#include <Airports/airport.hxx> #include <Airports/airport.hxx>
#include <Airports/dynamics.hxx> #include <Airports/dynamics.hxx>
#include <Airports/airportdynamicsmanager.hxx>
#include <AIModel/AIManager.hxx> #include <AIModel/AIManager.hxx>
@ -712,6 +713,11 @@ void fgCreateSubsystems(bool duringReset) {
globals->add_subsystem("properties", new FGProperties); globals->add_subsystem("properties", new FGProperties);
////////////////////////////////////////////////////////////////////
// Add the FlightGear property utilities.
////////////////////////////////////////////////////////////////////
globals->add_subsystem("airport-dynamics", new flightgear::AirportDynamicsManager);
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Add the performance monitoring system. // Add the performance monitoring system.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////

View file

@ -196,7 +196,7 @@ static bool fgSetPosFromAirportIDandParkpos( const string& id, const string& par
SG_LOG( SG_GENERAL, SG_ALERT, "Failed to find airport " << id ); SG_LOG( SG_GENERAL, SG_ALERT, "Failed to find airport " << id );
return false; return false;
} }
FGAirportDynamics* dcs = apt->getDynamics(); FGAirportDynamicsRef dcs = apt->getDynamics();
if (!dcs) { if (!dcs) {
SG_LOG( SG_GENERAL, SG_ALERT, SG_LOG( SG_GENERAL, SG_ALERT,
"Airport " << id << "does not appear to have parking information available"); "Airport " << id << "does not appear to have parking information available");

View file

@ -1351,7 +1351,7 @@ static naRef f_airport_parking(naContext c, naRef me, int argc, naRef* args)
onlyAvailable = (args[1].num != 0.0); onlyAvailable = (args[1].num != 0.0);
} }
FGAirportDynamics* dynamics = apt->getDynamics(); FGAirportDynamicsRef dynamics = apt->getDynamics();
FGParkingList parkings = dynamics->getParkings(onlyAvailable, type); FGParkingList parkings = dynamics->getParkings(onlyAvailable, type);
FGParkingList::const_iterator it; FGParkingList::const_iterator it;
for (it = parkings.begin(); it != parkings.end(); ++it) { for (it = parkings.begin(); it != parkings.end(); ++it) {

View file

@ -208,7 +208,7 @@ f_airport_parking(FGAirport& apt, nasal::CallContext ctx)
{ {
std::string type = ctx.getArg<std::string>(0); std::string type = ctx.getArg<std::string>(0);
bool only_available = ctx.getArg<bool>(1); bool only_available = ctx.getArg<bool>(1);
FGAirportDynamics* dynamics = apt.getDynamics(); FGAirportDynamicsRef dynamics = apt.getDynamics();
return dynamics->getParkings(only_available, type); return dynamics->getParkings(only_available, type);
} }