Broadcast suspend/resume/reinit through the manager and its groups.
This commit is contained in:
parent
ea543c1210
commit
b2518a0056
2 changed files with 105 additions and 1 deletions
|
@ -1,6 +1,7 @@
|
||||||
#include "fgfs.hxx"
|
#include "fgfs.hxx"
|
||||||
|
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
|
#include <simgear/misc/exception.hxx>
|
||||||
|
|
||||||
#include "globals.hxx"
|
#include "globals.hxx"
|
||||||
#include "fg_props.hxx"
|
#include "fg_props.hxx"
|
||||||
|
@ -90,6 +91,13 @@ FGSubsystemGroup::init ()
|
||||||
_members[i]->subsystem->init();
|
_members[i]->subsystem->init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FGSubsystemGroup::reinit ()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < _members.size(); i++)
|
||||||
|
_members[i]->subsystem->reinit();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
FGSubsystemGroup::bind ()
|
FGSubsystemGroup::bind ()
|
||||||
{
|
{
|
||||||
|
@ -113,6 +121,28 @@ FGSubsystemGroup::update (double delta_time_sec)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FGSubsystemGroup::suspend ()
|
||||||
|
{
|
||||||
|
FGSubsystem::suspend();
|
||||||
|
for (int i = 0; i < _members.size(); i++)
|
||||||
|
_members[i]->subsystem->suspend();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FGSubsystemGroup::resume ()
|
||||||
|
{
|
||||||
|
FGSubsystem::resume();
|
||||||
|
for (int i = 0; i < _members.size(); i++)
|
||||||
|
_members[i]->subsystem->resume();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
FGSubsystemGroup::is_suspended () const
|
||||||
|
{
|
||||||
|
return FGSubsystem::is_suspended();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
FGSubsystemGroup::set_subsystem (const string &name, FGSubsystem * subsystem,
|
FGSubsystemGroup::set_subsystem (const string &name, FGSubsystem * subsystem,
|
||||||
double min_step_sec)
|
double min_step_sec)
|
||||||
|
@ -226,6 +256,13 @@ FGSubsystemMgr::init ()
|
||||||
_groups[i].init();
|
_groups[i].init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FGSubsystemMgr::reinit ()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < MAX_GROUPS; i++)
|
||||||
|
_groups[i].reinit();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
FGSubsystemMgr::bind ()
|
FGSubsystemMgr::bind ()
|
||||||
{
|
{
|
||||||
|
@ -249,12 +286,40 @@ FGSubsystemMgr::update (double delta_time_sec)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FGSubsystemMgr::suspend ()
|
||||||
|
{
|
||||||
|
FGSubsystem::suspend();
|
||||||
|
for (int i = 0; i < MAX_GROUPS; i++)
|
||||||
|
_groups[i].suspend();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FGSubsystemMgr::resume ()
|
||||||
|
{
|
||||||
|
FGSubsystem::resume();
|
||||||
|
for (int i = 0; i < MAX_GROUPS; i++)
|
||||||
|
_groups[i].resume();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
FGSubsystemMgr::is_suspended () const
|
||||||
|
{
|
||||||
|
return FGSubsystem::is_suspended();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
FGSubsystemMgr::add (GroupType group, const string &name,
|
FGSubsystemMgr::add (GroupType group, const string &name,
|
||||||
FGSubsystem * subsystem, double min_time_sec)
|
FGSubsystem * subsystem, double min_time_sec)
|
||||||
{
|
{
|
||||||
SG_LOG(SG_GENERAL, SG_INFO, "Adding subsystem " << name);
|
SG_LOG(SG_GENERAL, SG_INFO, "Adding subsystem " << name);
|
||||||
get_group(group)->set_subsystem(name, subsystem, min_time_sec);
|
get_group(group)->set_subsystem(name, subsystem, min_time_sec);
|
||||||
|
|
||||||
|
if (_subsystem_map.find(name) != _subsystem_map.end()) {
|
||||||
|
SG_LOG(SG_GENERAL, SG_ALERT, "Adding duplicate subsystem " << name);
|
||||||
|
throw sg_exception("duplicate subsystem");
|
||||||
|
}
|
||||||
|
_subsystem_map[name] = subsystem;
|
||||||
}
|
}
|
||||||
|
|
||||||
FGSubsystemGroup *
|
FGSubsystemGroup *
|
||||||
|
@ -263,4 +328,15 @@ FGSubsystemMgr::get_group (GroupType group)
|
||||||
return &(_groups[group]);
|
return &(_groups[group]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FGSubsystem *
|
||||||
|
FGSubsystemMgr::get_subsystem (const string &name)
|
||||||
|
{
|
||||||
|
map<string,FGSubsystem *>::iterator s =_subsystem_map.find(name);
|
||||||
|
|
||||||
|
if (s == _subsystem_map.end())
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return s->second;
|
||||||
|
}
|
||||||
|
|
||||||
// end of fgfs.cxx
|
// end of fgfs.cxx
|
||||||
|
|
|
@ -252,9 +252,13 @@ public:
|
||||||
virtual ~FGSubsystemGroup ();
|
virtual ~FGSubsystemGroup ();
|
||||||
|
|
||||||
virtual void init ();
|
virtual void init ();
|
||||||
|
virtual void reinit ();
|
||||||
virtual void bind ();
|
virtual void bind ();
|
||||||
virtual void unbind ();
|
virtual void unbind ();
|
||||||
virtual void update (double delta_time_sec);
|
virtual void update (double delta_time_sec);
|
||||||
|
virtual void suspend ();
|
||||||
|
virtual void resume ();
|
||||||
|
virtual bool is_suspended () const;
|
||||||
|
|
||||||
virtual void set_subsystem (const string &name,
|
virtual void set_subsystem (const string &name,
|
||||||
FGSubsystem * subsystem,
|
FGSubsystem * subsystem,
|
||||||
|
@ -287,12 +291,29 @@ private:
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manage subsystems for the application.
|
* Manage subsystems for FlightGear.
|
||||||
|
*
|
||||||
|
* This top-level subsystem will eventually manage all of the
|
||||||
|
* subsystems in FlightGear: it broadcasts its life-cycle events
|
||||||
|
* (init, bind, etc.) to all of the subsystems it manages. Subsystems
|
||||||
|
* are grouped to guarantee order of initialization and execution --
|
||||||
|
* currently, the only two groups are INIT and GENERAL, but others
|
||||||
|
* will appear in the future.
|
||||||
|
*
|
||||||
|
* All subsystems are named as well as grouped, and subsystems can be
|
||||||
|
* looked up by name and cast to the appropriate subtype when another
|
||||||
|
* subsystem needs to invoke specialized methods.
|
||||||
|
*
|
||||||
|
* The subsystem manager owns the pointers to all the subsystems in
|
||||||
|
* it.
|
||||||
*/
|
*/
|
||||||
class FGSubsystemMgr : public FGSubsystem
|
class FGSubsystemMgr : public FGSubsystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Types of subsystem groups.
|
||||||
|
*/
|
||||||
enum GroupType {
|
enum GroupType {
|
||||||
INIT = 0,
|
INIT = 0,
|
||||||
GENERAL,
|
GENERAL,
|
||||||
|
@ -303,9 +324,13 @@ public:
|
||||||
virtual ~FGSubsystemMgr ();
|
virtual ~FGSubsystemMgr ();
|
||||||
|
|
||||||
virtual void init ();
|
virtual void init ();
|
||||||
|
virtual void reinit ();
|
||||||
virtual void bind ();
|
virtual void bind ();
|
||||||
virtual void unbind ();
|
virtual void unbind ();
|
||||||
virtual void update (double delta_time_sec);
|
virtual void update (double delta_time_sec);
|
||||||
|
virtual void suspend ();
|
||||||
|
virtual void resume ();
|
||||||
|
virtual bool is_suspended () const;
|
||||||
|
|
||||||
virtual void add (GroupType group, const string &name,
|
virtual void add (GroupType group, const string &name,
|
||||||
FGSubsystem * subsystem,
|
FGSubsystem * subsystem,
|
||||||
|
@ -313,9 +338,12 @@ public:
|
||||||
|
|
||||||
virtual FGSubsystemGroup * get_group (GroupType group);
|
virtual FGSubsystemGroup * get_group (GroupType group);
|
||||||
|
|
||||||
|
virtual FGSubsystem * get_subsystem(const string &name);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
FGSubsystemGroup _groups[MAX_GROUPS];
|
FGSubsystemGroup _groups[MAX_GROUPS];
|
||||||
|
map<string,FGSubsystem *> _subsystem_map;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue