#include <Main/fg_props.hxx>
#include <Main/locale.hxx>
#include <Airports/runways.hxx>
+#include <Airports/groundnetwork.hxx>
#include <Navaids/NavDataCache.hxx>
#include "airport.hxx"
class ParkingAssignment::ParkingAssignmentPrivate
{
public:
- ParkingAssignmentPrivate(FGParking* pk, FGAirport* apt) :
+ ParkingAssignmentPrivate(FGParking* pk, FGAirportDynamics* dyn) :
refCount(0),
parking(pk),
- airport(apt)
+ dynamics(dyn)
{
assert(pk);
- assert(apt);
+ assert(dyn);
retain(); // initial count of 1
}
~ParkingAssignmentPrivate()
{
- airport->getDynamics()->releaseParking(parking->guid());
+ dynamics->releaseParking(parking);
}
void release()
}
unsigned int refCount;
- SGSharedPtr<FGParking> parking;
- SGSharedPtr<FGAirport> airport;
+ FGParkingRef parking;
+ FGAirportDynamicsRef dynamics;
};
ParkingAssignment::ParkingAssignment() :
}
}
-ParkingAssignment::ParkingAssignment(FGParking* pk, FGAirport* apt) :
+ParkingAssignment::ParkingAssignment(FGParking* pk, FGAirportDynamics* dyn) :
_sharedData(NULL)
{
if (pk) {
- _sharedData = new ParkingAssignmentPrivate(pk, apt);
+ _sharedData = new ParkingAssignmentPrivate(pk, dyn);
}
}
{
lastUpdate = 0;
+ groundNetwork.reset(new FGGroundNetwork);
}
// Destructor
FGAirportDynamics::~FGAirportDynamics()
{
+ SG_LOG(SG_AI, SG_INFO, "destroyed dynamics for:" << _ap->ident());
}
// Initialization required after XMLRead
void FGAirportDynamics::init()
{
- groundNetwork.init(_ap);
- groundNetwork.setTowerController(&towerController);
-
+
+ groundNetwork->init(this);
+ groundController.setTowerController(&towerController);
+ groundController.init(this);
}
FGParking* FGAirportDynamics::innerGetAvailableParking(double radius, const string & flType,
const string & airline,
bool skipEmptyAirlineCode)
{
- flightgear::NavDataCache* cache = flightgear::NavDataCache::instance();
- BOOST_FOREACH(PositionedID pk, cache->findAirportParking(_ap->guid(), flType, radius)) {
- if (!isParkingAvailable(pk)) {
- continue;
- }
-
- FGParking* parking = getParking(pk);
- if (skipEmptyAirlineCode && parking->getCodes().empty()) {
- continue;
- }
-
- if (!airline.empty() && !parking->getCodes().empty()) {
- if (parking->getCodes().find(airline, 0) == string::npos) {
- continue;
- }
+ const FGParkingList& parkings(groundNetwork->allParkings());
+ FGParkingList::const_iterator it;
+ for (it = parkings.begin(); it != parkings.end(); ++it) {
+ FGParkingRef parking = *it;
+ if (!isParkingAvailable(parking)) {
+ continue;
+ }
+
+ if (skipEmptyAirlineCode && parking->getCodes().empty()) {
+ continue;
+ }
+
+ if (!airline.empty() && !parking->getCodes().empty()) {
+ if (parking->getCodes().find(airline, 0) == string::npos) {
+ continue;
+ }
+ }
+
+ setParkingAvailable(parking, false);
+ return parking;
}
-
- setParkingAvailable(pk, false);
- return parking;
- }
-
- return NULL;
+
+ return NULL;
}
ParkingAssignment FGAirportDynamics::getAvailableParking(double radius, const string & flType,
// most exact seach - airline codes must be present and match
FGParking* result = innerGetAvailableParking(radius, flType, airline, true);
if (result) {
- return ParkingAssignment(result, _ap);
+ return ParkingAssignment(result, this);
}
// more tolerant - gates with empty airline codes are permitted
result = innerGetAvailableParking(radius, flType, airline, false);
if (result) {
- return ParkingAssignment(result, _ap);
+ return ParkingAssignment(result, this);
}
// fallback - ignore the airline code entirely
result = innerGetAvailableParking(radius, flType, string(), false);
- return result ? ParkingAssignment(result, _ap) : ParkingAssignment();
-}
-
-FGParkingRef FGAirportDynamics::getParking(PositionedID id) const
-{
- return FGPositioned::loadById<FGParking>(id);
-}
-
-string FGAirportDynamics::getParkingName(PositionedID id) const
-{
- FGParking* p = getParking(id);
- if (p) {
- return p->getName();
- }
-
- return string();
+ return result ? ParkingAssignment(result, this) : ParkingAssignment();
}
ParkingAssignment FGAirportDynamics::getParkingByName(const std::string& name) const
{
- PositionedID guid = flightgear::NavDataCache::instance()->airportItemWithIdent(parent()->guid(), FGPositioned::PARKING, name);
- if (guid == 0) {
- return ParkingAssignment();
- }
-
- return ParkingAssignment(getParking(guid), _ap);
+ const FGParkingList& parkings(groundNetwork->allParkings());
+ FGParkingList::const_iterator it;
+ for (it = parkings.begin(); it != parkings.end(); ++it) {
+ if ((*it)->name() == name) {
+ return ParkingAssignment(*it, const_cast<FGAirportDynamics*>(this));
+ }
+ }
+
+ return ParkingAssignment();
}
-void FGAirportDynamics::setParkingAvailable(PositionedID guid, bool available)
+void FGAirportDynamics::setParkingAvailable(FGParking* park, bool available)
{
if (available) {
- releaseParking(guid);
+ releaseParking(park);
} else {
- occupiedParkings.insert(guid);
+ occupiedParkings.insert(park);
}
}
-bool FGAirportDynamics::isParkingAvailable(PositionedID parking) const
+bool FGAirportDynamics::isParkingAvailable(FGParking* parking) const
{
return (occupiedParkings.find(parking) == occupiedParkings.end());
}
-void FGAirportDynamics::releaseParking(PositionedID id)
+void FGAirportDynamics::releaseParking(FGParking* id)
{
ParkingSet::iterator it = occupiedParkings.find(id);
if (it == occupiedParkings.end()) {
occupiedParkings.erase(it);
}
+class GetParkingsPredicate
+{
+ bool mustBeAvailable;
+ std::string type;
+ const FGAirportDynamics* dynamics;
+public:
+ GetParkingsPredicate(bool b, const std::string& ty, const FGAirportDynamics* dyn) :
+ mustBeAvailable(b),
+ type(ty),
+ dynamics(dyn)
+ {}
+
+ bool operator()(const FGParkingRef& park) const
+ {
+ if (!type.empty() && (park->getType() != type))
+ return true;
+
+ if (mustBeAvailable && !dynamics->isParkingAvailable(park)) {
+ return true;
+ }
+
+ return false;
+ }
+};
+
+FGParkingList FGAirportDynamics::getParkings(bool onlyAvailable, const std::string &type) const
+{
+ FGParkingList result(groundNetwork->allParkings());
+
+ GetParkingsPredicate pred(onlyAvailable, type, this);
+ FGParkingList::iterator it = std::remove_if(result.begin(), result.end(), pred);
+ result.erase(it, result.end());
+ return result;
+}
+
void FGAirportDynamics::setRwyUse(const FGRunwayPreference & ref)
{
rwyPrefs = ref;