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 ()
231 SGSubsystemGroup::Member::update (double delta_time_sec)
233 elapsed_sec += delta_time_sec;
234 if (elapsed_sec >= min_step_sec) {
235 if (!subsystem->is_suspended()) {
236 subsystem->update(elapsed_sec);
244 ////////////////////////////////////////////////////////////////////////
245 // Implementation of SGSubsystemMgr.
246 ////////////////////////////////////////////////////////////////////////
249 SGSubsystemMgr::SGSubsystemMgr ()
253 SGSubsystemMgr::~SGSubsystemMgr ()
258 SGSubsystemMgr::init ()
260 for (int i = 0; i < MAX_GROUPS; i++)
265 SGSubsystemMgr::postinit ()
267 for (int i = 0; i < MAX_GROUPS; i++)
268 _groups[i].postinit();
272 SGSubsystemMgr::reinit ()
274 for (int i = 0; i < MAX_GROUPS; i++)
279 SGSubsystemMgr::bind ()
281 for (int i = 0; i < MAX_GROUPS; i++)
286 SGSubsystemMgr::unbind ()
288 for (int i = 0; i < MAX_GROUPS; i++)
293 SGSubsystemMgr::update (double delta_time_sec)
295 for (int i = 0; i < MAX_GROUPS; i++) {
296 _groups[i].update(delta_time_sec);
301 SGSubsystemMgr::suspend ()
303 for (int i = 0; i < MAX_GROUPS; i++)
304 _groups[i].suspend();
308 SGSubsystemMgr::resume ()
310 for (int i = 0; i < MAX_GROUPS; i++)
315 SGSubsystemMgr::is_suspended () const
321 SGSubsystemMgr::add (const char * name, SGSubsystem * subsystem,
322 GroupType group, double min_time_sec)
324 SG_LOG(SG_GENERAL, SG_INFO, "Adding subsystem " << name);
325 get_group(group)->set_subsystem(name, subsystem, min_time_sec);
327 if (_subsystem_map.find(name) != _subsystem_map.end()) {
328 SG_LOG(SG_GENERAL, SG_ALERT, "Adding duplicate subsystem " << name);
329 throw sg_exception("duplicate subsystem");
331 _subsystem_map[name] = subsystem;
335 SGSubsystemMgr::get_group (GroupType group)
337 return &(_groups[group]);
341 SGSubsystemMgr::get_subsystem (const string &name)
343 map<string,SGSubsystem *>::iterator s =_subsystem_map.find(name);
345 if (s == _subsystem_map.end())