24 #include <aspect/inifins/aspect_provider.h>
25 #include <aspect/inifins/blackboard.h>
26 #include <aspect/inifins/blocked_timing.h>
27 #include <aspect/inifins/clock.h>
28 #include <aspect/inifins/configurable.h>
29 #include <aspect/inifins/fawkes_network.h>
30 #include <aspect/inifins/logger.h>
31 #include <aspect/inifins/logging.h>
32 #include <aspect/inifins/mainloop.h>
33 #include <aspect/inifins/network.h>
34 #include <aspect/inifins/plugin_director.h>
35 #include <aspect/inifins/syncpoint.h>
36 #include <aspect/inifins/syncpoint_manager.h>
37 #include <aspect/inifins/thread_producer.h>
38 #include <aspect/inifins/time_source.h>
39 #include <aspect/inifins/vision.h>
40 #include <aspect/inifins/vision_master.h>
41 #include <aspect/manager.h>
43 # include <aspect/inifins/webview.h>
46 # include <aspect/inifins/tf.h>
49 # include <aspect/inifins/pointcloud.h>
66 std::map<std::string, AspectIniFin *>::iterator i;
67 for (i = default_inifins_.begin(); i != default_inifins_.end(); ++i) {
70 default_inifins_.clear();
79 if (inifins_.find(inifin->get_aspect_name()) != inifins_.end()) {
80 throw Exception(
"An initializer for %s has already been registered", inifin->get_aspect_name());
82 inifins_[inifin->get_aspect_name()] = inifin;
91 if (inifins_.find(inifin->get_aspect_name()) == inifins_.end()) {
92 throw Exception(
"An initializer for %s has not been registered", inifin->get_aspect_name());
94 if (!threads_[inifin->get_aspect_name()].empty()) {
95 throw Exception(
"Threads with the %s aspect are still alive, cannot "
96 "unregister the aspect",
97 inifin->get_aspect_name());
99 inifins_.erase(inifin->get_aspect_name());
100 threads_.erase(inifin->get_aspect_name());
111 return (threads_.find(aspect_name) != threads_.end()) && (!threads_[aspect_name].empty());
117 Aspect *aspected_thread = dynamic_cast<Aspect *>(thread);
118 if (aspected_thread != NULL) {
119 const std::list<const char *> &aspects = aspected_thread->
get_aspects();
121 std::list<const char *> initialized;
124 std::list<const char *>::const_iterator i;
125 for (i = aspects.begin(); i != aspects.end(); ++i) {
126 if (inifins_.find(*i) == inifins_.end()) {
128 "but no initializer is known.",
132 inifins_[*i]->init(thread);
133 initialized.push_back(*i);
136 for (i = aspects.begin(); i != aspects.end(); ++i) {
137 threads_[*i].push_back(thread);
140 std::list<const char *>::const_reverse_iterator i;
141 for (i = initialized.rbegin(); i != initialized.rend(); ++i) {
142 inifins_[*i]->finalize(thread);
145 }
catch (Exception &e) {
146 std::list<const char *>::const_reverse_iterator i;
147 for (i = initialized.rbegin(); i != initialized.rend(); ++i) {
148 inifins_[*i]->finalize(thread);
150 CannotInitializeThreadException ce;
160 Aspect *aspected_thread = dynamic_cast<Aspect *>(thread);
161 if (aspected_thread != NULL) {
162 const std::list<const char *> &aspects = aspected_thread->get_aspects();
164 std::list<const char *>::const_iterator i;
165 for (i = aspects.begin(); i != aspects.end(); ++i) {
166 if (inifins_.find(*i) == inifins_.end()) {
168 "but no finalizer is known.",
172 inifins_[*i]->finalize(thread);
177 for (i = aspects.begin(); i != aspects.end(); ++i) {
178 threads_[*i].remove(thread);
186 Aspect *aspected_thread = dynamic_cast<Aspect *>(thread);
187 if (aspected_thread != NULL) {
188 const std::list<const char *> &aspects = aspected_thread->get_aspects();
190 std::list<const char *>::const_iterator i;
191 for (i = aspects.begin(); i != aspects.end(); ++i) {
192 if (inifins_.find(*i) == inifins_.end()) {
194 "but no finalizer is known.",
228 ThreadCollector * collector,
229 Configuration * config,
243 if (!default_inifins_.empty())
301 std::map<std::string, AspectIniFin *>::iterator i;
302 for (i = default_inifins_.begin(); i != default_inifins_.end(); ++i) {
303 inifins_[i->first] = i->second;