]> git.mxchange.org Git - flightgear.git/blob - src/Main/fgfs.cxx
First draft of subsystem manager; moved some subsystems into it.
[flightgear.git] / src / Main / fgfs.cxx
1 #include "fgfs.hxx"
2
3 #include <simgear/debug/logstream.hxx>
4
5 #include "globals.hxx"
6 #include "fg_props.hxx"
7
8
9 \f
10 ////////////////////////////////////////////////////////////////////////
11 // Implementation of FGSubsystem
12 ////////////////////////////////////////////////////////////////////////
13
14
15 FGSubsystem::FGSubsystem ()
16   : _suspended(false)
17 {
18 }
19
20 FGSubsystem::~FGSubsystem ()
21 {
22 }
23
24 void
25 FGSubsystem::suspend ()
26 {
27   _suspended = true;
28 }
29
30 void
31 FGSubsystem::suspend (bool suspended)
32 {
33   _suspended = suspended;
34 }
35
36 void
37 FGSubsystem::resume ()
38 {
39   _suspended = false;
40 }
41
42 bool
43 FGSubsystem::is_suspended () const
44 {
45   if (!_freeze_master_node.valid())
46     _freeze_master_node = fgGetNode("/sim/freeze/master", true);
47   return _suspended || _freeze_master_node->getBoolValue();
48 }
49
50
51 \f
52 ////////////////////////////////////////////////////////////////////////
53 // Implementation of FGSubsystemGroup.
54 ////////////////////////////////////////////////////////////////////////
55
56 FGSubsystemGroup::FGSubsystemGroup ()
57 {
58 }
59
60 FGSubsystemGroup::~FGSubsystemGroup ()
61 {
62     for (int i = 0; i < _members.size(); i++)
63         delete _members[i];
64 }
65
66 void
67 FGSubsystemGroup::init ()
68 {
69     for (int i = 0; i < _members.size(); i++)
70         _members[i]->subsystem->init();
71 }
72
73 void
74 FGSubsystemGroup::bind ()
75 {
76     for (int i = 0; i < _members.size(); i++)
77         _members[i]->subsystem->bind();
78 }
79
80 void
81 FGSubsystemGroup::unbind ()
82 {
83     for (int i = 0; i < _members.size(); i++)
84         _members[i]->subsystem->unbind();
85 }
86
87 void
88 FGSubsystemGroup::update (double delta_time_sec)
89 {
90     if (!is_suspended()) {
91         for (int i = 0; i < _members.size(); i++)
92             _members[i]->update(delta_time_sec); // indirect call
93     }
94 }
95
96 void
97 FGSubsystemGroup::set_subsystem (const string &name, FGSubsystem * subsystem,
98                                  double min_step_sec)
99 {
100     Member * member = get_member(name, true);
101     if (member->subsystem != 0)
102         delete member->subsystem;
103     member->name = name;
104     member->subsystem = subsystem;
105     member->min_step_sec = min_step_sec;
106 }
107
108 FGSubsystem *
109 FGSubsystemGroup::get_subsystem (const string &name)
110 {
111     Member * member = get_member(name);
112     if (member != 0)
113         return member->subsystem;
114     else
115         return 0;
116 }
117
118 void
119 FGSubsystemGroup::remove_subsystem (const string &name)
120 {
121     for (int i = 0; i < _members.size(); i++) {
122         if (name == _members[i]->name) {
123             _members.erase(_members.begin() + i);
124             return;
125         }
126     }
127 }
128
129 bool
130 FGSubsystemGroup::has_subsystem (const string &name) const
131 {
132     return (((FGSubsystemGroup *)this)->get_member(name) != 0);
133 }
134
135 FGSubsystemGroup::Member *
136 FGSubsystemGroup::get_member (const string &name, bool create)
137 {
138     for (int i = 0; i < _members.size(); i++) {
139         if (_members[i]->name == name)
140             return _members[i];
141     }
142     if (create) {
143         Member * member = new Member;
144         _members.push_back(member);
145         return member;
146     } else {
147         return 0;
148     }
149 }
150
151
152 \f
153 ////////////////////////////////////////////////////////////////////////
154 // Implementation of FGSubsystemGroup::Member
155 ////////////////////////////////////////////////////////////////////////
156
157
158 FGSubsystemGroup::Member::Member ()
159     : name(""),
160       subsystem(0),
161       min_step_sec(0),
162       elapsed_sec(0)
163 {
164 }
165
166 FGSubsystemGroup::Member::Member (const Member &)
167 {
168     Member();
169 }
170
171 FGSubsystemGroup::Member::~Member ()
172 {
173                                 // FIXME: causes a crash
174 //     delete subsystem;
175 }
176
177 void
178 FGSubsystemGroup::Member::update (double delta_time_sec)
179 {
180     elapsed_sec += delta_time_sec;
181     if (elapsed_sec >= min_step_sec) {
182         subsystem->update(delta_time_sec);
183         elapsed_sec -= min_step_sec;
184     }
185 }
186
187
188 \f
189 ////////////////////////////////////////////////////////////////////////
190 // Implementation of FGSubsystemMgr.
191 ////////////////////////////////////////////////////////////////////////
192
193
194 FGSubsystemMgr::FGSubsystemMgr ()
195 {
196 }
197
198 FGSubsystemMgr::~FGSubsystemMgr ()
199 {
200 }
201
202 void
203 FGSubsystemMgr::init ()
204 {
205     for (int i = 0; i < MAX_GROUPS; i++)
206             _groups[i].init();
207 }
208
209 void
210 FGSubsystemMgr::bind ()
211 {
212     for (int i = 0; i < MAX_GROUPS; i++)
213         _groups[i].bind();
214 }
215
216 void
217 FGSubsystemMgr::unbind ()
218 {
219     for (int i = 0; i < MAX_GROUPS; i++)
220         _groups[i].unbind();
221 }
222
223 void
224 FGSubsystemMgr::update (double delta_time_sec)
225 {
226     if (!is_suspended()) {
227         for (int i = 0; i < MAX_GROUPS; i++)
228             _groups[i].update(delta_time_sec);
229     }
230 }
231
232 void
233 FGSubsystemMgr::add (GroupType group, const string &name,
234                      FGSubsystem * subsystem, double min_time_sec)
235 {
236     SG_LOG(SG_GENERAL, SG_INFO, "Adding subsystem " << name);
237     get_group(group)->set_subsystem(name, subsystem, min_time_sec);
238 }
239
240 FGSubsystemGroup *
241 FGSubsystemMgr::get_group (GroupType group)
242 {
243     return &(_groups[group]);
244 }
245
246 // end of fgfs.cxx