3 #include <simgear/debug/logstream.hxx>
6 #include "fg_props.hxx"
10 ////////////////////////////////////////////////////////////////////////
11 // Implementation of FGSubsystem
12 ////////////////////////////////////////////////////////////////////////
15 FGSubsystem::FGSubsystem ()
20 FGSubsystem::~FGSubsystem ()
35 FGSubsystem::unbind ()
40 FGSubsystem::suspend ()
46 FGSubsystem::suspend (bool suspended)
48 _suspended = suspended;
52 FGSubsystem::resume ()
58 FGSubsystem::is_suspended () const
60 if (!_freeze_master_node.valid())
61 _freeze_master_node = fgGetNode("/sim/freeze/master", true);
62 return _suspended || _freeze_master_node->getBoolValue();
67 ////////////////////////////////////////////////////////////////////////
68 // Implementation of FGSubsystemGroup.
69 ////////////////////////////////////////////////////////////////////////
71 FGSubsystemGroup::FGSubsystemGroup ()
75 FGSubsystemGroup::~FGSubsystemGroup ()
77 for (int i = 0; i < _members.size(); i++)
82 FGSubsystemGroup::init ()
84 for (int i = 0; i < _members.size(); i++)
85 _members[i]->subsystem->init();
89 FGSubsystemGroup::bind ()
91 for (int i = 0; i < _members.size(); i++)
92 _members[i]->subsystem->bind();
96 FGSubsystemGroup::unbind ()
98 for (int i = 0; i < _members.size(); i++)
99 _members[i]->subsystem->unbind();
103 FGSubsystemGroup::update (double delta_time_sec)
105 if (!is_suspended()) {
106 for (int i = 0; i < _members.size(); i++)
107 _members[i]->update(delta_time_sec); // indirect call
112 FGSubsystemGroup::set_subsystem (const string &name, FGSubsystem * subsystem,
115 Member * member = get_member(name, true);
116 if (member->subsystem != 0)
117 delete member->subsystem;
119 member->subsystem = subsystem;
120 member->min_step_sec = min_step_sec;
124 FGSubsystemGroup::get_subsystem (const string &name)
126 Member * member = get_member(name);
128 return member->subsystem;
134 FGSubsystemGroup::remove_subsystem (const string &name)
136 for (int i = 0; i < _members.size(); i++) {
137 if (name == _members[i]->name) {
138 _members.erase(_members.begin() + i);
145 FGSubsystemGroup::has_subsystem (const string &name) const
147 return (((FGSubsystemGroup *)this)->get_member(name) != 0);
150 FGSubsystemGroup::Member *
151 FGSubsystemGroup::get_member (const string &name, bool create)
153 for (int i = 0; i < _members.size(); i++) {
154 if (_members[i]->name == name)
158 Member * member = new Member;
159 _members.push_back(member);
168 ////////////////////////////////////////////////////////////////////////
169 // Implementation of FGSubsystemGroup::Member
170 ////////////////////////////////////////////////////////////////////////
173 FGSubsystemGroup::Member::Member ()
181 FGSubsystemGroup::Member::Member (const Member &)
186 FGSubsystemGroup::Member::~Member ()
188 // FIXME: causes a crash
193 FGSubsystemGroup::Member::update (double delta_time_sec)
195 elapsed_sec += delta_time_sec;
196 if (elapsed_sec >= min_step_sec) {
197 subsystem->update(delta_time_sec);
198 elapsed_sec -= min_step_sec;
204 ////////////////////////////////////////////////////////////////////////
205 // Implementation of FGSubsystemMgr.
206 ////////////////////////////////////////////////////////////////////////
209 FGSubsystemMgr::FGSubsystemMgr ()
213 FGSubsystemMgr::~FGSubsystemMgr ()
218 FGSubsystemMgr::init ()
220 for (int i = 0; i < MAX_GROUPS; i++)
225 FGSubsystemMgr::bind ()
227 for (int i = 0; i < MAX_GROUPS; i++)
232 FGSubsystemMgr::unbind ()
234 for (int i = 0; i < MAX_GROUPS; i++)
239 FGSubsystemMgr::update (double delta_time_sec)
241 if (!is_suspended()) {
242 for (int i = 0; i < MAX_GROUPS; i++)
243 _groups[i].update(delta_time_sec);
248 FGSubsystemMgr::add (GroupType group, const string &name,
249 FGSubsystem * subsystem, double min_time_sec)
251 SG_LOG(SG_GENERAL, SG_INFO, "Adding subsystem " << name);
252 get_group(group)->set_subsystem(name, subsystem, min_time_sec);
256 FGSubsystemMgr::get_group (GroupType group)
258 return &(_groups[group]);