3 #include <simgear/debug/logstream.hxx>
6 #include "fg_props.hxx"
10 ////////////////////////////////////////////////////////////////////////
11 // Implementation of FGSubsystem
12 ////////////////////////////////////////////////////////////////////////
15 FGSubsystem::FGSubsystem ()
20 FGSubsystem::~FGSubsystem ()
30 FGSubsystem::reinit ()
40 FGSubsystem::unbind ()
45 FGSubsystem::suspend ()
51 FGSubsystem::suspend (bool suspended)
53 _suspended = suspended;
57 FGSubsystem::resume ()
63 FGSubsystem::is_suspended () const
65 if (!_freeze_master_node.valid())
66 _freeze_master_node = fgGetNode("/sim/freeze/master", true);
67 return _suspended || _freeze_master_node->getBoolValue();
72 ////////////////////////////////////////////////////////////////////////
73 // Implementation of FGSubsystemGroup.
74 ////////////////////////////////////////////////////////////////////////
76 FGSubsystemGroup::FGSubsystemGroup ()
80 FGSubsystemGroup::~FGSubsystemGroup ()
82 for (int i = 0; i < _members.size(); i++)
87 FGSubsystemGroup::init ()
89 for (int i = 0; i < _members.size(); i++)
90 _members[i]->subsystem->init();
94 FGSubsystemGroup::bind ()
96 for (int i = 0; i < _members.size(); i++)
97 _members[i]->subsystem->bind();
101 FGSubsystemGroup::unbind ()
103 for (int i = 0; i < _members.size(); i++)
104 _members[i]->subsystem->unbind();
108 FGSubsystemGroup::update (double delta_time_sec)
110 if (!is_suspended()) {
111 for (int i = 0; i < _members.size(); i++)
112 _members[i]->update(delta_time_sec); // indirect call
117 FGSubsystemGroup::set_subsystem (const string &name, FGSubsystem * subsystem,
120 Member * member = get_member(name, true);
121 if (member->subsystem != 0)
122 delete member->subsystem;
124 member->subsystem = subsystem;
125 member->min_step_sec = min_step_sec;
129 FGSubsystemGroup::get_subsystem (const string &name)
131 Member * member = get_member(name);
133 return member->subsystem;
139 FGSubsystemGroup::remove_subsystem (const string &name)
141 for (int i = 0; i < _members.size(); i++) {
142 if (name == _members[i]->name) {
143 _members.erase(_members.begin() + i);
150 FGSubsystemGroup::has_subsystem (const string &name) const
152 return (((FGSubsystemGroup *)this)->get_member(name) != 0);
155 FGSubsystemGroup::Member *
156 FGSubsystemGroup::get_member (const string &name, bool create)
158 for (int i = 0; i < _members.size(); i++) {
159 if (_members[i]->name == name)
163 Member * member = new Member;
164 _members.push_back(member);
173 ////////////////////////////////////////////////////////////////////////
174 // Implementation of FGSubsystemGroup::Member
175 ////////////////////////////////////////////////////////////////////////
178 FGSubsystemGroup::Member::Member ()
186 FGSubsystemGroup::Member::Member (const Member &)
191 FGSubsystemGroup::Member::~Member ()
193 // FIXME: causes a crash
198 FGSubsystemGroup::Member::update (double delta_time_sec)
200 elapsed_sec += delta_time_sec;
201 if (elapsed_sec >= min_step_sec) {
202 subsystem->update(delta_time_sec);
203 elapsed_sec -= min_step_sec;
209 ////////////////////////////////////////////////////////////////////////
210 // Implementation of FGSubsystemMgr.
211 ////////////////////////////////////////////////////////////////////////
214 FGSubsystemMgr::FGSubsystemMgr ()
218 FGSubsystemMgr::~FGSubsystemMgr ()
223 FGSubsystemMgr::init ()
225 for (int i = 0; i < MAX_GROUPS; i++)
230 FGSubsystemMgr::bind ()
232 for (int i = 0; i < MAX_GROUPS; i++)
237 FGSubsystemMgr::unbind ()
239 for (int i = 0; i < MAX_GROUPS; i++)
244 FGSubsystemMgr::update (double delta_time_sec)
246 if (!is_suspended()) {
247 for (int i = 0; i < MAX_GROUPS; i++)
248 _groups[i].update(delta_time_sec);
253 FGSubsystemMgr::add (GroupType group, const string &name,
254 FGSubsystem * subsystem, double min_time_sec)
256 SG_LOG(SG_GENERAL, SG_INFO, "Adding subsystem " << name);
257 get_group(group)->set_subsystem(name, subsystem, min_time_sec);
261 FGSubsystemMgr::get_group (GroupType group)
263 return &(_groups[group]);