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()));
114 if (in->is_string()) {
115 cinputs.push_back(in->get_string());
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()) {
127 if (out->is_string()) {
128 coutputs.push_back(out->get_string());
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;
197LaserFilterPlugin::~LaserFilterPlugin()
202PLUGIN_DESCRIPTION(
"Filter laser data in blackboard")
Laser filter plugin for Fawkes.
LaserFilterPlugin(fawkes::Configuration *config)
Constructor.
A barrier is a synchronization tool which blocks until a given number of threads have reached the bar...
Interface for configuration handling.
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.
Base class for exceptions in Fawkes.
ThreadList thread_list
Thread list member.
ThreadList & threads()
Get a list of threads.
Configuration * config
Fawkes configuration.
void push_back(Thread *thread)
Add thread to the end.
Fawkes library namespace.