2 #include <simgear/debug/logstream.hxx>
3 #include <simgear/timing/timestamp.hxx>
5 #include "exception.hxx"
6 #include "subsystem_mgr.hxx"
10 ////////////////////////////////////////////////////////////////////////
11 // Implementation of SGSubsystem
12 ////////////////////////////////////////////////////////////////////////
15 SGSubsystem::SGSubsystem ()
20 SGSubsystem::~SGSubsystem ()
30 SGSubsystem::postinit ()
35 SGSubsystem::reinit ()
45 SGSubsystem::unbind ()
50 SGSubsystem::suspend ()
56 SGSubsystem::suspend (bool suspended)
58 _suspended = suspended;
62 SGSubsystem::resume ()
68 SGSubsystem::is_suspended () const
75 SGSubsystem::printTimingInformation ()
77 SGTimeStamp startTime, endTime;
79 for ( eventTimeVecIterator i = timingInfo.begin();
80 i != timingInfo.end();
82 if (i == timingInfo.begin()) {
83 startTime = i->getTime();
85 endTime = i->getTime();
86 duration = (endTime - startTime);
88 SG_LOG(SG_GENERAL, SG_ALERT, "- Getting to timestamp : " << i->getName() << " takes " << duration << " usec.");
93 void SGSubsystem::stamp(string name)
97 timingInfo.push_back(TimingInfo(name, now));
101 ////////////////////////////////////////////////////////////////////////
102 // Implementation of SGSubsystemGroup.
103 ////////////////////////////////////////////////////////////////////////
105 SGSubsystemGroup::SGSubsystemGroup ()
109 SGSubsystemGroup::~SGSubsystemGroup ()
111 for (unsigned int i = 0; i < _members.size(); i++)
116 SGSubsystemGroup::init ()
118 for (unsigned int i = 0; i < _members.size(); i++)
119 _members[i]->subsystem->init();
123 SGSubsystemGroup::postinit ()
125 for (unsigned int i = 0; i < _members.size(); i++)
126 _members[i]->subsystem->postinit();
130 SGSubsystemGroup::reinit ()
132 for (unsigned int i = 0; i < _members.size(); i++)
133 _members[i]->subsystem->reinit();
137 SGSubsystemGroup::bind ()
139 for (unsigned int i = 0; i < _members.size(); i++)
140 _members[i]->subsystem->bind();
144 SGSubsystemGroup::unbind ()
146 for (unsigned int i = 0; i < _members.size(); i++)
147 _members[i]->subsystem->unbind();
151 SGSubsystemGroup::update (double delta_time_sec)
153 for (unsigned int i = 0; i < _members.size(); i++)
155 SGTimeStamp start, now;
157 _members[i]->update(delta_time_sec); // indirect call
159 long b = ( now - start );
161 SG_LOG(SG_GENERAL, SG_ALERT, "Subsystem Timing Alert : " << b << " " << _members[i]->name);
163 _members[i]->printTimingInformation();
169 SGSubsystemGroup::suspend ()
171 for (unsigned int i = 0; i < _members.size(); i++)
172 _members[i]->subsystem->suspend();
176 SGSubsystemGroup::resume ()
178 for (unsigned int i = 0; i < _members.size(); i++)
179 _members[i]->subsystem->resume();
183 SGSubsystemGroup::is_suspended () const
189 SGSubsystemGroup::set_subsystem (const string &name, SGSubsystem * subsystem,
192 Member * member = get_member(name, true);
193 if (member->subsystem != 0)
194 delete member->subsystem;
196 member->subsystem = subsystem;
197 member->min_step_sec = min_step_sec;
201 SGSubsystemGroup::get_subsystem (const string &name)
203 Member * member = get_member(name);
205 return member->subsystem;
211 SGSubsystemGroup::remove_subsystem (const string &name)
213 for (unsigned int i = 0; i < _members.size(); i++) {
214 if (name == _members[i]->name) {
215 _members.erase(_members.begin() + i);
222 SGSubsystemGroup::has_subsystem (const string &name) const
224 return (((SGSubsystemGroup *)this)->get_member(name) != 0);
227 SGSubsystemGroup::Member *
228 SGSubsystemGroup::get_member (const string &name, bool create)
230 for (unsigned int i = 0; i < _members.size(); i++) {
231 if (_members[i]->name == name)
235 Member * member = new Member;
236 _members.push_back(member);
245 ////////////////////////////////////////////////////////////////////////
246 // Implementation of SGSubsystemGroup::Member
247 ////////////////////////////////////////////////////////////////////////
250 SGSubsystemGroup::Member::Member ()
258 SGSubsystemGroup::Member::Member (const Member &)
263 SGSubsystemGroup::Member::~Member ()
269 SGSubsystemGroup::Member::update (double delta_time_sec)
271 elapsed_sec += delta_time_sec;
272 if (elapsed_sec >= min_step_sec) {
273 if (!subsystem->is_suspended()) {
274 subsystem->update(elapsed_sec);
282 SGSubsystemGroup::Member::printTimingInformation()
284 subsystem->printTimingInformation();
289 ////////////////////////////////////////////////////////////////////////
290 // Implementation of SGSubsystemMgr.
291 ////////////////////////////////////////////////////////////////////////
294 SGSubsystemMgr::SGSubsystemMgr ()
298 SGSubsystemMgr::~SGSubsystemMgr ()
303 SGSubsystemMgr::init ()
305 for (int i = 0; i < MAX_GROUPS; i++)
310 SGSubsystemMgr::postinit ()
312 for (int i = 0; i < MAX_GROUPS; i++)
313 _groups[i].postinit();
317 SGSubsystemMgr::reinit ()
319 for (int i = 0; i < MAX_GROUPS; i++)
324 SGSubsystemMgr::bind ()
326 for (int i = 0; i < MAX_GROUPS; i++)
331 SGSubsystemMgr::unbind ()
333 for (int i = 0; i < MAX_GROUPS; i++)
338 SGSubsystemMgr::update (double delta_time_sec)
340 for (int i = 0; i < MAX_GROUPS; i++) {
341 _groups[i].update(delta_time_sec);
346 SGSubsystemMgr::suspend ()
348 for (int i = 0; i < MAX_GROUPS; i++)
349 _groups[i].suspend();
353 SGSubsystemMgr::resume ()
355 for (int i = 0; i < MAX_GROUPS; i++)
360 SGSubsystemMgr::is_suspended () const
366 SGSubsystemMgr::add (const char * name, SGSubsystem * subsystem,
367 GroupType group, double min_time_sec)
369 SG_LOG(SG_GENERAL, SG_INFO, "Adding subsystem " << name);
370 get_group(group)->set_subsystem(name, subsystem, min_time_sec);
372 if (_subsystem_map.find(name) != _subsystem_map.end()) {
373 SG_LOG(SG_GENERAL, SG_ALERT, "Adding duplicate subsystem " << name);
374 throw sg_exception("duplicate subsystem");
376 _subsystem_map[name] = subsystem;
380 SGSubsystemMgr::get_group (GroupType group)
382 return &(_groups[group]);
386 SGSubsystemMgr::get_subsystem (const string &name)
388 map<string,SGSubsystem *>::iterator s =_subsystem_map.find(name);
390 if (s == _subsystem_map.end())