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::reinit ()
39 SGSubsystem::unbind ()
44 SGSubsystem::suspend ()
50 SGSubsystem::suspend (bool suspended)
52 _suspended = suspended;
56 SGSubsystem::resume ()
62 SGSubsystem::is_suspended () const
69 ////////////////////////////////////////////////////////////////////////
70 // Implementation of SGSubsystemGroup.
71 ////////////////////////////////////////////////////////////////////////
73 SGSubsystemGroup::SGSubsystemGroup ()
77 SGSubsystemGroup::~SGSubsystemGroup ()
79 for (unsigned int i = 0; i < _members.size(); i++)
84 SGSubsystemGroup::init ()
86 for (unsigned int i = 0; i < _members.size(); i++)
87 _members[i]->subsystem->init();
91 SGSubsystemGroup::reinit ()
93 for (unsigned int i = 0; i < _members.size(); i++)
94 _members[i]->subsystem->reinit();
98 SGSubsystemGroup::bind ()
100 for (unsigned int i = 0; i < _members.size(); i++)
101 _members[i]->subsystem->bind();
105 SGSubsystemGroup::unbind ()
107 for (unsigned int i = 0; i < _members.size(); i++)
108 _members[i]->subsystem->unbind();
112 SGSubsystemGroup::update (double delta_time_sec)
114 for (unsigned int i = 0; i < _members.size(); i++)
115 _members[i]->update(delta_time_sec); // indirect call
119 SGSubsystemGroup::suspend ()
121 for (unsigned int i = 0; i < _members.size(); i++)
122 _members[i]->subsystem->suspend();
126 SGSubsystemGroup::resume ()
128 for (unsigned int i = 0; i < _members.size(); i++)
129 _members[i]->subsystem->resume();
133 SGSubsystemGroup::is_suspended () const
139 SGSubsystemGroup::set_subsystem (const string &name, SGSubsystem * subsystem,
142 Member * member = get_member(name, true);
143 if (member->subsystem != 0)
144 delete member->subsystem;
146 member->subsystem = subsystem;
147 member->min_step_sec = min_step_sec;
151 SGSubsystemGroup::get_subsystem (const string &name)
153 Member * member = get_member(name);
155 return member->subsystem;
161 SGSubsystemGroup::remove_subsystem (const string &name)
163 for (unsigned int i = 0; i < _members.size(); i++) {
164 if (name == _members[i]->name) {
165 _members.erase(_members.begin() + i);
172 SGSubsystemGroup::has_subsystem (const string &name) const
174 return (((SGSubsystemGroup *)this)->get_member(name) != 0);
177 SGSubsystemGroup::Member *
178 SGSubsystemGroup::get_member (const string &name, bool create)
180 for (unsigned int i = 0; i < _members.size(); i++) {
181 if (_members[i]->name == name)
185 Member * member = new Member;
186 _members.push_back(member);
195 ////////////////////////////////////////////////////////////////////////
196 // Implementation of SGSubsystemGroup::Member
197 ////////////////////////////////////////////////////////////////////////
200 SGSubsystemGroup::Member::Member ()
208 SGSubsystemGroup::Member::Member (const Member &)
213 SGSubsystemGroup::Member::~Member ()
215 // FIXME: causes a crash
220 SGSubsystemGroup::Member::update (double delta_time_sec)
222 elapsed_sec += delta_time_sec;
223 if (elapsed_sec >= min_step_sec) {
224 if (!subsystem->is_suspended()) {
225 subsystem->update(elapsed_sec);
233 ////////////////////////////////////////////////////////////////////////
234 // Implementation of SGSubsystemMgr.
235 ////////////////////////////////////////////////////////////////////////
238 SGSubsystemMgr::SGSubsystemMgr ()
242 SGSubsystemMgr::~SGSubsystemMgr ()
247 SGSubsystemMgr::init ()
249 for (int i = 0; i < MAX_GROUPS; i++)
254 SGSubsystemMgr::reinit ()
256 for (int i = 0; i < MAX_GROUPS; i++)
261 SGSubsystemMgr::bind ()
263 for (int i = 0; i < MAX_GROUPS; i++)
268 SGSubsystemMgr::unbind ()
270 for (int i = 0; i < MAX_GROUPS; i++)
275 SGSubsystemMgr::update (double delta_time_sec)
277 for (int i = 0; i < MAX_GROUPS; i++) {
278 _groups[i].update(delta_time_sec);
283 SGSubsystemMgr::suspend ()
285 for (int i = 0; i < MAX_GROUPS; i++)
286 _groups[i].suspend();
290 SGSubsystemMgr::resume ()
292 for (int i = 0; i < MAX_GROUPS; i++)
297 SGSubsystemMgr::is_suspended () const
303 SGSubsystemMgr::add (const char * name, SGSubsystem * subsystem,
304 GroupType group, double min_time_sec)
306 SG_LOG(SG_GENERAL, SG_INFO, "Adding subsystem " << name);
307 get_group(group)->set_subsystem(name, subsystem, min_time_sec);
309 if (_subsystem_map.find(name) != _subsystem_map.end()) {
310 SG_LOG(SG_GENERAL, SG_ALERT, "Adding duplicate subsystem " << name);
311 throw sg_exception("duplicate subsystem");
313 _subsystem_map[name] = subsystem;
317 SGSubsystemMgr::get_group (GroupType group)
319 return &(_groups[group]);
323 SGSubsystemMgr::get_subsystem (const string &name)
325 map<string,SGSubsystem *>::iterator s =_subsystem_map.find(name);
327 if (s == _subsystem_map.end())