23 #include "laser_filter_plugin.h" 25 #include "filter_thread.h" 27 #include <core/threading/barrier.h> 50 std::set<std::string> configs;
51 std::set<std::string> ignored_configs;
52 std::map<std::string, LaserFilterThread *>
threads;
54 std::string prefix =
"/plugins/laser-filter/";
57 #if __cplusplus >= 201103L 58 std::unique_ptr<Configuration::ValueIterator> i(config->
search(prefix.c_str()));
60 std::auto_ptr<Configuration::ValueIterator> i(config->
search(prefix.c_str()));
63 std::string cfg_name = std::string(i->
path()).substr(prefix.length());
64 cfg_name = cfg_name.substr(0, cfg_name.find(
"/"));
66 if ( (configs.find(cfg_name) == configs.end()) &&
67 (ignored_configs.find(cfg_name) == ignored_configs.end()) ) {
69 std::string cfg_prefix = prefix + cfg_name +
"/";
73 active = config->
get_bool((cfg_prefix +
"active").c_str());
80 threads[cfg_name] = thread;
81 configs.insert(cfg_name);
84 ignored_configs.insert(cfg_name);
97 throw Exception(
"No active laser filters configured, aborting");
102 std::map<std::string, std::list<std::string> > inputs;
103 std::map<std::string, std::list<std::string> > outputs;
104 std::set<std::string>::iterator c, d;
106 for (c = configs.begin(); c != configs.end(); ++c) {
107 std::string cinp = prefix + *c +
"/in/";
108 std::list<std::string> cinputs;
109 #if __cplusplus >= 201103L 110 std::unique_ptr<Configuration::ValueIterator> in(config->
search(cinp.c_str()));
112 std::auto_ptr<Configuration::ValueIterator> in(config->
search(cinp.c_str()));
120 std::string coutp = prefix + *c +
"/out/";
121 std::list<std::string> coutputs;
122 #if __cplusplus >= 201103L 123 std::unique_ptr<Configuration::ValueIterator> out(config->
search(coutp.c_str()));
125 std::auto_ptr<Configuration::ValueIterator> out(config->
search(coutp.c_str()));
127 while (out->
next()) {
133 inputs[*c] = cinputs;
134 outputs[*c] = coutputs;
141 bool has_deps =
false;
142 for (c = configs.begin(); c != configs.end(); ++c) {
146 std::list<LaserFilterThread *> depthreads;
148 std::list<std::string>::iterator i, o;
149 std::list<std::string> &cinputs = inputs[*c];
150 for (i = cinputs.begin(); i != cinputs.end(); ++i) {
153 for (d = configs.begin(); d != configs.end(); ++d) {
154 if (*c == *d)
continue;
157 std::list<std::string> &coutputs = outputs[*d];
158 for (o = coutputs.begin(); o != coutputs.end(); ++o) {
164 depthreads.push_back(threads[*d]);
171 if (! depthreads.empty()) {
174 threads[*c]->set_wait_threads(depthreads);
182 std::map<std::string, LaserFilterThread *>::iterator t;
183 __barrier =
new Barrier(threads.size());
184 for (t = threads.begin(); t != threads.end(); ++t) {
185 t->second->set_wait_barrier(__barrier);
190 ThreadList::iterator t;
199 LaserFilterPlugin::~LaserFilterPlugin()
205 PLUGIN_DESCRIPTION(
"Filter laser data in blackboard")
Fawkes library namespace.
virtual bool get_bool(const char *path)=0
Get value from configuration which is of type bool.
virtual ValueIterator * search(const char *path)=0
Iterator with search results.
virtual bool next()=0
Check if there is another element and advance to this if possible.
ThreadList & threads()
Get a list of threads.
virtual bool is_string() const =0
Check if current value is a string.
Base class for exceptions in Fawkes.
ThreadList thread_list
Thread list member.
virtual std::string get_string() const =0
Get string value.
virtual const char * path() const =0
Path of value.
void push_back(Thread *thread)
Add thread to the end.
Laser filter plugin for Fawkes.
LaserFilterPlugin(fawkes::Configuration *config)
Constructor.
Interface for configuration handling.
A barrier is a synchronization tool which blocks until a given number of threads have reached the bar...