diff --git a/owlps-positioning/Makefile b/owlps-positioning/Makefile index a515ffe..afc3f22 100644 --- a/owlps-positioning/Makefile +++ b/owlps-positioning/Makefile @@ -58,6 +58,7 @@ OBJ_LIST = \ measurement.o \ request.o \ calibrationrequest.o \ + resultlist.o \ result.o \ minmax.o \ interlinknetworks.o \ @@ -177,6 +178,10 @@ $(OBJ_DIR)/calibrationrequest.o: \ $(OBJ_DIR)/request.o \ $(OBJ_DIR)/referencepoint.o \ $(OBJ_DIR)/direction.o +$(OBJ_DIR)/result.o: \ + $(OBJ_DIR)/request.o +$(OBJ_DIR)/resultlist.o: \ + $(OBJ_DIR)/result.o $(OBJ_DIR)/textfilereader.o: \ $(OBJ_DIR)/posexcept.o $(OBJ_DIR)/csvfilereader.o: \ @@ -208,10 +213,12 @@ $(OBJ_DIR)/input.o: \ $(OBJ_DIR)/stock.o $(OBJ_DIR)/outputterminal.o: \ $(SRC_DIR)/outputmedium.hh \ + $(OBJ_DIR)/resultlist.o \ $(OBJ_DIR)/result.o $(OBJ_DIR)/outputcsv.o: \ $(SRC_DIR)/outputmedium.hh \ $(OBJ_DIR)/textfilewriter.o \ + $(OBJ_DIR)/resultlist.o \ $(OBJ_DIR)/result.o $(OBJ_DIR)/output.o: \ $(OBJ_DIR)/outputterminal.o \ @@ -250,6 +257,7 @@ $(OBJ_DIR)/positioning.o: \ $(OBJ_DIR)/frbhmbasic.o \ $(OBJ_DIR)/interlinknetworks.o \ $(OBJ_DIR)/radar.o \ + $(OBJ_DIR)/resultlist.o \ $(OBJ_DIR)/output.o \ $(OBJ_DIR)/configuration.o \ $(OBJ_DIR)/posexcept.o diff --git a/owlps-positioning/TODO b/owlps-positioning/TODO index 2891c6c..bae3bfb 100644 --- a/owlps-positioning/TODO +++ b/owlps-positioning/TODO @@ -25,14 +25,6 @@ ° Compositions : devraient être représentées par des attributs normaux. -- Positioning - ° Pour une requête, la sortie des résultats de tous les algos - devrait se faire simultanément sur le medium de sortie, ce qui - permettrait par exemple de créer un tableau pour l'affichage CSV - (et peut-être d'optimiser les requêtes d'insertion dans la - BDD). Cela implique de modifier les interfaces de Output (write() - devra prendre un vector) et des différents OutputMedium. - - Building Dans le destructeur, vérifier qu'il faut bien supprimer les Area et les Waypoint. Si oui, faut-il aussi les enlever des listes dans diff --git a/owlps-positioning/src/cartographyalgorithm.cc b/owlps-positioning/src/cartographyalgorithm.cc index 9895ce6..0610e2a 100644 --- a/owlps-positioning/src/cartographyalgorithm.cc +++ b/owlps-positioning/src/cartographyalgorithm.cc @@ -5,5 +5,5 @@ Result CartographyAlgorithm::compute(const Request &request) { Point3D position(select_point(request)) ; - return Result(&request, position, name) ; + return Result(position, name) ; } diff --git a/owlps-positioning/src/frbhmbasic.cc b/owlps-positioning/src/frbhmbasic.cc index e7616f2..d3fba65 100644 --- a/owlps-positioning/src/frbhmbasic.cc +++ b/owlps-positioning/src/frbhmbasic.cc @@ -12,7 +12,7 @@ Result FRBHMBasic::compute(const Request &_request) compute_ap_distance_circles() ; Point3D position(multilaterate_2d(closest_in_ss->get_z())) ; - return Result(request, position, name) ; + return Result(position, name) ; } diff --git a/owlps-positioning/src/multilaterationalgorithm.cc b/owlps-positioning/src/multilaterationalgorithm.cc index 867318d..3dae101 100644 --- a/owlps-positioning/src/multilaterationalgorithm.cc +++ b/owlps-positioning/src/multilaterationalgorithm.cc @@ -58,7 +58,7 @@ Result MultilaterationAlgorithm::compute(const Request &_request) compute_ap_distance_circles() ; Point3D position(multilaterate()) ; - return Result(request, position, name) ; + return Result(position, name) ; } diff --git a/owlps-positioning/src/output.cc b/owlps-positioning/src/output.cc index ab1743c..75eb29d 100644 --- a/owlps-positioning/src/output.cc +++ b/owlps-positioning/src/output.cc @@ -78,9 +78,9 @@ void Output::initialise_output_csv() } -void Output::write(const Result &result) const +void Output::write(const ResultList &results) const { for (vector::const_iterator i = output_media.begin() ; i != output_media.end() ; ++i) - (*i)->write(result) ; + (*i)->write(results) ; } diff --git a/owlps-positioning/src/output.hh b/owlps-positioning/src/output.hh index fbfa7fe..5884f07 100644 --- a/owlps-positioning/src/output.hh +++ b/owlps-positioning/src/output.hh @@ -2,7 +2,7 @@ #define _OWLPS_POSITIONING_OUTPUT_HH_ class OutputMedium ; -class Result ; +class ResultList ; #include @@ -27,7 +27,7 @@ public: /** @name Operations */ //@{ - void write(const Result &result) const ; + void write(const ResultList &results) const ; //@} } ; diff --git a/owlps-positioning/src/outputcsv.cc b/owlps-positioning/src/outputcsv.cc index 667e85a..e83b9bf 100644 --- a/owlps-positioning/src/outputcsv.cc +++ b/owlps-positioning/src/outputcsv.cc @@ -1,5 +1,6 @@ #include "outputcsv.hh" #include "request.hh" +#include "resultlist.hh" #include "mobile.hh" #include @@ -15,7 +16,23 @@ const string OutputCSV::result_to_csv(const Result &result) { ostringstream csv_line ; - const Request *const request = result.get_request() ; + csv_line << result.get_algorithm() ; + + Point3D position = result.get_position() ; + csv_line + << ';' << position.get_x() + << ';' << position.get_y() + << ';' << position.get_z() ; + + return csv_line.str() ; +} + + +const string OutputCSV::results_to_csv(const ResultList &results) +{ + ostringstream csv_line ; + + const Request *const request = results.get_request() ; if (request != NULL) { if (request->get_mobile() != NULL) @@ -27,14 +44,10 @@ const string OutputCSV::result_to_csv(const Result &result) else csv_line << ";;;" ; - csv_line << ';' << result.get_algorithm() ; + const vector &res = results.get_results() ; + for (vector::const_iterator r = res.begin() ; r != res.end() ; + ++r) + csv_line << ';' << result_to_csv(*r) ; - Point3D position = result.get_position() ; - csv_line - << ';' << position.get_x() - << ';' << position.get_y() - << ';' << position.get_z() ; - - csv_line << '\n' ; return csv_line.str() ; } diff --git a/owlps-positioning/src/outputcsv.hh b/owlps-positioning/src/outputcsv.hh index 6dda9bf..1a3b0dc 100644 --- a/owlps-positioning/src/outputcsv.hh +++ b/owlps-positioning/src/outputcsv.hh @@ -4,10 +4,10 @@ #include "outputmedium.hh" #include "textfilewriter.hh" -/// Writes a result to a CSV file +/// Writes results to a CSV file /** * CSV format is: - * Mobile_MAC;Timestamp;X;Y;Z + * Mobile_MAC;Timestamp;Algorithm1;X;Y;Z;…;AlgorithmN;X;Y;Z */ class OutputCSV: public OutputMedium { @@ -15,12 +15,14 @@ protected: TextFileWriter file ; const std::string result_to_csv(const Result &result) ; + const std::string results_to_csv(const ResultList &results) ; public: OutputCSV(const std::string &filename): file(filename) {} void write(const Result &result) ; + void write(const ResultList &results) ; } ; @@ -30,7 +32,13 @@ public: inline void OutputCSV::write(const Result &result) { - file.write_text(result_to_csv(result)) ; + file.write_text(result_to_csv(result) + '\n') ; +} + + +inline void OutputCSV::write(const ResultList &results) +{ + file.write_text(results_to_csv(results) + '\n') ; } diff --git a/owlps-positioning/src/outputmedium.hh b/owlps-positioning/src/outputmedium.hh index e162afa..915ed55 100644 --- a/owlps-positioning/src/outputmedium.hh +++ b/owlps-positioning/src/outputmedium.hh @@ -1,7 +1,8 @@ #ifndef _OWLPS_POSITIONING_OUTPUTMEDIUM_HH_ #define _OWLPS_POSITIONING_OUTPUTMEDIUM_HH_ -#include "result.hh" +class Result ; +class ResultList ; /// Super class of all output media /** @@ -18,6 +19,7 @@ public: /** @name Operations */ //@{ virtual void write(const Result &result) = 0 ; + virtual void write(const ResultList &results) = 0 ; //@} } ; diff --git a/owlps-positioning/src/outputterminal.cc b/owlps-positioning/src/outputterminal.cc index 758508e..088366a 100644 --- a/owlps-positioning/src/outputterminal.cc +++ b/owlps-positioning/src/outputterminal.cc @@ -1,4 +1,5 @@ #include "outputterminal.hh" +#include "resultlist.hh" @@ -6,3 +7,10 @@ void OutputTerminal::write(const Result &result) { output_stream << result << '\n' ; } + + + +void OutputTerminal::write(const ResultList &results) +{ + output_stream << results << '\n' ; +} diff --git a/owlps-positioning/src/outputterminal.hh b/owlps-positioning/src/outputterminal.hh index d5d58e4..7fb0a08 100644 --- a/owlps-positioning/src/outputterminal.hh +++ b/owlps-positioning/src/outputterminal.hh @@ -16,6 +16,7 @@ public: output_stream(_output_stream) {} void write(const Result &result) ; + void write(const ResultList &results) ; } ; #endif // _OWLPS_POSITIONING_OUTPUTTERMINAL_HH_ diff --git a/owlps-positioning/src/positioning.cc b/owlps-positioning/src/positioning.cc index 726ad30..52844a2 100644 --- a/owlps-positioning/src/positioning.cc +++ b/owlps-positioning/src/positioning.cc @@ -4,6 +4,7 @@ #include "frbhmbasic.hh" #include "interlinknetworks.hh" #include "radar.hh" +#include "resultlist.hh" #include "configuration.hh" #include "posexcept.hh" #include "stock.hh" @@ -86,11 +87,10 @@ void Positioning::loop() if (! request) continue ; + ResultList results(&request) ; for (algo = algorithms.begin() ; algo != algorithms.end() ; ++algo) - { - Result res = (*algo)->compute(request) ; - output.write(res) ; - } + results.add((*algo)->compute(request)) ; + output.write(results) ; } } diff --git a/owlps-positioning/src/realposition.cc b/owlps-positioning/src/realposition.cc index 144db02..98d7281 100644 --- a/owlps-positioning/src/realposition.cc +++ b/owlps-positioning/src/realposition.cc @@ -14,8 +14,8 @@ Result RealPosition::compute(const Request &request) Point3D *coordinates = static_cast( calibration_request->get_reference_point()) ; - return Result(&request, *coordinates, name) ; + return Result(*coordinates, name) ; } - return Result(&request, name) ; + return Result(name) ; } diff --git a/owlps-positioning/src/result.cc b/owlps-positioning/src/result.cc index 0929e15..a3f3ea3 100644 --- a/owlps-positioning/src/result.cc +++ b/owlps-positioning/src/result.cc @@ -13,7 +13,6 @@ const Result& Result::operator=(const Result &source) algorithm = source.algorithm ; position = source.position ; - request = source.request ; return *this ; } @@ -23,20 +22,15 @@ bool Result::operator==(const Result &source) const { return algorithm == source.algorithm && - position == source.position && - request == source.request ; + position == source.position ; } std::ostream& operator<<(std::ostream &os, const Result &r) { - if (r.request == NULL) - os << "For an unknown request, the " ; - else - os << "For the following request: " << *(r.request) << "\nThe " ; os - << "result of the algorithm " << r.algorithm + << "The result of the algorithm " << r.algorithm << " is: " << r.position ; return os ; } diff --git a/owlps-positioning/src/result.hh b/owlps-positioning/src/result.hh index 951eaaa..13783a1 100644 --- a/owlps-positioning/src/result.hh +++ b/owlps-positioning/src/result.hh @@ -1,8 +1,6 @@ #ifndef _OWLPS_POSITIONING_RESULT_HH_ #define _OWLPS_POSITIONING_RESULT_HH_ -class Request ; - #include "point3d.hh" #include @@ -12,24 +10,19 @@ class Result { protected: Point3D position ; - Request *request ; std::string algorithm ; public: - Result(const Request *_request = NULL, - const std::string &_algorithm = "UnknownAlgorithm"): - request(const_cast(_request)), algorithm(_algorithm) {} - Result(const Request *_request, const Point3D &_position, - const std::string &_algorithm): - position(_position), request(const_cast(_request)), + Result(const std::string &_algorithm = "UnknownAlgorithm"): algorithm(_algorithm) {} + Result(const Point3D &_position, const std::string &_algorithm): + position(_position), algorithm(_algorithm) {} ~Result(void) {} /** @name Read accessors */ //@{ const std::string& get_algorithm(void) const ; const Point3D& get_position(void) const ; - const Request* get_request(void) const ; //@} /** @name Operators */ @@ -60,12 +53,6 @@ inline const Point3D& Result::get_position() const } -inline const Request* Result::get_request() const -{ - return request ; -} - - /* *** Operators *** */ diff --git a/owlps-positioning/src/resultlist.cc b/owlps-positioning/src/resultlist.cc new file mode 100644 index 0000000..a9492a5 --- /dev/null +++ b/owlps-positioning/src/resultlist.cc @@ -0,0 +1,54 @@ +#include "resultlist.hh" +#include "request.hh" + +using namespace std ; + + + +/* *** Constructors *** */ + + +ResultList::~ResultList() +{ + results.clear() ; +} + + + +/* *** Operators *** */ + + +const ResultList& ResultList::operator=(const ResultList &source) +{ + if (this == &source) + return *this ; + + request = source.request ; + results = source.results ; + + return *this ; +} + + +bool ResultList::operator==(const ResultList &source) const +{ + return + request == source.request && + results == source.results ; +} + + + +ostream& operator<<(ostream &os, const ResultList &r) +{ + if (r.request == NULL) + os << "For an unknown request:\n" ; + else + os << "For the following request: " << *(r.request) << '\n' ; + + vector::const_iterator res ; + for (res = r.results.begin() ; res != r.results.end() ; ++res) + os << *res << '\n' ; + + return os ; +} diff --git a/owlps-positioning/src/resultlist.hh b/owlps-positioning/src/resultlist.hh new file mode 100644 index 0000000..63a453d --- /dev/null +++ b/owlps-positioning/src/resultlist.hh @@ -0,0 +1,76 @@ +#ifndef _OWLPS_POSITIONING_RESULTLIST_HH_ +#define _OWLPS_POSITIONING_RESULTLIST_HH_ + +class Request ; +#include "result.hh" + +#include +#include + +class ResultList +{ +protected: + Request *request ; + std::vector results ; + +public: + ResultList(const Request *_request = NULL, + const std::vector &_results = std::vector()): + request(const_cast(_request)), results(_results) {} + ResultList(const ResultList &source): + request(source.request), results(source.results) {} + ~ResultList(void) ; + + /** @name Read accessors */ + //@{ + const Request* get_request(void) const ; + const std::vector& get_results(void) const ; + //@} + + /** @name Write accessors */ + //@{ + void add(const Result &res) ; + //@} + + /** @name Operators */ + //@{ + const ResultList& operator=(const ResultList &source) ; + bool operator==(const ResultList &source) const ; + bool operator!=(const ResultList &source) const ; + //@} + + /// Displays a ResultList + friend std::ostream& operator<<(std::ostream &os, + const ResultList &r) ; +} ; + + + +/* *** Read accessors *** */ + + +inline const Request* ResultList::get_request() const +{ + return request ; +} + + +inline const std::vector& ResultList::get_results(void) const +{ + return results ; +} + + + + +/* *** Write accessors *** */ + + +inline void ResultList::add(const Result &res) +{ + results.push_back(res) ; +} + + + +#endif // _OWLPS_POSITIONING_RESULTLIST_HH_