#include "positioning.hh" #include "realposition.hh" #include "fbcm.hh" #include "frbhmbasic.hh" #include "interlinknetworks.hh" #include "radar.hh" #include "configuration.hh" #include "posexcept.hh" #include "stock.hh" using namespace std ; /* *** Constructors *** */ Positioning::Positioning() { initialise_algorithms() ; loop() ; } Positioning::~Positioning() { for (vector::const_iterator i = algorithms.begin() ; i != algorithms.end() ; ++i) delete *i ; algorithms.clear() ; } /* *** Operations *** */ void Positioning::initialise_algorithms() { if (! Configuration::is_configured("positioning.algorithm")) throw missing_configuration( "No positioning algorithm specified in configuration!") ; const vector &algo_names = Configuration::string_vector_value("positioning.algorithm") ; for (vector::const_iterator i = algo_names.begin() ; i != algo_names.end() ; ++i) { if (*i == "Real") algorithms.push_back(new RealPosition) ; else if (*i == "FBCM") { Stock::update_all_friis_indexes() ; algorithms.push_back(new FBCM) ; } else if (*i == "FRBHMBasic") //TODO: Pre-compute all per-ReferencePoint friis indexes? algorithms.push_back(new FRBHMBasic) ; else if (*i == "InterlinkNetworks") algorithms.push_back(new InterlinkNetworks) ; else if (*i == "RADAR") algorithms.push_back(new RADAR) ; else throw bad_configuration( "The specified positioning_algorithm « "+ *i + " » is unknown!") ; } } void Positioning::loop() { vector::const_iterator algo ; while (! input.eof()) { const Request &request = input.get_next_request() ; if (! request) continue ; for (algo = algorithms.begin() ; algo != algorithms.end() ; ++algo) { Result res = (*algo)->compute(request) ; output.write(res) ; } } }