2 #include <simgear/debug/logstream.hxx>
4 #include "exception.hxx"
5 #include "subsystem_mgr.hxx"
9 ////////////////////////////////////////////////////////////////////////
10 // Implementation of SGSubsystem
11 ////////////////////////////////////////////////////////////////////////
14 SGSubsystem::SGSubsystem ()
19 SGSubsystem::~SGSubsystem ()
29 SGSubsystem::postinit ()
34 SGSubsystem::reinit ()
44 SGSubsystem::unbind ()
49 SGSubsystem::suspend ()
55 SGSubsystem::suspend (bool suspended)
57 _suspended = suspended;
61 SGSubsystem::resume ()
67 SGSubsystem::is_suspended () const
74 ////////////////////////////////////////////////////////////////////////
75 // Implementation of SGSubsystemGroup.
76 ////////////////////////////////////////////////////////////////////////
78 SGSubsystemGroup::SGSubsystemGroup ()
82 SGSubsystemGroup::~SGSubsystemGroup ()
84 for (unsigned int i = 0; i < _members.size(); i++)
89 SGSubsystemGroup::init ()
91 for (unsigned int i = 0; i < _members.size(); i++)
92 _members[i]->subsystem->init();
96 SGSubsystemGroup::postinit ()
98 for (unsigned int i = 0; i < _members.size(); i++)
99 _members[i]->subsystem->postinit();
103 SGSubsystemGroup::reinit ()
105 for (unsigned int i = 0; i < _members.size(); i++)
106 _members[i]->subsystem->reinit();
110 SGSubsystemGroup::bind ()
112 for (unsigned int i = 0; i < _members.size(); i++)
113 _members[i]->subsystem->bind();
117 SGSubsystemGroup::unbind ()
119 for (unsigned int i = 0; i < _members.size(); i++)
120 _members[i]->subsystem->unbind();
124 SGSubsystemGroup::update (double delta_time_sec)
126 for (unsigned int i = 0; i < _members.size(); i++)
127 _members[i]->update(delta_time_sec); // indirect call
131 SGSubsystemGroup::suspend ()
133 for (unsigned int i = 0; i < _members.size(); i++)
134 _members[i]->subsystem->suspend();
138 SGSubsystemGroup::resume ()
140 for (unsigned int i = 0; i < _members.size(); i++)
141 _members[i]->subsystem->resume();
145 SGSubsystemGroup::is_suspended () const
151 SGSubsystemGroup::set_subsystem (const string &name, SGSubsystem * subsystem,
154 Member * member = get_member(name, true);
155 if (member->subsystem != 0)
156 delete member->subsystem;
158 member->subsystem = subsystem;
159 member->min_step_sec = min_step_sec;
163 SGSubsystemGroup::get_subsystem (const string &name)
165 Member * member = get_member(name);
167 return member->subsystem;
173 SGSubsystemGroup::remove_subsystem (const string &name)
175 for (unsigned int i = 0; i < _members.size(); i++) {
176 if (name == _members[i]->name) {
177 _members.erase(_members.begin() + i);
184 SGSubsystemGroup::has_subsystem (const string &name) const
186 return (((SGSubsystemGroup *)this)->get_member(name) != 0);
189 SGSubsystemGroup::Member *
190 SGSubsystemGroup::get_member (const string &name, bool create)
192 for (unsigned int i = 0; i < _members.size(); i++) {
193 if (_members[i]->name == name)
197 Member * member = new Member;
198 _members.push_back(member);
207 ////////////////////////////////////////////////////////////////////////
208 // Implementation of SGSubsystemGroup::Member
209 ////////////////////////////////////////////////////////////////////////
212 SGSubsystemGroup::Member::Member ()
220 SGSubsystemGroup::Member::Member (const Member &)
225 SGSubsystemGroup::Member::~Member ()
227 // FIXME: causes a crash
232 SGSubsystemGroup::Member::update (double delta_time_sec)
234 elapsed_sec += delta_time_sec;
235 if (elapsed_sec >= min_step_sec) {
236 if (!subsystem->is_suspended()) {
237 subsystem->update(elapsed_sec);
245 ////////////////////////////////////////////////////////////////////////
246 // Implementation of SGSubsystemMgr.
247 ////////////////////////////////////////////////////////////////////////
250 SGSubsystemMgr::SGSubsystemMgr ()
254 SGSubsystemMgr::~SGSubsystemMgr ()
259 SGSubsystemMgr::init ()
261 for (int i = 0; i < MAX_GROUPS; i++)
266 SGSubsystemMgr::postinit ()
268 for (int i = 0; i < MAX_GROUPS; i++)
269 _groups[i].postinit();
273 SGSubsystemMgr::reinit ()
275 for (int i = 0; i < MAX_GROUPS; i++)
280 SGSubsystemMgr::bind ()
282 for (int i = 0; i < MAX_GROUPS; i++)
287 SGSubsystemMgr::unbind ()
289 for (int i = 0; i < MAX_GROUPS; i++)
294 SGSubsystemMgr::update (double delta_time_sec)
296 for (int i = 0; i < MAX_GROUPS; i++) {
297 _groups[i].update(delta_time_sec);
302 SGSubsystemMgr::suspend ()
304 for (int i = 0; i < MAX_GROUPS; i++)
305 _groups[i].suspend();
309 SGSubsystemMgr::resume ()
311 for (int i = 0; i < MAX_GROUPS; i++)
316 SGSubsystemMgr::is_suspended () const
322 SGSubsystemMgr::add (const char * name, SGSubsystem * subsystem,
323 GroupType group, double min_time_sec)
325 SG_LOG(SG_GENERAL, SG_INFO, "Adding subsystem " << name);
326 get_group(group)->set_subsystem(name, subsystem, min_time_sec);
328 if (_subsystem_map.find(name) != _subsystem_map.end()) {
329 SG_LOG(SG_GENERAL, SG_ALERT, "Adding duplicate subsystem " << name);
330 throw sg_exception("duplicate subsystem");
332 _subsystem_map[name] = subsystem;
336 SGSubsystemMgr::get_group (GroupType group)
338 return &(_groups[group]);
342 SGSubsystemMgr::get_subsystem (const string &name)
344 map<string,SGSubsystem *>::iterator s =_subsystem_map.find(name);
346 if (s == _subsystem_map.end())