#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.minmax-start") || ! Configuration::is_configured("positioning.minmax-stop")) throw missing_configuration( "You want to use MinMax, but either positioning.minmax-start or" " positioning.minmax-stop is not defined!") ; Point3D minmax_start( Configuration::string_value("positioning.minmax-start")) ; Point3D minmax_stop( Configuration::string_value("positioning.minmax-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) ; assert(request->get_mobile()) ; const AccessPoint *ap = measurement.get_ap() ; assert(ap) ; return ap->get_trx_power() + ap->get_antenna_gain() + 20 * log10( static_cast(PosUtil::LIGHT_SPEED) / ap->get_frequency() / (4 * M_PI) ) + request->get_mobile()->get_antenna_gain() ; } Result MultilaterationAlgorithm::compute(const Request &_request) { request = &_request ; compute_ap_distance_circles() ; Point3D position(multilaterate()) ; return Result(position, name) ; } 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) ; }