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())) {
68 std::string cfg_prefix = prefix + cfg_name +
"/";
81 configs.insert(cfg_name);
84 ignored_configs.insert(cfg_name);
96 throw Exception(
"No active laser filters configured, aborting");
101 std::map<std::string, std::list<std::string>> inputs;
102 std::map<std::string, std::list<std::string>> outputs;
103 std::set<std::string>::iterator c, d;
105 for (c = configs.begin(); c != configs.end(); ++c) {
106 std::string cinp = prefix + *c +
"/in/";
107 std::list<std::string> cinputs;
108 #if __cplusplus >= 201103L 109 std::unique_ptr<Configuration::ValueIterator> in(
config->
search(cinp.c_str()));
111 std::auto_ptr<Configuration::ValueIterator> in(
config->
search(cinp.c_str()));
119 std::string coutp = prefix + *c +
"/out/";
120 std::list<std::string> coutputs;
121 #if __cplusplus >= 201103L 122 std::unique_ptr<Configuration::ValueIterator> out(
config->
search(coutp.c_str()));
124 std::auto_ptr<Configuration::ValueIterator> out(
config->
search(coutp.c_str()));
126 while (out->
next()) {
132 inputs[*c] = cinputs;
133 outputs[*c] = coutputs;
140 bool has_deps =
false;
141 for (c = configs.begin(); c != configs.end(); ++c) {
144 std::list<LaserFilterThread *> depthreads;
146 std::list<std::string>::iterator i, o;
147 std::list<std::string> & cinputs = inputs[*c];
148 for (i = cinputs.begin(); i != cinputs.end(); ++i) {
151 for (d = configs.begin(); d != configs.end(); ++d) {
156 std::list<std::string> &coutputs = outputs[*d];
157 for (o = coutputs.begin(); o != coutputs.end(); ++o) {
163 depthreads.push_back(
threads[*d]);
170 if (!depthreads.empty()) {
173 threads[*c]->set_wait_threads(depthreads);
181 std::map<std::string, LaserFilterThread *>::iterator t;
184 t->second->set_wait_barrier(barrier_);
189 ThreadList::iterator t;
197 LaserFilterPlugin::~LaserFilterPlugin()
202 PLUGIN_DESCRIPTION(
"Filter laser data in blackboard")
ThreadList & threads()
Get a list of threads.
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.
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.
Configuration * config
Fawkes configuration.
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...