Make PerformanceDB a real subsystem
This commit is contained in:
parent
e80fc563e5
commit
83ea6d32d0
5 changed files with 100 additions and 30 deletions
|
@ -93,7 +93,11 @@ FGAIAircraft::FGAIAircraft(FGAISchedule *ref) :
|
|||
needsTaxiClearance = false;
|
||||
_needsGroundElevation = true;
|
||||
|
||||
_performance = 0; //TODO initialize to JET_TRANSPORT from PerformanceDB
|
||||
PerformanceDB* perfDB = globals->get_subsystem<PerformanceDB>();
|
||||
if (perfDB) {
|
||||
_performance = perfDB->getDefaultPerformance();
|
||||
}
|
||||
|
||||
dt = 0;
|
||||
takeOffStatus = 0;
|
||||
|
||||
|
@ -144,8 +148,10 @@ void FGAIAircraft::unbind()
|
|||
|
||||
void FGAIAircraft::setPerformance(const std::string& acType, const std::string& acclass)
|
||||
{
|
||||
static PerformanceDB perfdb; //TODO make it a global service
|
||||
_performance = perfdb.getDataFor(acType, acclass);
|
||||
PerformanceDB* perfDB = globals->get_subsystem<PerformanceDB>();
|
||||
if (perfDB) {
|
||||
_performance = perfDB->getDataFor(acType, acclass);
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
|
|
@ -6,10 +6,11 @@
|
|||
|
||||
#include <boost/foreach.hpp>
|
||||
|
||||
#include <simgear/sg_inlines.h>
|
||||
#include <simgear/misc/sg_path.hxx>
|
||||
#include <simgear/props/props.hxx>
|
||||
#include <simgear/props/props_io.hxx>
|
||||
#include <simgear/xml/easyxml.hxx>
|
||||
#include <simgear/structure/exception.hxx>
|
||||
|
||||
#include <Main/globals.hxx>
|
||||
#include <iostream>
|
||||
|
@ -22,17 +23,41 @@ using std::cerr;
|
|||
|
||||
PerformanceDB::PerformanceDB()
|
||||
{
|
||||
SGPath dbpath( globals->get_fg_root() );
|
||||
|
||||
|
||||
dbpath.append( "/AI/Aircraft/" );
|
||||
dbpath.append( "performancedb.xml");
|
||||
load(dbpath);
|
||||
}
|
||||
|
||||
|
||||
PerformanceDB::~PerformanceDB()
|
||||
{}
|
||||
{
|
||||
}
|
||||
|
||||
void PerformanceDB::init()
|
||||
{
|
||||
SGPath dbpath( globals->get_fg_root() );
|
||||
dbpath.append( "/AI/Aircraft/" );
|
||||
dbpath.append( "performancedb.xml");
|
||||
load(dbpath);
|
||||
|
||||
if (getDefaultPerformance() == 0) {
|
||||
SG_LOG(SG_AI, SG_WARN, "PerformanceDB: no default performance data found/loaded");
|
||||
}
|
||||
}
|
||||
|
||||
void PerformanceDB::shutdown()
|
||||
{
|
||||
PerformanceDataDict::iterator it;
|
||||
for (it = _db.begin(); it != _db.end(); ++it) {
|
||||
delete it->second;
|
||||
}
|
||||
|
||||
_db.clear();
|
||||
_aliases.clear();
|
||||
}
|
||||
|
||||
void PerformanceDB::update(double dt)
|
||||
{
|
||||
SG_UNUSED(dt);
|
||||
suspend();
|
||||
}
|
||||
|
||||
void PerformanceDB::registerPerformanceData(const std::string& id, PerformanceData* data) {
|
||||
//TODO if key exists already replace data "inplace", i.e. copy to existing PerfData instance
|
||||
|
@ -40,25 +65,48 @@ void PerformanceDB::registerPerformanceData(const std::string& id, PerformanceDa
|
|||
_db[id] = data;
|
||||
}
|
||||
|
||||
PerformanceData* PerformanceDB::getDataFor(const string& acType, const string& acClass)
|
||||
PerformanceData* PerformanceDB::getDataFor(const string& acType, const string& acClass) const
|
||||
{
|
||||
// first, try with the specific aircraft type, such as 738 or A322
|
||||
if (_db.find(acType) != _db.end()) {
|
||||
return _db[acType];
|
||||
PerformanceDataDict::const_iterator it;
|
||||
it = _db.find(acType);
|
||||
if (it != _db.end()) {
|
||||
return it->second;
|
||||
}
|
||||
|
||||
const string& alias = findAlias(acType);
|
||||
if (_db.find(alias) != _db.end()) {
|
||||
return _db[alias];
|
||||
it = _db.find(alias);
|
||||
if (it != _db.end()) {
|
||||
return it->second;
|
||||
}
|
||||
|
||||
SG_LOG(SG_AI, SG_INFO, "no performance data for " << acType);
|
||||
|
||||
if (_db.find(acClass) == _db.end()) {
|
||||
return _db["jet_transport"];
|
||||
|
||||
it = _db.find(acClass);
|
||||
if (it == _db.end()) {
|
||||
return getDefaultPerformance();
|
||||
}
|
||||
|
||||
return _db[acClass];
|
||||
|
||||
return it->second;
|
||||
}
|
||||
|
||||
PerformanceData* PerformanceDB::getDefaultPerformance() const
|
||||
{
|
||||
PerformanceDataDict::const_iterator it = _db.find("jet_transport");
|
||||
if (it == _db.end())
|
||||
return NULL;
|
||||
|
||||
return it->second;
|
||||
}
|
||||
|
||||
bool PerformanceDB::havePerformanceDataForAircraftType(const std::string& acType) const
|
||||
{
|
||||
PerformanceDataDict::const_iterator it = _db.find(acType);
|
||||
if (it != _db.end())
|
||||
return true;
|
||||
|
||||
const std::string alias(findAlias(acType));
|
||||
return (_db.find(alias) != _db.end());
|
||||
}
|
||||
|
||||
void PerformanceDB::load(const SGPath& filename)
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
class PerformanceData;
|
||||
class SGPath;
|
||||
|
||||
#include <simgear/structure/subsystem_mgr.hxx>
|
||||
|
||||
/**
|
||||
* Registry for performance data.
|
||||
*
|
||||
|
@ -17,24 +19,36 @@ class SGPath;
|
|||
* @author Thomas F<EFBFBD>rster <t.foerster@biologie.hu-berlin.de>
|
||||
*/
|
||||
//TODO provide std::map interface?
|
||||
class PerformanceDB
|
||||
class PerformanceDB : public SGSubsystem
|
||||
{
|
||||
public:
|
||||
PerformanceDB();
|
||||
~PerformanceDB();
|
||||
virtual ~PerformanceDB();
|
||||
|
||||
void registerPerformanceData(const std::string& id, PerformanceData* data);
|
||||
void registerPerformanceData(const std::string& id, const std::string& filename);
|
||||
virtual void init();
|
||||
virtual void shutdown();
|
||||
|
||||
virtual void update(double dt);
|
||||
|
||||
bool havePerformanceDataForAircraftType(const std::string& acType) const;
|
||||
|
||||
/**
|
||||
* get performance data for an aircraft type / class. Type is specific, eg
|
||||
* '738' or 'A319'. Class is more generic, such as 'jet_transport'.
|
||||
*/
|
||||
PerformanceData* getDataFor(const std::string& acType, const std::string& acClass);
|
||||
PerformanceData* getDataFor(const std::string& acType, const std::string& acClass) const;
|
||||
|
||||
PerformanceData* getDefaultPerformance() const;
|
||||
|
||||
static const char* subsystemName() { return "aircraft-performance-db"; }
|
||||
private:
|
||||
void load(const SGPath& path);
|
||||
|
||||
private:
|
||||
std::map<std::string, PerformanceData*> _db;
|
||||
void registerPerformanceData(const std::string& id, PerformanceData* data);
|
||||
|
||||
|
||||
typedef std::map<std::string, PerformanceData*> PerformanceDataDict;
|
||||
PerformanceDataDict _db;
|
||||
|
||||
const std::string& findAlias(const std::string& acType) const;
|
||||
|
||||
|
|
|
@ -43,7 +43,6 @@
|
|||
#include <AIModel/AIAircraft.hxx>
|
||||
#include <AIModel/AIFlightPlan.hxx>
|
||||
#include <AIModel/performancedata.hxx>
|
||||
#include <AIModel/performancedb.hxx>
|
||||
#include <ATC/atc_mgr.hxx>
|
||||
#include <Traffic/TrafficMgr.hxx>
|
||||
#include <Airports/groundnetwork.hxx>
|
||||
|
|
|
@ -103,6 +103,7 @@
|
|||
#include <Model/modelmgr.hxx>
|
||||
#include <AIModel/submodel.hxx>
|
||||
#include <AIModel/AIManager.hxx>
|
||||
#include <AIModel/performancedb.hxx>
|
||||
#include <Navaids/navdb.hxx>
|
||||
#include <Navaids/navlist.hxx>
|
||||
#include <Scenery/scenery.hxx>
|
||||
|
@ -815,6 +816,8 @@ void fgCreateSubsystems(bool duringReset) {
|
|||
////////////////////////////////////////////////////////////////////
|
||||
// Initialize the ATC subsystem
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
globals->add_new_subsystem<PerformanceDB>(SGSubsystemMgr::POST_FDM);
|
||||
globals->add_subsystem("ATC", new FGATCManager, SGSubsystemMgr::POST_FDM);
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
@ -826,7 +829,7 @@ void fgCreateSubsystems(bool duringReset) {
|
|||
////////////////////////////////////////////////////////////////////
|
||||
// Initialise the AI Model Manager
|
||||
////////////////////////////////////////////////////////////////////
|
||||
SG_LOG(SG_GENERAL, SG_INFO, " AI Model Manager");
|
||||
|
||||
globals->add_subsystem("ai-model", new FGAIManager, SGSubsystemMgr::POST_FDM);
|
||||
globals->add_subsystem("submodel-mgr", new FGSubmodelMgr, SGSubsystemMgr::POST_FDM);
|
||||
|
||||
|
|
Loading…
Reference in a new issue