24 #include <aspect/manager.h>
25 #include <aspect/inifins/aspect_provider.h>
26 #include <aspect/inifins/blackboard.h>
27 #include <aspect/inifins/blocked_timing.h>
28 #include <aspect/inifins/clock.h>
29 #include <aspect/inifins/configurable.h>
30 #include <aspect/inifins/fawkes_network.h>
31 #include <aspect/inifins/logger.h>
32 #include <aspect/inifins/logging.h>
33 #include <aspect/inifins/mainloop.h>
34 #include <aspect/inifins/network.h>
35 #include <aspect/inifins/plugin_director.h>
36 #include <aspect/inifins/thread_producer.h>
37 #include <aspect/inifins/time_source.h>
38 #include <aspect/inifins/vision_master.h>
39 #include <aspect/inifins/vision.h>
41 # include <aspect/inifins/webview.h>
44 # include <aspect/inifins/tf.h>
47 # include <aspect/inifins/pointcloud.h>
65 AspectManager::~AspectManager()
67 std::map<std::string, AspectIniFin *>::iterator i;
68 for (i = __default_inifins.begin(); i != __default_inifins.end(); ++i) {
71 __default_inifins.clear();
81 throw Exception(
"An initializer for %s has already been registered",
94 throw Exception(
"An initializer for %s has not been registered",
98 throw Exception(
"Threads with the %s aspect are still alive, cannot "
111 AspectManager::has_threads_for_aspect(
const char *aspect_name)
113 return (__threads.find(aspect_name) != __threads.end()) &&
114 (! __threads[aspect_name].empty());
120 Aspect *aspected_thread =
dynamic_cast<Aspect *
>(thread);
121 if (aspected_thread != NULL) {
122 const std::list<const char *> &aspects = aspected_thread->
get_aspects();
124 std::list<const char *> initialized;
127 std::list<const char *>::const_iterator i;
128 for (i = aspects.begin(); i != aspects.end(); ++i) {
129 if (__inifins.find(*i) == __inifins.end()) {
131 "but no initiliazer is known.",
134 __inifins[*i]->init(thread);
135 initialized.push_back(*i);
138 for (i = aspects.begin(); i != aspects.end(); ++i) {
139 __threads[*i].push_back(thread);
142 std::list<const char *>::const_reverse_iterator i;
143 for (i = initialized.rbegin(); i != initialized.rend(); ++i) {
144 __inifins[*i]->finalize(thread);
148 std::list<const char *>::const_reverse_iterator i;
149 for (i = initialized.rbegin(); i != initialized.rend(); ++i) {
150 __inifins[*i]->finalize(thread);
159 void AspectManager::finalize(
Thread *thread)
161 Aspect *aspected_thread =
dynamic_cast<Aspect *
>(thread);
162 if (aspected_thread != NULL) {
163 const std::list<const char *> &aspects = aspected_thread->
get_aspects();
165 std::list<const char *>::const_iterator i;
166 for (i = aspects.begin(); i != aspects.end(); ++i) {
167 if (__inifins.find(*i) == __inifins.end()) {
169 "but no finalizer is known.",
172 __inifins[*i]->finalize(thread);
177 for (i = aspects.begin(); i != aspects.end(); ++i) {
178 __threads[*i].remove(thread);
185 AspectManager::prepare_finalize(
Thread *thread)
187 Aspect *aspected_thread =
dynamic_cast<Aspect *
>(thread);
188 if (aspected_thread != NULL) {
189 const std::list<const char *> &aspects = aspected_thread->
get_aspects();
191 std::list<const char *>::const_iterator i;
192 for (i = aspects.begin(); i != aspects.end(); ++i) {
193 if (__inifins.find(*i) == __inifins.end()) {
195 "but no finalizer is known.",
198 if (!__inifins[*i]->prepare_finalize(thread)) {
225 AspectManager::register_default_inifins(
BlackBoard *blackboard,
239 if (! __default_inifins.empty())
return;
295 std::map<std::string, AspectIniFin *>::iterator i;
296 for (i = __default_inifins.begin(); i != __default_inifins.end(); ++i) {
297 __inifins[i->first] = i->second;
Initializer/finalizer for the BlockedTimingAspect.
Service publisher interface.
Initializer/finalizer for the WebviewAspect.
Initializer/finalizer for the AspectProviderAspect.
Initializer/finalizer for the MainLoopAspect.
Fawkes aspect base class.
Fawkes library namespace.
This is supposed to be the central clock in Fawkes.
Initializer/finalizer for the ConfigurableAspect.
Logger employer The LoggerEmployer shall pipe all log messages of the system to added loggers...
Initializer/finalizer for the LoggerAspect.
Initializer/finalizer for the PointCloudAspect.
Thread class encapsulation of pthreads.
Initializer/finalizer for the TimeSourceAspect.
Initializer/finalizer for the NetworkAspect.
Thread cannot be initialized.
Initializer/finalizer for the BlackBoardAspect.
Base class for exceptions in Fawkes.
const char * get_aspect_name() const
Get aspect name.
Initializer/finalizer for the ThreadProducerAspect.
Initializer/finalizer for the ClockAspect.
Main loop employer The MainLoopEmployer calls the main loop for execution.
const char * name() const
Get name of thread.
Network name and address resolver.
const std::list< const char * > & get_aspects() const
Get list of aspect names attached to a aspected thread.
Initializer/finalizer for the FawkesNetworkAspect.
Thread cannot be finalized.
Initializer/finalizer for the VisionAspect.
The BlackBoard abstract class.
Initializer/finalizer for the PluginDirectorAspect.
Interface for configuration handling.
Initializer/finalizer for the LoggingAspect.
void append(const char *format,...)
Append messages to the message list.
Initializer/finalizer for the VisionMasterAspect.
Aspect initializer/finalizer base class.