/* * This file is part of the Owl Positioning System (OwlPS). * OwlPS is a project of the University of Franche-Comté * (Université de Franche-Comté), France. */ #include "multilaterationalgorithm.hh" #include "minmax.hh" #include "mobile.hh" #include "configuration.hh" #include "posexcept.hh" using namespace std ; using std::tr1::unordered_map ; /* *** Constructors *** */ MultilaterationAlgorithm::MultilaterationAlgorithm(): request(NULL) { // Will be changed when other multilateration methods will be // implemented. if (! Configuration::is_configured("positioning.area-start") || ! Configuration::is_configured("positioning.area-stop")) throw missing_configuration( "You want to use MinMax, but either positioning.area-start or" " positioning.area-stop is not defined!") ; Point3D minmax_start( Configuration::string_value("positioning.area-start")) ; Point3D minmax_stop( Configuration::string_value("positioning.area-stop")) ; multilateration_method = new MinMax(minmax_start, minmax_stop) ; } MultilaterationAlgorithm::~MultilaterationAlgorithm() { delete multilateration_method ; } /* *** Operations *** */ double MultilaterationAlgorithm:: make_constant_term(const Measurement &measurement) { assert(request) ; const Mobile *mobile = request->get_mobile() ; assert(mobile) ; const AccessPoint *ap = measurement.get_ap() ; assert(ap) ; return ap->friis_constant_term() + mobile->get_antenna_gain() + mobile->get_trx_power() ; } Result MultilaterationAlgorithm::compute(const Request &_request) { request = &_request ; compute_ap_distance_circles() ; Point3D position(multilaterate()) ; return Result(request, name, position) ; } void MultilaterationAlgorithm::compute_ap_distance_circles() { ap_distances.clear() ; const unordered_map &measurements = request->get_measurements() ; for (unordered_map::const_iterator i = measurements.begin() ; i != measurements.end() ; ++i) ap_distances[i->second.get_ap()] = estimate_distance(i->second) ; }